Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Odbieranie danych z portu szeregowego, Linux

Ostatnio zmodyfikowano 2012-03-19 17:23
Autor Wiadomość
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:
C/C++
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <stdio.h>
#include <sys/ioctl.h> /* Dla ioctl */
#include "ATCommand.h"

// Wlasne funkcje
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 {
        /* Getting the current settings for the port */
        tcgetattr( fd, & options );
       
        /* Setting baudrate (19200) */
        cfsetispeed( & options, B9600 );
        cfsetospeed( & options, B9600 );
       
        options.c_cflag &= ~CSIZE; /* Wylaczenie maski bitowej */
        options.c_cflag |= CS8; /* Osiem bitow danch */
        options.c_cflag &= ~CSTOPB; /* 1 bit stopu */
        options.c_cflag |= PARENB; /* Wlacz kontrole parzystosci */
        options.c_cflag &= ~PARODD; /* even parity */
       
        options.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); /* raw input (bez przetwarzania) */
       
        options.c_iflag &= ~( ICRNL | INLCR | IGNCR | IUCLC ); /* Wylaczenie mapowania */
        options.c_iflag &= ~( IXON | IXOFF | IXANY ); /* Wylaczenie kontroli przeplywu */
       
        options.c_oflag &= ~OPOST; /* Bez przetwarzania danych wyjsciowych */
       
        /* Setting the new settings for the port immediately */
        tcsetattr( fd, TCSANOW, & options );
        printf( "Port otwarty i skonfigurowany\n" );
        return fd;
    }
}

void ATI( char * port, char * odpowiedz )
{
    int fd = 0; /* File descriptor */
    int wynik; /* Wynik operacji na pliku */
    int bytes; /* Ilosc bajtow gotowych do odebrania */
   
    fd = Open( fd, port ); /* Otwarcie portu */
   
    /* Wyslanie danych */
    if( fd >= 0 ) {
        wynik = write( fd, "ATI\r", 4 ); /* \r to <CR> */
        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 ); /* Czekanie na odpowiedz układu */
   
    fd = 0;
    fd = Open( fd, port ); /* Otwarcie portu */
   
    /* Odebranie danych z urzadzenia */
    if( fd >= 0 ) {
        ioctl( fd, FIONREAD, & bytes ); /* Pobranie infiracji o ilosci bajtow czekajacych po pobrania */
        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
P-52854
DejaVu
» 2012-03-19 09:13:00
Hm?
C/C++
sleep( 0.5 );

/edit:
C/C++
#include <unistd.h>

unsigned int sleep( unsigned int );
P-52922
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 ); /* Czekanie na odpowiedz układu */

Program czeka sekundę. Ale to nie rozwiązuje mojego problemu, program nadal nie czyta danych z  portu szeregowego.
P-52927
DejaVu
» 2012-03-19 13:48:23
Spróbuj najpierw otworzyć port, a później czekać 1sek na dane.
C/C++
fd = Open( fd, port );
sleep( 1 );
P-52928
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.
P-52934
« 1 »
  Strona 1 z 1