3 votes

Linux, port série, mode non tampon

J'essaie d'organiser une fonctionnalité de lecture-écriture sans blocage avec un port série sous Linux. Voici le code que j'ai : http://pastebin.com/RSPw7HAi Tout fonctionne bien, mais il y a une mise en mémoire tampon. Cela signifie que si je fais une entrée en série via le symbole console + CR, select détecte une nouvelle entrée, sinon, si je fais une entrée via le simple script de python, il met en mémoire tampon tous les symboles et attend que je lui envoie le symbole carriage return. Donc avec cette entrée (donnée ci-dessous), il met simplement en mémoire tampon les symboles quelque part. J'ai deux PC connectés via un convertisseur USB2Sériel.

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

Alors, quelqu'un peut-il me dire ce qu'il faut faire ici ? Dois-je changer quelque chose dans l'ouverture du port dans mon fichier C ou cela doit-il être fait avec python script ? J'ai utilisé la méthode flush() par la suite, mais cela n'a pas non plus aidé. BTW, j'ai googlé sur l'arg F_NOCACHE à la fonction fcntl(). MAIS ! il s'agit de BSD et Darwin OS's, il n'y a pas une telle chose (F_NOACHE arg to fcntl) dans Linux, pour autant que je puisse voir.

UPD : On dirait que j'ai trouvé la solution.

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

Tiré de : http://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

3voto

Dmitriy Ugnichenko Points 700

On dirait que j'ai trouvé la solution.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X