[C] Odbieranie danych z portu szeregowego, Linux
Ostatnio zmodyfikowano 2012-03-19 17:23
devaster Temat założony przez niniejszego użytkownika |
[C] Odbieranie danych z portu szeregowego, Linux » 2012-03-18 15:14:10 Witam, Chciałbym napisać program który komunikuje się z mikrokontrolerem za pomocą rs232. Mikrokontroler pobiera dane i buforuje je, aż otrzyma znak powrotu karetki ( \r ). Następnie wypisuje je na wyświetlaczu i odsyła do komputera. Sprawdziłem działanie mikrekontrolera za pomocą CuteCom i wszystko działa prawidłowo. Napisałem dwie proste funkcje: #include <unistd.h> #include <fcntl.h> #include <termios.h> #include <errno.h> #include <stdio.h> #include <sys/ioctl.h> #include "ATCommand.h"
int Open( int fd, char * port ) { struct termios options; fd = open( port, O_RDWR | O_NOCTTY | O_NDELAY ); if( fd < 0 ) { printf( "Blad podczas otwierania portu\n" ); return - 1; } else { tcgetattr( fd, & options ); cfsetispeed( & options, B9600 ); cfsetospeed( & options, B9600 ); options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~CSTOPB; options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); options.c_iflag &= ~( ICRNL | INLCR | IGNCR | IUCLC ); options.c_iflag &= ~( IXON | IXOFF | IXANY ); options.c_oflag &= ~OPOST; tcsetattr( fd, TCSANOW, & options ); printf( "Port otwarty i skonfigurowany\n" ); return fd; } }
void ATI( char * port, char * odpowiedz ) { int fd = 0; int wynik; int bytes; fd = Open( fd, port ); if( fd >= 0 ) { wynik = write( fd, "ATI\r", 4 ); if( wynik > 0 ) { printf( "Wyslano dane\n" ); } else { printf( "Blad wysylania danych\n" ); wynik = 0; } } else { wynik = 0; printf( "Blad otwarcia portu przy wysylaniu danych\n" ); } close( fd ); sleep( 0.5 ); fd = 0; fd = Open( fd, port ); if( fd >= 0 ) { ioctl( fd, FIONREAD, & bytes ); if( bytes > 0 ) { wynik = read( fd, odpowiedz, bytes ); if( wynik > 0 ) { printf( "Pobrano dane" ); } else { printf( "Blad pobierania danych\n" ); wynik = 0; } } else { printf( "Brak danych do pobrania\n" ); wynik = 0; } } else { wynik = 0; printf( "Blad otwarcia portu przy pobieraniu danych\n" ); } close( fd ); } Po wywołaniu ATI(port,bufor); otrzymuje informacje: Port otwarty i skonfigurowany Wyslano dane Port otwarty i skonfigurowany Brak danych do pobrania
Mój program wysyła dane, bo pojawiają się na wyświetlaczu mikrekontrolera, ale nie pobiera danych. Dlaczego mój program nie czyta danych z portu szeregowego ? Pozdrawiam |
|
DejaVu |
» 2012-03-19 09:13:00 Hm?
/edit:
#include <unistd.h>
unsigned int sleep( unsigned int );
|
|
devaster Temat założony przez niniejszego użytkownika |
» 2012-03-19 13:42:56 Rzeczywiście wpisanie liczby innej niż int nie dawała żadnego efektu. Po poprawieniu na sleep( 1 ); Program czeka sekundę. Ale to nie rozwiązuje mojego problemu, program nadal nie czyta danych z portu szeregowego. |
|
DejaVu |
» 2012-03-19 13:48:23 Spróbuj najpierw otworzyć port, a później czekać 1sek na dane.
fd = Open( fd, port ); sleep( 1 );
|
|
devaster Temat założony przez niniejszego użytkownika |
» 2012-03-19 17:23:59 Masz rację, otwarcie portu a następnie czekanie pomogło. Dziękuję za pomoc. |
|
« 1 » |