gpt4 book ai didi

c++ - NCurses getch 总是返回 ERR (-1)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:41 25 4
gpt4 key购买 nike

我刚开始使用 ROS,我正在尝试编写一个在主题中发布 key 的节点。

我已经使用 ncurses 在 Linux Ubuntu 16.04.4 上创建了一个节点。

这是我的代码:

#include <curses.h>

#include "ros/ros.h"
#include "std_msgs/String.h"

#include <sstream>

int main(int argc, char **argv)
{
int ch;
nodelay(stdscr, TRUE);

ros::init(argc, argv, "keyboard_driver");

ros::NodeHandle n;

ros::Publisher key_pub = n.advertise<std_msgs::String>("keys", 1);

ros::Rate loop_rate(100);

while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;

if ((ch = getch()) != ERR)
{
ss << ch;
std::cout << ch;
msg.data = ss.str();

ROS_INFO("%s", msg.data.c_str());

key_pub.publish(msg);
}

ros::spinOnce();
loop_rate.sleep();
}

return 0;
}

我正在使用 ncurses 来避免终端缓冲区。

主题出现,但如果在另一个终端中运行此命令,我什么也得不到:

rostopic echo /keys

调试它我发现 getch() 总是返回 -1。

我该怎么做才能让它发挥作用?

更新

我试过这个小程序,它没有打印任何东西:

#include <iostream>
#include <curses.h>

int main(int argc, char **argv)
{
int ch;
cbreak();
nodelay(stdscr, TRUE);

for(;;)
{
if ((ch = getch()) != ERR)
{
std::cout << ch;
}
}

return 0;
}

最佳答案

您已经设置了 nodelay,因此如果终端没有准备好数据,getch 将立即返回 ERR。这就是 getch 返回 -1 (ERR) 的原因。您还没有设置 cbreak 或 raw 来禁用终端缓冲,所以您仍然得到它 - 在 Enter 被击中之前不会有数据来自终端。。 p>

因此,在开始时添加对 cbreak() 的调用(就在调用 nodelay() 之前或之后),它应该会按预期工作。

关于c++ - NCurses getch 总是返回 ERR (-1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com