Dans mon programme, je lis depuis le périphérique série (Linux, 8N1) sans aucun problème. Mais dans le cas où je veux écrire un seul octet, je n'ai rien sur l'interface. Je suppose que mes paramètres de sortie série sont erronés. Mais il n'y a pas que beaucoup de façons comment mettre c_oflag ...Périphérique série: Lecture 8N1 fonctionne, mais l'écriture d'un seul octet échoue
Mon code:
#define TTYDEVICE "/dev/ttyS0"
#define BAUDRATE B9600
int openSerialDevice(const char* devTTY, struct termios oldTio) {
//----< Open serial device >----------------------------------
int fileDescriptor;
// fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
fileDescriptor = open(devTTY, O_RDWR | O_NOCTTY);
//fileDescriptor = open(devTTY, O_RDWR | O_NOCTTY /*| OPOST*/);
if (fileDescriptor == -1) {
perror("Error while opening serial interface occurred!");
return -99;
}
// set new parameters to the serial device
struct termios newtio;
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
// set to 8N1
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
newtio.c_iflag = IGNPAR;
// output mode to
//newtio.c_oflag = 0;
newtio.c_oflag |= OPOST;
/* set input mode (non-canonical, no echo,...) */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 10; /* inter-character timer 1 sec */
newtio.c_cc[VMIN] = 0; /* blocking read disabled */
tcflush(fileDescriptor, TCIFLUSH);
if (tcsetattr(fileDescriptor, TCSANOW, &newtio)) {
perror("could not set the serial settings!");
return -99;
}
//----</Open serial device >----------------------------------
return fileDescriptor;
}
int ACK[1] = { 6 };
int main() {
// old termios to restablish
struct termios oldTIO;
// filedescriptor
int fd;
fd = openSerialDevice(TTYDEVICE, oldTIO);
if ((fd == -1) | (fd == -99)) {
perror("Could not open TTY-Device. Exit on failure!");
return EXIT_FAILURE;
}
write(fd, ACK, 1); // Problem !!
return 0:
}
Maintenant, si j'utilise
écran/dev/ttyS1 9600 8N1
pour vérifier ce qui sort sur/dev/ttyS0. Je ne peux rien voir. Pareil si je renifle avec Docklight 1.8.
Des suggestions? merci
convenu. RTSCTS signifie établissement de liaison de matériel, qui n'est normalement pas utilisé pour 9600n81. Cela ne fonctionne que si les lignes sont également déclenchées par la partie compteur. La connexion de RTS et de CTS dans le matériel devrait également faire fonctionner le même programme, ou le connecter avec un câble (null-modem) approprié à un autre PC, et n'oubliez pas de configurer aussi le handshake RTS/CTS. – Adriaan