2012-08-02 55 views
2

我试图在Linux中用串口组织nob-blocking读写功能。这里是我有的代码:http://pastebin.com/RSPw7HAi 它一切正常,但它被缓冲。这意味着,如果我通过控制台+ CR符号向串行输入,则选择检测新输入,否则,如果通过简单的python脚本进行输入,它会缓存所有符号并等待,直到发送回车符号。 因此,使用此输入(下面给出),它只是在某处缓存符号。 我必须通过USB2Serial转换器连接Linux,串口,非缓冲模式

#!/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()方法,但它也没有帮助。 顺便说一句,我已经将F_NOCACHE arg转换为fcntl()函数。但!这些都是关于BSD和Darwin操作系统的,在我看来,Linux中没有这样的东西(F_NOACHE arg to fcntl)。

UPD: 看起来我发现了解决方案。

/* 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

+0

您可以将解决方案作为答案发布并接受它,以便此问题不会显示为未答复? – dsolimano 2012-11-05 11:21:59

+0

是的,做到了...... – 2012-11-05 11:35:55

回答

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 
+0

更好的(即便携式)指南是[POSIX操作系统的串行编程指南](http://www.cmrr.umn.edu/~strupp/serial.html)。另请参阅[正确设置终端模式](http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) – sawdust 2015-02-22 23:09:34