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);