【问题标题】:Reading HEX values from a serial port (Posix)从串行端口(Posix)读取 HEX 值
【发布时间】:2017-06-29 18:56:50
【问题描述】:

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

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 序列。 这个错误是可重复的,每次我向模块发送给定的命令时。

您有什么意见或建议吗?

【问题讨论】:

  • 这里s_buffer = buff; 你能保证buff 是空终止的吗?
  • 我附加了 buff[rc] = '/0' 但它看起来并没有改变结果。但你确实是对的,我应该这样做。

标签: c++ hex posix


【解决方案1】:

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

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

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

其中 buff 是要转换的字符数组,8 是元素的数量。

感谢 Neil Butterworth 指出了不安全的选角。

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多