【发布时间】:2018-12-21 21:38:58
【问题描述】:
启动 GPS Ros 节点时,大部分时间从 Raspberry 串行端口读取数据正常,但有时在重新启动后,它无法正确读取数据并一次又一次地溢出相同的字符(总是“?”)。只有在重新编译或重启节点后,它才能重新开始工作。
int main(int argc, char **argv)
{
int fd;
ros::init(argc, argv, "talker");
ros::NodeHandle n;
gps_node::gps_raw gps_data;
ros::Publisher chatter_pub = n.advertise<gps_node::gps_raw>("gps_raw", 100);
ros::Rate loop_rate(1000);
if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
}
if (wiringPiSetup () == -1)
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
}
char input = 0;
while (ros::ok())
{
while (serialDataAvail (fd))
{
input = serialGetchar (fd);
ROS_INFO_STREAM(input);
NazaDecoder.decode(input);
gps_data.gps_sats = round(NazaDecoder.getNumSat());
gps_data.lat = NazaDecoder.getLat();
gps_data.lon = NazaDecoder.getLon();
gps_data.heading = round(NazaDecoder.getHeadingNc());
gps_data.alt = NazaDecoder.getGpsAlt();
chatter_pub.publish(gps_data);
ros::spinOnce();
loop_rate.sleep();
}
}
return 0;
}
【问题讨论】:
-
你确定“?” ROS 不是不能将
(char)-1显示为字符吗?我不太了解串行连接,但如果一端死了,您需要关闭并重新打开链接,这似乎是合理的。 -
我目前无法对其进行测试,但我认为正常、有效的“字符数据流”包括“?”还有……
-
如果您正在读取 GPS 数据,我不希望它都是可打印的字符。你真的应该记录你收到的字节的数字表示。这可能会给你更多的洞察力。
serialGetchar也返回int,而不是char。失败由-1表示,如果您立即转换为char,则它与(有效)字节0xFF无法区分。 -
抱歉,回复晚了,但确实它在失败时正在打印 -1(使用 int 时)。但是我能做些什么呢?是一个 GOTO (到代码开头)重新连接一个足够的解决方案?
标签: c++ raspberry-pi wiringpi