Effacer le tampon du port série
C'est ce que ma fonction ressemble à ouvrir le port série (Ubuntu 12.04):
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
//Could not open the port.
perror("open_port: Unable to open /dev/ttyUSB0 - ");
}
else
fcntl(fd, F_SETFL, 0);
struct termios options;
tcgetattr(fd, &options);
//setting baud rates and stuff
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
tcsetattr(fd, TCSAFLUSH, &options);
options.c_cflag &= ~PARENB;//next 4 lines setting 8N1
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//options.c_cflag &= ~CNEW_RTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //raw input
options.c_iflag &= ~(IXON | IXOFF | IXANY); //disable software flow control
return (fd);
}
Quel est le problème, c'est que lorsque j'exécute ce programme et si mon périphérique série était déjà branché, la mémoire tampon a un contenu en elle. J'ai besoin d'un moyen d'effacer la mémoire tampon avant que je commence la lecture à partir d'elle. J'ai pensé à l'aide de tcsetattr(fd, TCSAFLUSH, &options);
permettrait de résoudre ce problème, par rinçage à l'OI tampons avant d'initialiser le port, mais pas de chance. Toute idée?
source d'informationauteur capcom | 2012-10-22
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai tout compris. Pour une raison quelconque, j'ai besoin d'ajouter un délai avant rinçage. Ces deux lignes ajoutées avant de retourner
fd
semblent pour avoir fait le tour:La cause de ce problème réside dans l'utilisation d'un port série USB. Si vous utilisez un port série classique, vous n'aurez pas ce problème.
La plupart du port série USB, les pilotes ne prennent pas en charge le rinçage correctement, probablement parce qu'il n'y a aucun moyen de savoir si il y a encore de données à l'interne registre à décalage, FIFO ou dans le sous-système USB.
Voir aussi Greg réponse à un problème similaire signalé plus tôt ici.
Votre
sleep
peut guérir le problème, mais c'est seulement un travail autour de. Malheureusement, il n'existe pas d'autre solution que d'utiliser un port série classique.J'éprouve des symptômes similaires avec un Arduino Uno conseil qui réinitialise sur open(). J'ai été la réception de données après l'open() de l'appel qui a été généré à l'avant de la carte Arduino a été remis à zéro et donc avant de l'ouvrir() a été appelé.
Suivi de la question avec appels ioctl (), j'ai appris que les données avaient tout simplement pas encore arrivé dans la mémoire tampon d'entrée par le temps tcflush() a été appelé. Ainsi, le tcflush() a fait un travail mais il n'y a pas de données pour le rincer. Un sommeil de 1000 à nous après le open() appel a semblé résoudre le problème. C'est parce que le délai autorisé les données arrivent avant tcflush() a été appelé et donc tcflush() a en effet vider le tampon d'entrée.
Vous pouvez rencontrer le même problème.