d'abord, aucune idée pourquoi vous devez d'abord définir tous les champs de termios à 0, puis plus tard, sans aucune modification de ce 0 précède, décider de mettre les drapeaux rs232 habituels sur le cflag. (plutôt que de le faire sans l'OR directement, où vous le mettez maintenant à 0, ci-dessus). Ce qui vous plairait - au lieu de mettre tous ces drapeaux - est juste cfmakeraw() les champs de termios.
également, sync(); sans aucun paramètre (PAS fsync!;) semble envoyer toutes les sorties en attente à TOUS les fichiers de texte, pas seulement les périphériques de bloc. aussi sockets tcp et rs232 ..
et aussi open() a une option O_SYNC (O_SYNC et O_ASYNC ont des noms confus mais n'ont rien à voir avec le protocole de ligne série étant cadencé ou non, celui commente immédiatement write() ' s et l'autre produit un signal de piégeage lorsque l'entrée devient disponible (rs232 base un peu comme IRQ sur dos;)
réglage O_SYNC en plein air() pourrait déjà résoudre votre problème
également « en lisant les données. à l'autre extrémité '... il y a ces choses appelées' leds 'et' résistances 'que vous pouvez simplement connecter à TXD et VOIR les données;) il y a aussi des choses appelées' rs232 breakout box 'ou une portée qui peut le rendre -directement visible-;) beaucoup plus facile que "deviner" quel côté ne se comporte pas correctement.
AVERTISSEMENT: N'A PAS TESTÉ LE CODE. il compile. mais j'ai tous mes câbles ttyUSB0 dans un autre bâtiment. mais je pense que votre problème principal est O_SYNC de toute façon. définir tous les cries termios à 0 est à peu près la même chose que cfmakeraw() ... aussi pourquoi définir CREAD si vous allez l'ouvrir en écriture seule? (pourquoi l'écrire seulement plutôt que readwrite de toute façon?) et aussi avec write seulement vous ne devrez pas avoir peur de devenir un tty de contrôle (O_NOCTTY;) donc dans le cas d'écriture seulement, ce n'est pas vraiment nécessaire non plus .. .
juste remarqué le% i (même pour% d BTW) formatter déclenche également un décalage de type d'avertissement la valeur de retour de ssize_t d'écriture() si casted que pour (int)
#include<termios.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
void main(){
int fd;
struct termios tty;
fd=-1;
while(fd<0){fd=open("/dev/ttyUSB0",O_WRONLY|O_NONBLOCK|O_NOCTTY|O_SYNC);sleep(1);};
cfmakeraw(&tty);
tty.c_cflag=CREAD|CRTSCTS|HUPCL|CS8;
cfsetospeed(&tty,B19200);
cfsetispeed(&tty,B19200);
tcsetattr(fd,TCSANOW,&tty);
printf("Write: %i\n",(int)write(fd,"HELLO",5));
sync();//if all else fails, also try without, O_SYNC should already fix that.
close(fd);
};
Avez-vous vérifié la ' tcsetattr' renvoie la valeur? – jweyrich
tcsetattr renvoie 0 – Ryan
Vous dites "HELLO" ** semble ** à envoyer lorsque la fonction write() est appelée Comment est-ce que vous établissez exactement? Etes-vous sûr qu'il n'est pas envoyé immédiatement? et l'appareil ne traite tout simplement pas t? –