Port Série sous Linux: le Blocage de Lecture avec Temporisation
J'ai étudié de nombreux threads et des tutoriels, mais je suis toujours avoir des problèmes avec quelque chose qui devrait être très simple. Pour référence, voici quelques discussions que j'ai lu:
Comment mettre en œuvre un délai d'attente de lecture de l'appel de fonction?
comment faire pour ouvrir, lire, et écrire à partir du port série en C
En tout cas, j'ai un peu un problème. Mon code fonctionne très bien si je recevoir des données. Si je ne le fais pas, read() la fonction stands et la seule façon de sortir de mon programme est à utiliser kill -9 (NOTE: j'utilise de traitement de signal pour signal au fil de la lecture de la série de données à la fin. Ce n'est pas le coupable, read() appel encore étals même si j'ai enlevé mon traitement du signal). Ce que j'essaie de faire est de lire que les blocs et lit un morceau à la fois (donc économie d'utilisation de l'UC), cependant si la lecture ne reçoit pas de données, je wan-il pas de délai d'attente.
Voici les paramètres que j'ai demandé à le port:
struct termios serial_struct;
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial_struct.c_iflag = IGNPAR;
serial_struct.c_oflag = 0;
serial_struct.c_lflag = 0;
serial_struct.c_cc[VTIME] = 1; //timeout after .1s that isn't working
serial_struct.c_cc[VMIN] = 64; //want to read a chunk of 64 bytes at a given time
Je puis définissez ces paramètres avec tcsetattr() et vérifiez que le port a reçu les réglages via tcgetattr(). Je pense que mes paramètres peuvent être contradictoires, parce que mon lit semble être de blocage et d'attendre jusqu'à 64 octets reçus, mais ne font rien en ce qui concerne le délai d'attente. Je comprends que je peux utiliser select() pour faire face à un délai d'attente, mais je suis en espérant éviter les multiples appels système.
Comme toujours, merci d'avance pour l'aide.
OriginalL'auteur It'sPete | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
De homme 3 termios:
Noter que la minuterie n'a pas commencer jusqu'à ce qu'au moins un octet de données est reçu. Après réception de ce premier octet de données, la lecture de délai d'attente si jamais il ya un écart de TEMPS dixièmes de seconde entre la réception de données consécutifs octets.
Oui: Le lien que j'ai cité ci-dessus décrit également "select()". Q: qu'est-Ce que l'appareil?
Je pense que presque tous les programmes éventuellement se développe au point qu'on finit par en (a) à l'aide de
select
oupoll
de multiplex I/O ou (b) gérer des flux séparés avec des threads séparés. Peut que bien se passer.Je suis seulement dans l'espoir d'accomplir la lecture d'un périphérique, d'un seul port série qui est configurable. Un thread gère la lecture à partir du port et de mettre les données dans un endroit où il peut être consulté par les consommateurs. J'espérais éviter de multiples appels système, parce que la lecture se passe dans une boucle. Cependant, si il n'y a pas d'autre moyen de savoir si je suis de données, il semblerait que je vais avoir...
Vous pouvez réduire le nombre d'appels système en définissant le descripteur de non-mode de blocage et ensuite seulement l'appel
select
quandread
retourneEAGAIN
ouEWOULDBLOCK
.OriginalL'auteur Casey