首页 > 解决方案 > 无法通过 Linux 和 C++ 在串行通信中通过 read() 从设备接收消息

问题描述

我正在尝试通过 Ubuntu18 和 C++ 通过串行通信(RS485)与电机设备通信。

我在下面写了这个 C++ 代码。

#include <iostream>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <cstring>

int main(){
  char *dev = "/dev/ttyUSB0";
  int fd = 0;
  char message[3];
  char reply[1024];

  struct termios oldtio, newtio;
  memset(&oldtio, 0, sizeof(oldtio));
  memset(&newtio, 0, sizeof(newtio));


  //Open COM Port;
  fd = open(dev, O_RDWR | O_NOCTTY);
  if(fd < 0){
    std::cout << "COM Port Error" << std::endl;
    return -1;
  }
  tcgetattr(fd, &oldtio);

  //Serial Settings
  cfsetispeed(&newtio, B115200);
  cfsetospeed(&newtio, B115200);

  newtio.c_iflag = IGNPAR;

  newtio.c_cflag |= CS8;
  newtio.c_cflag |= CREAD;
  newtio.c_cflag &= ~CSTOPB;

  newtio.c_lflag = ICANON;


  tcsetattr(fd, TCSANOW, &newtio);

  //Set Message(This is not real one because it will be too long)
  messages[0] = char(0x02);
  messages[1] = char(0x32);
  messages[2] = char(0x03);

  //Send Message
  write(fd, message, 3);

  //Receive Message
  unsigned int length = 0;
  length = read(fd, reply, 1024);
  std::cout << reply << std::endl;

  //Close Serial Port
  tcsetattr(fd, TCSANOW, &oldtio);
  close(fd);
}

・我添加tcgetattrtcsetattr(24/09/2021)
・修改strlen(message)3

(此串行通信由 ASCII 完成,以 STX(0x02) 开始,以 ETX(0x03) 结束。)

我可以正确发送消息。我通过检查电机工作来验证这一点。但是我无法从自动回复消息的设备接收到消息。详细地说,该过程在下一行停止length = read(fd, reply, 1024)并且不会移动。

我验证了 TxD 和 RxD 灯正确闪烁,因此必须发送回复消息。我可以通过 Python 中的 pySerial 收到回复消息。

此串行通信代码中是否有任何错误?

标签: c++linuxserial-communication

解决方案


推荐阅读