C-某些strtok调用中的分割故障



这是在循环中运行的功能。基本上,该应用程序从Arduino接收一条消息,并将消息发送到此功能:

void parseMessage(char *message){
    char *sensor_num="";
    char *value="";
    char *percentage="";
    char *delimiter = "|";
    sensor_num = strtok(message , delimiter);
    value = strtok(NULL, delimiter);
    percentage = strtok(NULL, delimiter);
    // Do stuff with values
}

它一直在运行一段时间,但有时我会在value = strtok(NULL, delimiter);部分上得到segfault。

到达的消息就像:

1|123|50|

和调用parseMessage

的主要功能
int main() {
  SYS_LOG_INFO("Opening device... ");
  int BLUETOOTH = open("/dev/tty.HC-05-DevB", O_RDONLY | O_NOCTTY | O_NONBLOCK);
  SYS_LOG_INFO("Opened!");
  struct termios tty;
  struct termios tty_old;
  memset (&tty, 0, sizeof tty);
  /* Error Handling */
  if (tcgetattr(BLUETOOTH, &tty) != 0) {
    SYS_LOG_ERROR("Error on read Bluetooth.");
    return 1;
  }
  /* Save old tty parameters */
  tty_old = tty;
  /* Set Baud Rate */
  cfsetospeed (&tty, (speed_t)B9600);
  cfsetispeed (&tty, (speed_t)B9600);
  /* Setting other Port Stuff */
  tty.c_cflag     &=  ~PARENB;        // Make 8n1
  tty.c_cflag     &=  ~CSTOPB;
  tty.c_cflag     &=  ~CSIZE;
  tty.c_cflag     |=  CS8;
  tty.c_cflag     &=  ~CRTSCTS;       // no flow control
  tty.c_cc[VMIN]  =   1;
  tty.c_cc[VTIME] =   5;
  tty.c_cflag     |=  CREAD | CLOCAL; // turn on READ & ignore ctrl lines
  /* Make raw */
  cfmakeraw(&tty);
  /* Flush Port, then applies attributes */
  tcflush(BLUETOOTH, TCIFLUSH);
  if ( tcsetattr ( BLUETOOTH, TCSANOW, &tty ) != 0) {
    SYS_LOG_ERROR("Error on flush port.");
    return 1;
  }
  int n = 0;
  char buf[255];
  SYS_LOG_INFO("Starting to read data...");
  do {
    n = read(BLUETOOTH, &buf, sizeof buf);
    if (n > 0) {
      printf("buf = %sn", buf);
      parseMessage(buf);
      memset(&buf, '', sizeof buf);
    }
    usleep(500000);  /* sleep for 100 milliSeconds */
  } while(1);
  return 0;
}

1.AS strtokparseMessage中被调用,buf应该是nul-entinate,如果没有,则可能会出现分段故障。在下面尝试代码:

char buf[255]={0};
SYS_LOG_INFO("Starting to read data...");
n = read(BLUETOOTH, &buf, sizeof(buf)-1);
if (n > 0) {
  buf[n]=0;
  printf("buf = %sn", buf);
  parseMessage(buf);
}

2。strtok不是重新进入的,而是使用strtok_r。有时,这可能会导致奇怪的问题。

我从Arduino接收一些不一致的数据。

所以,我解决了与正则拨号一起检查数据的问题,然后将其发送到解析。

谢谢你们

相关内容

  • 没有找到相关文章

最新更新