Linux,串口,非缓冲模式

3
我正在尝试在Linux中使用串口组织非阻塞读写功能。这是我拥有的代码: http://pastebin.com/RSPw7HAi
它完全正常工作,但是有缓冲区。这意味着,如果我通过控制台+ CR符号向串口输入,选择检测到新输入,否则,如果我通过简单的Python脚本进行输入,则会缓冲所有符号并等待直到我发送回车符号。
因此,对于下面给出的输入,它仅仅在某个地方缓存符号。
我必须使用USB2Serial转换器连接两台PC。
#!/usr/bin/env python3

import serial

cmd1_state = b'\x3E\x01\x00\x01'

#Selecting serial port for commands to be sent --> /dev/ttyUSB0
serial_0 = serial.Serial('/dev/ttyUSB2');
print("Using serial port ", serial_0.portstr);
serial_0.write(cmd1_state)

# closing serial port
serial_0.close()

所以,有人能告诉我该怎么做吗?我是需要在我的C文件中更改端口开放还是需要用python脚本来完成?我后来使用了flush()方法,但它也没有帮助。 顺便说一句,我已经在Google上搜索了有关fcntl()函数的F_NOCACHE参数。但是!这都是关于BSD和Darwin操作系统的,Linux中并没有这样的东西(fcntl的F_NOACHE参数),据我所看到的。 更新: 看起来我找到了解决方案。
 /* set input mode (non-canonical, no echo,...) */
newtio.c_lflag = 0;

newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 char received */

tcflush(fd, TCIFLUSH);

引用于: http://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

这篇文章将介绍关于使用串口(RS-232)在Unix/Linux环境下进行输入输出的基础知识。它将涵盖一些常见问题,如设置波特率、数据位和校验位等,并提供一些实例来演示如何使用串口。通过这篇文章,您将学习如何使用串口通信,以及在需要时如何进行调试和故障排除。

你能否将解决方案发布为答案并接受它,以便这个问题不再显示为未回答的吗? - dsolimano
1个回答

3

看起来我找到了解决方案。

/* set input mode (non-canonical, no echo,...) */
newtio.c_lflag = 0;

newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 char received */

tcflush(fd, TCIFLUSH);
Taken from : http://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

一个更好(即可移植的)指南是POSIX操作系统串行编程指南。此外,还请参阅正确设置终端模式 - sawdust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接