【问题标题】:WiringPi C++ serial function randomly stop workingWiringPi C++串口函数随机停止工作
【发布时间】: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


【解决方案1】:

我找到了一个可行的解决方案,通过失败重新打开串行端口。

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;

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2014-04-11
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多