Серийная функция WiringPi C ++ случайно перестает работать - PullRequest
0 голосов
/ 22 декабря 2018

При запуске GPS Ros Node чтение из последовательного порта 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;
}

1 Ответ

0 голосов
/ 23 декабря 2018

Я нашел рабочее решение, открыв последовательный порт по ошибке.

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;
...