[英]Receive extra null byte when using serial port
我正在为Linux上的串行端口数据传输编写程序,但是发现发送方每次打开端口时,接收方都会得到一个额外的空字节'\\x00'
。
这是发件人的代码:
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
int main(int argc, char* argv[]) {
int fd_com_ = open("/dev/ttyAM0", O_RDWR | O_NOCTTY | O_NONBLOCK);
struct termios attrs_;
attrs_.c_iflag = IGNBRK;
attrs_.c_oflag = 0;
attrs_.c_cflag = (CLOCAL | CREAD);
attrs_.c_cflag |= CS8;
attrs_.c_lflag = 0;
attrs_.c_cc[VMIN] = 0;
attrs_.c_cc[VTIME] = 0;
cfsetspeed(&attrs_, B115200);
tcsetattr(fd_com_, TCSANOW, &attrs_);
const char *s = "abcd";
write(fd_com_, s, 4);
sleep(1);
write(fd_com_, s, 4);
sleep(1);
close(fd_com_);
fd_com_ = open("/dev/ttyAM0", O_RDWR | O_NOCTTY | O_NONBLOCK);
write(fd_com_, s, 4);
return 0;
}
接收者具有相同的配置,但是接收到"\\x00abcdabcd\\x00abcd"
。 如何解决此问题,以便接收者可以获取"abcdabcdabcd"
?
更新:
接收方代码:
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
int main(int argc, char* argv[]) {
int fd_com_ = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
struct termios attrs_;
attrs_.c_iflag = IGNBRK;
attrs_.c_oflag = 0;
attrs_.c_cflag = (CLOCAL | CREAD);
attrs_.c_cflag |= CS8;
attrs_.c_lflag = 0;
attrs_.c_cc[VMIN] = 0;
attrs_.c_cc[VTIME] = 0;
cfsetspeed(&attrs_, B115200);
tcsetattr(fd_com_, TCSANOW, &attrs_);
char buf[100];
ssize_t sz;
while(1) {
sz = read(fd_com_, buf, 100);
if (sz > 0) {
for (ssize_t i=0; i<sz; i++) {
printf("%02hhx\n", buf[i]);
}
}
sleep(1);
}
return 0;
}
请检查ARM板的文档,以了解如何连接ARM的UART,以及如何在硬件中以及通过平台驱动程序对其进行配置。
根据您的描述,我假设在打开ARM上的UART端口时,已启用物理UART(即ARM内的硬件外围模块或也许是外部连接的UART芯片)或从某些未知的空闲状态恢复到了UART。 RS232的正确-12伏空闲状态。 此晶体管转移可能足以使您的PC的UART识别起始位并接收虚假字符。
您可能需要使用示波器检查串行线,以查看实际打开端口时发生的情况。
初始\\x0
表示发生奇偶校验或成帧错误。 发生此错误是因为termios字段未正确设置。 因此初始行的高/低状态以及开始/停止位数和奇偶校验设置不正确。
您可能会阅读: http : //man7.org/linux/man-pages/man3/termios.3.html ,其中讨论了每个字段及其内容和含义。
(链接的页面太长了,无法在此处发布)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.