C++ 从串行端口(Posix)读取十六进制值

C++ 从串行端口(Posix)读取十六进制值,c++,hex,posix,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);

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

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;
}
请注意,ISTRIP位设置为0,不丢失第8位

我得到的资源“几乎”是正确的。 我用的是AA B4 04 01 00 00 94序列,但我得到的是AA B4 04 01 00 A8 4A F0序列。 每次我向模块发送给定命令时,此错误都会重复


你有什么建议吗?

经过思考,我发现我不能简单地转换string=char*

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

std::string check(reinterpret_cast<char*>(buff), 8);
std::字符串检查(重新解释cast(buff),8);
其中buff是要转换的字符数组,8是元素数


感谢尼尔·巴特沃斯,他指出了不安全的铸造。

这里
s\u buffer=buff
您是否保证
buff
以null结尾?我添加了buff[rc]='/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;
 }
std::string check(reinterpret_cast<char*>(buff), 8);