从串口(Posix)

时间:2017-06-29 18:56:50

标签: c++ hex posix

我写了一个类来处理从模块到串口的数据。 目标是让端口始终监听,并在需要时传输一些消息。 模块使用十六进制令牌进行通信。 这是接收部分的代码:

int serial::serial_receive (string &s_buffer, int &rcp)
{
  struct pollfd fds[1];
  fds[0].fd = ptr;
  fds[0].events = POLLIN ;
  int pollrc = poll( fds, 1, 1000);
  if (pollrc < 0)
  {
    perror("poll");
  }
  else if( pollrc > 0)
  {
    if( fds[0].revents & POLLIN )
    {
      char buff[1024];
      ssize_t rc = read(ptr, buff, sizeof(buff) );
      if (rc > 0)
      {
        s_buffer = buff;
        rcp = rc;
       }
        else {cout << "error reading fd";}
    }

}
return pollrc;
}

在我的测试主编中:

using namespace std;
char test[] = {0xAA,0x34,0x00,0x22};

int main(void) {
    stringstream ss;
    const char* mybuff;
    string serial_buffer;
    int rcl;

    serial mymodule ("/dev/ttymxc5",115200, 0);  //port configuration

    ss << std::hex << setfill('0');
    mymodule.serial_send(test,4);                //send method
    usleep(2000);

    mymodule.serial_receive(serial_buffer,rcl);  //receive method

    mybuff = serial_buffer.c_str();
        for (int i = 0; i < 8; ++i)
        {
            ss << std::setw(2) << static_cast<unsigned>(mybuff[i]);
        }
    cout << ss.str() << endl;

return 0;
}

我的串口配置是:

int serial::serial_set()
{
  struct termios options;
  if (tcgetattr (ptr, &options) != 0)
              {
                      return EXIT_FAILURE;
              }
   cfsetospeed (&options, B115200);
   cfsetispeed (&options, B115200);
   options.c_cflag = (options.c_cflag & ~CSIZE) | CS8;
   options.c_iflag &= ~IGNBRK;
   options.c_lflag = 0;
   options.c_oflag = 0;
   options.c_cc[VMIN]  = 0;
   options.c_cc[VTIME] = 5;
   options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR |    ICRNL | IXON);
   options.c_cflag |= (CLOCAL | CREAD);
   options.c_cflag &= ~(PARENB | PARODD);
   options.c_cflag |= serial_parity;
   options.c_cflag &= ~CSTOPB;
   options.c_cflag &= ~CRTSCTS;
   if (tcsetattr (ptr, TCSANOW, &options) != 0)
      {
       return EXIT_FAILURE;
      }
return EXIT_SUCCESS;
 }

请注意,ISTRIP位设置为0,不会丢失第8位。

我得到的结果“几乎”正确。 我正在考虑AA B4 04 01 00 00 00 94序列,但我获得了AA B4 04 01 00 A8 4A F0序列。 每次我向模块发送给定命令时,这个错误都是可重复的。

你有可能有一些注意或建议吗?

1 个答案:

答案 0 :(得分:0)

经过一番思考,我发现我不能简单地投射string = char *。

我使用字符串方法来构建我的字符串:

std::string check(reinterpret_cast<char*>(buff), 8);

其中buff是要转换的char数组,8是元素数。

感谢Neil Butterworth指出了不安全的演员。