2012-08-02 3 views
2

Linux에서 직렬 포트로 nob 블로킹 읽기 - 쓰기 기능을 구성하려고합니다. 여기에 코드가 있습니다 : http://pastebin.com/RSPw7HAi 모두 잘 작동하지만 버퍼링됩니다. 즉, 콘솔 + CR 기호를 통해 직렬로 입력하면 select는 새로운 입력을 감지하고, 그렇지 않으면 간단한 파이썬 스크립트를 통해 입력을 수행하면 모든 기호를 버퍼링하고 캐리지 리턴 기호를 보낼 때까지 대기한다는 것을 의미합니다. 이 입력 (아래에 있음)은 단순히 기호를 어딘가에 버퍼링합니다. 나는 아무도 여기에 무엇을 말해 줄 수,리눅스, 직렬 포트, 비 - 버퍼링 모드

#!/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() 

그래서 USB2Serial 컨버터를 통해 연결된 PC에 있나요? 내 C 파일에서 포트 열기 내에서 뭔가를 변경해야합니까, 아니면 파이썬 스크립트로 끝내야합니까? 나중에 flush() 메서드를 사용했지만 도움이되지 않았습니다. BTW, fcntl() 함수에 F_NOCACHE arg에 대해 살펴 보았습니다. 그러나! BSD와 Darwin OS에 관한 모든 것입니다. 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

+0

그래, 끝냈어 .... –

답변

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