Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Posix read(int fd,void* ptr,int len);

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.01.2008, 14:46 Uhr
twist



Hallo,

vielleicht kann hier mir jemand helfen.

ich hab ein Programm geschrieben, welches unter Linux aus dem serialport nachrichten auslesen soll und in einer Datenbank abspeichern soll.

Das Abspeichern war mittels Qt kein Problem.
Das Lesen aus dem Serial Port allerdings schon.

habe /dev/ttyS0 via ::open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NONBLOCK); geoeffnet. Was auch ohne Probleme von statten ging.

Das Iflag hab ich mit den Optionen " IGNPAR | ICRNL" belegt.

Das CFlag hab ich mit den Optionen " CS8 | CRTSCTS | CREAD | CLOCAL " belegt.

Beim LFlag hab ich " ICANON | ECHO | ECHOE | ISIG " ausgeschlossen..

Auf den geoeffneten Filediscriptor hab ich von Qt den QSocketNotifier angesetzt.
dieser ruft per signal & slot die Read() methode auf.falls Daten am serialport anliegen.

Wenn ich dann aber vom serialport lesen moechte, bekomme ich abundzu, aber nicht immer, bei der read() methode den Fehler :
"Die Ressource ist zur Zeit nicht verfuegbar!"

Was kann da schief gelaufen sein? Es arbeitet zu dieser zeit kein anderer Thread oder Prozess auf dem Localen System, welcher das Port Blockieren koennte.
Zugriffsrechte koennen es auch net sein, weil dieser Fehler nur sporadisch vorkommt.

Quellcode:
open prozedur:

Code:
    printf("CQPosix::open()\n");
    int modelines=0;
    struct termios settings;
    /*�fnen und berprfen des Filedeskriptors*/
    m_Fd=::open(m_Path,O_RDWR | O_NOCTTY | O_NONBLOCK);
    if(m_Fd==-1) {
        fprintf(stderr,"Das Device %s kann nicht geoeffnet werden!\n",m_Path);
        return(false);
    }
    /*Prfe ob Filedeskriptor zu einem Terminal geh�t*/
    if(!isatty(m_Fd)) {
        fprintf(stderr,"Das Device %s ist kein Terminal-Device !\n",m_Path);
        return(false);
    }

    /*Setzen der Inputflags*/
    settings.c_iflag=m_cIFlag;

    /*Setzen der Outputflags*/
    settings.c_oflag=m_cOFlag;         /*Keine besonderen Angaben n�ig*/

    /*Setzen der Controlflags*/
    settings.c_cflag=m_cCFlag;
     //settings.c_cflag &= ~(PARENB | CSTOPB | CSIZE);
    settings.c_cc[VMIN]=1;
    settings.c_cc[VTIME]=0;
    /*Setzen der lokalen Flags*/
    settings.c_lflag &=m_cLFlag; // ~(ICANON | ECHO | ECHOE | ISIG); /*Keine besonderen Angaben n�ig*/  
//     settings.c_lflag &= ~(ICANON | ECHO |  ECHOE | ISIG);
  
    /*Definieren der bertragungsgeschwindigkeit */
    if(m_OutputBautrate!=0) {
        if(cfsetispeed(&settings,m_OutputBautrate)!=0)
        {
            fprintf(stderr,"Fehler:%s !\n",strerror(errno));
            return(false);
        }
    }
    if(m_InputBaudrate!=0) {
        if(cfsetospeed(&settings,m_InputBaudrate)!=0)
        {
            fprintf(stderr,"Fehler: %s !\n",strerror(errno));
            return(false);
        }
    }
    /*uebertragung der Einstellungen an die Schnittstelle*/
    if(tcsetattr(m_Fd,TCSANOW,&settings)==-1)
    {
        fprintf(stderr,"Fehler beim Setzen der Terminalattribute auf  %s !\n",m_Path);
        return(false);
    }

    /*Lesen der IO-Control-Parameter*/
    if(ioctl(m_Fd,TIOCMGET,&modelines)==-1)
    {
        fprintf(stderr,"Fehler bei ioctl TIOCMGET auf  %s!\n",m_Path);
        return(false);
    }

    /*Setzen des RTS-Signals*/
    modelines &= ~TIOCM_RTS;
    if(ioctl(m_Fd,TIOCMSET,&modelines)==-1)
    {
        fprintf(stderr,"Fehler bei ioctl TIOCMSET auf %s !\n",m_Path);
        return(false);
    }
    m_SocNoti=new QSocketNotifier(m_FD,QSocketNotifier::Read);
    connect(m_SocNoti,SIGNAL(readyRead()),this,SIGNAL(readyRead()));
    m_Init=true;
    return true;



ReadFunktion:

Code:
while(gelesen<maxlen & readTest<100) {
        if((result =::read(m_Fd,(void*) (&(rawData[gelesen])), (maxlen-gelesen))) < 0) {
            fprintf(stderr,"!-!Fehler:%s !\n",strerror(errno));
            usleep(2);
        }else {
            int i=0;
            for(;i<result;i++) {
                if(rawData[arPos+i]==36) {
                    if(result<(i+2)) {
                        fail=false;
                        break;
                    }else {
                        if((rawData[(arPos+(i+2))])!=-89) {
                            fail=false;
                            break;
                        }else {
                            printf("Warnung warnung, leere Messsage erhalten!!!!");
                            arPos+=(i+3);
                            i+=3;
                            fail=true;
                        }
                    }
                }else {
                    fail=true;
                }
            }
            gelesen+=result;
            if(fail) {
                gelesen-=i;
                arPos+=i;
            }
        }
        readTest++;
    }


Dieser Post wurde am 18.01.2008 um 14:47 Uhr von twist editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2008, 13:31 Uhr
twist



Kann mir denn keiner helfen?

mfg
Twist
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: