c++ - 无法通过 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);
}
・我添加tcgetattr
和tcsetattr
(24/09/2021)
・修改strlen(message)
为3
(此串行通信由 ASCII 完成,以 STX(0x02) 开始,以 ETX(0x03) 结束。)
我可以正确发送消息。我通过检查电机工作来验证这一点。但是我无法从自动回复消息的设备接收到消息。详细地说,该过程在下一行停止length = read(fd, reply, 1024)
并且不会移动。
我验证了 TxD 和 RxD 灯正确闪烁,因此必须发送回复消息。我可以通过 Python 中的 pySerial 收到回复消息。
此串行通信代码中是否有任何错误?
解决方案
推荐阅读
- python - 如何使用 Pandas 创建日期(天)间隔
- swift - instagram 故事布局集合视图 swift - 以编程方式
- ruby-on-rails - CarrierWave 在非常简单的步骤中不起作用
- javascript - 如何将一个组件覆盖在另一个之上
- html - css:绝对定位的 div 在父级中具有错误的大小
- reactjs - 如何使用 Django Rest Framework/React 创建安全令牌身份验证?
- javascript - 如何运行事件处理程序事件?
- python - 我可以在 Python 设置中包含其他软件的安装吗?
- ios - 点击特定项目时 TableView 无法检测到
- r - 将行名重置为特定格式 - 使代码更高效