Leer un puerto COM en C

Master_Chang Mensajes publicados 30 Fecha de registro   Estado Miembro Última intervención   -  
sambia39 Mensajes publicados 610 Fecha de registro   Estado Miembro Última intervención   -
hola

quiero analizar información enviada por un Arduino por el puerto COM, no dominando bien el C, y acudo a ustedes para que me aconsejen qué comandos usar. sé que Google es mi amigo, pero no entiendo mucho lo que hay en los distintos foros. para info, estoy en Windows 7 y he probado una manipulación similar en batch, pero no hay soluciones adecuadas en ese lenguaje.

gracias

1 respuesta

  1. sambia39 Mensajes publicados 610 Fecha de registro   Estado Miembro Última intervención   50
     
    Hola
    Realmente no hay un comando para hacer en una terminal de Windows y enlazarlo con tu aplicación o incluso manipular para redirigir el flujo hacia tu aplicación o viceversa.
    Lo mejor es escribir una función que te permita comunicarte directamente con el hardware en cuestión, así que debes implementar más o menos una interfaz «causète» con tu hardware que debe tomar:
    -> la dirección del puerto serie
    -> la velocidad de escritura y una variable \"buffer\" para escribir los comandos y recibirlos.

    En resumen, eso daría un ejemplo a continuación que publico y que no está optimizado; el resto de instrucciones es tuyo para hacerlo según tus necesidades y documentarte sobre la estructura «termios» para realmente saber qué quieres hacer, ya que mi ejemplo es utilizado para una aplicación personal, así que ciertos parámetros de configuración del «termios» me son útiles para mi aplicación pero no necesariamente para la tuya.
    hasta pronto

    //libC #include <stdio.h> #include <stdlib.h> //Système #include <unistd.h> #include <termios.h> #include <sys/fcntl.h> #define BUFF 1024 //Fonction connexion void f_ConnexionCom( const char *pCom, const unsigned Baud ){ int flag = 0; struct termios OldT; struct termios NewT; flag = open( pCom, O_RDWR|O_NOCTTY ); if( flag <= 0 ){ printf( "*\tImpossible d'ouvrir le port série\n" ); printf( "*\tAssurer vous que vous avez les droits administrateurs\n" ); perror( "*\tEtat Erreur" ); exit( EXIT_FAILURE ); } /** * Sauvegarde & Creation d'une * nouvelle termios à utiliser **/ tcgetattr( flag, &OldT ); tcgetattr( flag, &NewT ); //Config du termios personaliser (&NewT)->c_iflag = IGNBRK; (&NewT)->c_oflag = 0L; (&NewT)->c_lflag = 0L; (&NewT)->c_cc[VMIN] = 1; (&NewT)->c_cc[VTIME] = 0; (&NewT)->c_cflag |= CREAD; (&NewT)->c_cflag &=~ ( CSIZE|PARENB|CSTOPB|CRTSCTS ); (&NewT)->c_cflag |= CS8; (&NewT)->c_cflag |= CLOCAL; (&NewT)->c_iflag &=~ ( IXON|IXOFF|IXANY ); //Configuration de Baudrate exemple 19200 cfsetispeed( &NewT, Baud ); cfsetospeed( &NewT, Baud ); tcsetattr( flag, TCSANOW, &NewT ); tcflush( flag, TCIFLUSH ); //Allocation variable de commande char *pCmd = (char*)calloc( BUFF, sizeof(char) ); if( pCmd == NULL ){ perror( "Impossible de d'initialiser la variable de commande\n" ); exit( EXIT_FAILURE ); } /** * Envoie de commande sur * le port série/Com * pas optimiser la condition de * sorti ( à refaire ) **/ do{ int ret; //Envoie de la commande printf( "Entrer votre commande\t: "); scanf( "%c", pCmd ); printf("\n"); //Lecture des informations ret = write( flag, pCmd, sizeof(pCmd) ); if( ret ){ printf( "# Attente de lecture.....\n"); ret = read( flag, pCmd, 1 ); if( ret ){ printf("=>Reçut\t:%s\n", pCmd ); pCmd = 0; } if( ret <= 0 ){ printf( "\n *\tAucune donné reçut\n" ); return; } } }while( *pCmd != '@'); //condition de sortie bidon /** * Désalocation & Restitution du * Termios initiale **/ free( pCmd ); tcsetattr( flag, TCSANOW, &OldT); close( flag ); } //Fonction principale int main( void ){ /** * Attention ici j'utilise le terminal * Ctrl+Alt+F1 sous UNIX pour faire ce teste * et je le déconseille. utiliser addr de * votre port serie et assurer vous d'être en mode "su" **/ f_ConnexionCom("/dev/tty1", 19200 ); return ( EXIT_SUCCESS ); } 


    --
    Toute connaissance est une réponse à une question.
    0