Linux, последовательный порт, режим без буферизации

Я пытаюсь организовать функцию блокировки чтения-записи с последовательным портом в Linux. Вот код, который у меня есть: http://pastebin.com/RSPw7HAi Все работает нормально, но в буфере . Это означает, что если я ввожу в последовательный порт через консоль + символ CR, select обнаруживает новый ввод, в противном случае, если я делаю ввод через простой скрипт python, он буферизует все символы и ждет, пока я не пришлю ему символ возврата каретки. Таким образом, с помощью этого ввода (приведенного ниже) он просто где-то буферизует символы. У меня к ПК подключены через конвертер USB2Serial

#!/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 о аргументе F_NOCACHE для функции fcntl (). НО! Все дело в BSD и ОС Дарвина, насколько я мог видеть, в Linux такого нет (аргумент F_NOACHE для 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


person Dmytro Uhnichenko    schedule 02.08.2012    source источник
comment
Можете ли вы опубликовать решение в качестве ответа и принять его, чтобы этот вопрос не остался без ответа?   -  person dsolimano    schedule 05.11.2012


Ответы (1)


Похоже, я нашел решение.

/* 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
person Dmytro Uhnichenko    schedule 05.11.2012