打开设备时,Linux串口缓冲区不为空
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了打开设备时,Linux串口缓冲区不为空,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1531字,纯文字阅读大概需要3分钟。
内容图文
![打开设备时,Linux串口缓冲区不为空](/upload/InfoBanner/zyjiaocheng/966/c65a8ffc68b94e2583f581db641fc410.jpg)
我有一个系统,我看到串行端口的奇怪行为,我不期望.我以前曾经看过这个有usb到串口的适配器,但现在我也在原生串口上看到它,频率更高.
系统设置为运行自动化测试,并且首先执行一些任务,这些任务会导致从串行设备输出大量数据,而我没有打开端口.该设备也将自行重置.仅连接tx / rx线.没有流量控制.
完成这些任务后,测试软件会打开串行端口并立即失败,因为它会收到意外响应.当我重现这一点时,我发现如果我在终端程序中打开串口,我会看到几千字节的旧数据(当端口关闭时似乎已经发送)立即刷新.关闭此程序后,我可以按预期运行测试.
什么可能导致这种情况发生?当设备关闭时,Linux如何处理缓冲串口?如果我打开一个设备,让它发送输出,然后关闭它而不读取它,这会导致同样的问题吗?
解决方法:
即使没有打开,Linux终端驱动程序也会缓冲输入.这可能是一个有用的功能,特别是如果速度/奇偶校验/等.设置得当.
要复制较小操作系统的行为,请在打开时立即从端口读取所有挂起的输入:
...
int fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0)
exit (1);
set_blocking (fd, 0); // disable reads blocked when no input ready
char buf [10000];
int n;
do {
n = read (fd, buf, sizeof buf);
} while (n > 0);
set_blocking (fd, 1); // enable read blocking (if desired)
... // now there is no pending input
void set_blocking (int fd, int should_block)
{
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (fd, &tty) != 0)
{
error ("error %d getting term settings set_blocking", errno);
return;
}
tty.c_cc[VMIN] = should_block ? 1 : 0;
tty.c_cc[VTIME] = should_block ? 5 : 0; // 0.5 seconds read timeout
if (tcsetattr (fd, TCSANOW, &tty) != 0)
error ("error setting term %sblocking", should_block ? "" : "no");
}
内容总结
以上是互联网集市为您收集整理的打开设备时,Linux串口缓冲区不为空全部内容,希望文章能够帮你解决打开设备时,Linux串口缓冲区不为空所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。