现在我在Udoo Neo上用C ++通过UART与设备进行通信。为此,我使用termios设置连接并将数据写入设备。 为此,我想使用硬件流控制并使用termios设置标志(CRTSCTS)。
对于硬件流控制我已将设备RTS线连接到电路板CTS,并且我还通过示波器进行了检查,如果设备没有准备好读取,则该设备正在给我一个高电平有效
问题是我在下面的例子中仍然松散字节,只是用数字向设备发送垃圾邮件,但是电路板输出表明所有内容都写得正确。
我认为在使用硬件流控制时会阻止UART,因此不会丢失任何信息。我没有正确理解这一点 - 或者代码中是否有错误?
感谢您的帮助
const char dev[] = "/dev/ttymxc4";
int main(int argc, char **argv) {
int fd;
struct termios t; ///< control structure for a general asynchronous interface
// edited code
tcgetattr(fd, &t);
t.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
INLCR | PARMRK | INPCK | ISTRIP | IXON);
t.c_oflag = 0;
t.c_cflag &= ~(CSIZE | PARENB);
t.c_cflag |= (CS8 | CRTSCTS);
// edited code
t.c_cflag |= (CLOCAL | CREAD);
t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
t.c_cc[VMIN] = 0;
t.c_cc[VTIME] = 0;
cfsetispeed(&t,B57600); /* normal shall be: B115200 Baud */
fd = ::open(dev, O_RDWR);
if (fd==-1) {
printf("UART: cannot open file: %s\n",dev);
return -1;
}
tcsetattr(fd,TCSANOW, &t);
// edited code
fcntl(fd, F_SETFL, 0);
int count = 0;
while (true) {
count++;
std::stringstream output;
output << count << ",";
::write(fd, output.str().c_str(), output.str().length());
printf("%d, writing: %s\n", fd, output.str().c_str());
usleep(10000);
}
return 0;
}
答案 0 :(得分:0)
参考@sawdust的链接, HW流量控制是通过
进行操作的 CCTS_OFLOW
和CRTS_IFLOW
通过libc-doc
宏:tcflag_t
CCTS_OFLOW
如果设置了此位,则启用基于CTS电线(RS232协议)的输出流控制。
巨集:tcflag_tCRTS_IFLOW
如果设置了此位,则启用基于RTS导线(RS232协议)的输入流控制。
CNEW_RTSCTS
和CRTSCTS
通过SerProgGuide
某些UNIX版本支持使用CTS进行硬件流控制 (清除发送)和RTS(请求发送)信号线。如果 在系统上定义CNEW_RTSCTS或CRTSCTS常量,然后 可能支持硬件流控制。执行以下操作 启用硬件流控制:
options.c_cflag |= CNEW_RTSCTS; /* Also called CRTSCTS */
请注意“ 某些版本... ”和“ ...可能受支持。”
在我特定的交叉编译工具链(Linaro GCC 6.5-2018.12
上,如果我为这些值使用grep表示,CRTSCTS
未记录,但已定义,CCTS_OFLOW
在许多信息文件中,但在没有头文件...
libc/usr/include/bits/termios.h:
174:# define CRTSCTS 020000000000 /* flow control */
如您在评论中所说
...我只是认为这将由内核处理?
我看到的现象是,即使我在设备树({rts,cts}-gpios
或 uart-has-rtscts
)中添加了相关的rts / cts属性,命令{{ 1}}仍返回stty -a -F /dev/ttyS
的报告,这意味着RTS / CTS握手已禁用,因此即使没有用户空间应用程序,这似乎也不是简单的配置。 (内核5.4)