2016-03-22 4 views
1

Ich versuche derzeit, den PIC32UBL Qt/Linux/Mac-Port über den seriellen Port arbeiten zu lassen. Bisher bekomme ich immer Zeitlimits beim Lesen der seriellen Schnittstelle.Lese-Timeout immer erhalten

Hier ist das vollständige Open Source-Projekt PIC32UBL-qt.

Ich verwende /dev/ttyUSB0 als serielle Schnittstelle, dieser Adapter wurde getestet. Außerdem habe ich verifiziert, dass die Zielschaltung Daten mit einem Logikanalysator an das Host-Programm (PIC32UBL-qt) empfängt/sendet. Außerdem funktioniert es vollständig mit der Windows-Version des PIC32UBL.

Der defekte Teil ist bei comport.cpp:156

unsigned short CComPort::ReadComPort(char* buffer, int MaxLen) 
{ 
    if (serialPort != NULL) 
    { 
    SerialPort::DataBuffer dataBuffer; 

    // Added a catch for timeouts 
    try 
    { 
     serialPort->Read(dataBuffer, MaxLen,10); 

     std::copy(dataBuffer.begin(), dataBuffer.end(), buffer); 
    } 
    catch(std::exception &e) 
    { 

    } 

    return dataBuffer.size(); 
    } 
    return 0; 
} 

So ist die Read immer ein Timeout wirft, verschiedenes Timing versucht (100, 1000): immer Timeout, und auch versucht, unendlich (0): nie raus.

Konnte das Problem damit zusammenhängen, dass die libserial mit Signalhandler arbeitet und ich einen seriellen/usb FTDI-Adapter verwende?

+0

1) Was versucht nur 1 zu lesen Byte? (Was ist 'maxlen') 2) Zuversichtlich Daten empfangen Daten der richtigen Baud, Stopp-Bits, etc? Indem die Ausgangsdaten dieses Ports als eigener Eingang zurückgeschleift werden, kann diese Potentialdifferenz eliminiert werden. – chux

+0

@chux Danke für Ihren Zeiger, geändert für das Lesen von einem Byte zu einer Zeit und es funktioniert perfekt, wird die Antwort einschließlich Arbeitscode Version für diese Funktion. –

Antwort

1

von CHUX Kommentar, ich getestet, indem nur ein Zeichen zu einem Zeitpunkt, zu lesen und es perfekt funktioniert, hier die endgültige Version des Verfahrens im Programm:

unsigned short CComPort::ReadComPort(char* buffer, int MaxLen) 
{ 
    if (serialPort != NULL) 
    { 
    int nCount = 0; 

    while(serialPort->IsDataAvailable() && nCount < MaxLen) 
    { 
     buffer[nCount++] = serialPort->ReadByte(10); 
    } 

    return nCount; 
    } 

    return 0; 
} 
+0

Froh, dass dieses "funktioniert" für Sie, aber es kann sehr ineffizient sein. Es scheint, Code will nicht wirklich warten - zurückgeben, wenn Daten nicht verfügbar sind _now_. Um die Effizienz zu verbessern, sollten Sie einen Befehl verwenden, um zu ermitteln, wie viele Bytes verfügbar sind, um mehr als einen zu erhalten. – chux

+0

@chux Nun, die 'Read' Funktion funktionierte nicht (aus irgendeinem Grund) und dieser Code ist nicht sehr ineffizient, weil es eine Schleife gibt, bis keine Zeichen verfügbar sind oder' MaxLen' erreicht ... –

+0

Ich vermute 'Read()' war "Arbeiten". Es ist nur so, dass Sie nach MaxLen-Bytes und weniger als MaxLen-Bytes gefragt haben, also wartet es und wartet .... IAC, schlagen vor, diese Lösung später zu überprüfen. – chux

Verwandte Themen