c++ - WiringPi C++串口函数随机停止工作
问题描述
启动 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;
}
解决方案
通过失败重新打开串行端口,我找到了一个可行的解决方案。
if (wiringPiSetup () == -1)
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
}
REINIT:if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
}
int input = 0;
while (ros::ok())
{
while (serialDataAvail (fd))
{
input = serialGetchar (fd);
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();
if(input==-1){
goto REINIT;
}
}
}
return 0;
推荐阅读
- c - 如何计算c中的反模指数?
- google-apps-script - 如何防止自定义排序脚本吃掉标题行?
- html - 将 css 对齐到中间的问题
- php - $this->image_lib->resize(); 返回假
- flutter - 在状态更改时重置 Flutter CustomScrollView
- java - Appium - Java - Android:eclipse自动建议中没有出现toggleWifi方法?
- mysql - 如何编写动态查询以从 excelsheet 使用动态插入语句创建表?
- r - 使用 lapply 函数和文件 RDS RData 合并多个数据帧
- python - 如何在保持字符串文字原样的同时解析 Python 代码?
- json - 如何使用 jolt 规范在 json 中将键转换为值和值到键?