Lecture port série LINUX et manipulation de char
ABouras
Messages postés
26
Date d'inscription
Statut
Membre
Dernière intervention
-
ABouras Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
ABouras Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
Bonjour !
Un module (GPS + boussole électronique) envoie par Xbee des informations à une clé USB XStick que j'essaye de récupérer avec un programme en C. Voici mon programme :
Les fonctions :
Le main() :
J'aimerai obtenir, à chaque appel de la fonction readMessage (que je mettrai plus tard dans une boucle ou Thread), voir une des lignes envoyées par le module. Pour info, un message entier envoyé par le module est constitué de 2 ou 3 lignes (selon que le GPS est actif ou non), typiquement :
Seulement, sur le prompteur à l'exécution j'obtiens :
- soit "message : " (le message est vide)
- soit "Reception error ! Serial port closed"
... Bref ça marche pas du tout !
Pouvez-vous m'aider svp ?
Merci d'avance !
Un module (GPS + boussole électronique) envoie par Xbee des informations à une clé USB XStick que j'essaye de récupérer avec un programme en C. Voici mon programme :
Les fonctions :
#include <sys/fcntl.h> #include <unistd.h> #include <errno.h> #include <string.h> #include "serial_port.h" int openSerialPort(const char* DEVICE_PORT) { struct termios options; int file = open(DEVICE_PORT, O_RDONLY | O_NOCTTY | O_NDELAY); if(file == -1){perror("Unable to open the serial port\n");} else {printf("Serial port open successful !\n");} tcgetattr(file, &options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag |= PARENB; options.c_cflag |= PARODD; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; return file; }; bool readMessage(int file, char* message, int nbCharToRead) { int i; char buf[100]; if (file != -1) { i = 0; if (read(file, &buf, sizeof(buf)) > 0) { while(buf[i]!='\n'|| i<nbCharToRead-1) //saut à la ligne ou depassement du nb de char { message[i] = buf[0]; //remplissage de message char par char i++; } message[i] = '\0'; printf("message : %c", message[i]); return true; } else { printf("Reception error !\n"); return false; } } return false; };
Le main() :
int main() { int file; int nbCharToRead = 50; //Taille maximale d'une ligne (toujours < 50 caracteres) bool retRead; char message[nbCharToRead]; const char* DEVICE_PORT = "/dev/ttyUSB1"; //=================================== OPEN SERIAL PORT ===================================// printf("Open serial port ... "); file = openSerialPort(DEVICE_PORT); //=================================== READ SERIAL PORT ===================================// printf("Read serial port ...\n\n"); retRead = readMessage(file, message, nbCharToRead); //====================================== CLOSE FILE =====================================// close(file); printf("Serial port closed\n"); }
J'aimerai obtenir, à chaque appel de la fonction readMessage (que je mettrai plus tard dans une boucle ou Thread), voir une des lignes envoyées par le module. Pour info, un message entier envoyé par le module est constitué de 2 ou 3 lignes (selon que le GPS est actif ou non), typiquement :
Heading: 274 Tilt: 7 Roll: -11 LAT=48.715961 LON=2.203730 SAT=5 PREC=300 CHARS=32386 SENTENCES=275 CSUM ERR=1
Seulement, sur le prompteur à l'exécution j'obtiens :
- soit "message : " (le message est vide)
- soit "Reception error ! Serial port closed"
... Bref ça marche pas du tout !
Pouvez-vous m'aider svp ?
Merci d'avance !
A voir également:
- Lecture port série LINUX et manipulation de char
- Confirmation de lecture whatsapp - Guide
- Télécharger livre de lecture ce2 gratuit pdf - Télécharger - Éducatifs
- Accusé de lecture gmail - Guide
- Télécharger idm gratuitement sans numéro de série - Télécharger - Téléchargement & Transfert
- Linux reader - Télécharger - Stockage
1 réponse
Bonjour, voici mon nouveau code de lecture :
Mais ça ne fonctionne toujours pas, le prompteur affiche :
- soit "L'application s'est terminée par un signal : SIGSEGV"
- soit "Reception error !"
Personne pour m'aider ?
bool readMessage(int file, char* message, int nbCharToRead) { int i; char buf[] = "0"; message[nbCharToRead+1]; if (file != -1) { i = 0; while(buf != "\n") //Tant qu'on ne tombe pas sur un retour à la ligne { if (read(file, &buf, sizeof(buf)) > 0) //On lit dans le fichier et on remplit le message { message[i] = buf[0]; i++; if (i<nbCharToRead) break; } else {printf("Reception error !\n"); return false;} } message[i] = '\0'; //Ajout d'un caractere nul au message printf("message : %c", message[i]); return true; } else {printf("Error while reading file !\n"); return false;} };
Mais ça ne fonctionne toujours pas, le prompteur affiche :
- soit "L'application s'est terminée par un signal : SIGSEGV"
- soit "Reception error !"
Personne pour m'aider ?