2016-03-22 24 views
1

Şu anda seri portla çalışan PIC32UBL Qt/Linux/Mac portunu yapmaya çalışıyorum. Şimdiye kadar seri portu okurken zaman aşımına uğruyorum.Daima zaman aşımına uğradı

İşte tam PIC32UBL-qt açık kaynak projesi.

Seri bağlantı noktası olarak /dev/ttyUSB0 kullanıyorum, bu bağdaştırıcı test edildi. Ayrıca, hedef devrenin bir mantık analizörü ile ana programa (PIC32UBL-qt) veri gönderip aldığını doğruladım. Ayrıca tamamen PIC32UBL'ın Windows sürümü ile çalışıyor.

arızalı kısmı 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; 
} 

Yani Read hep bir zaman aşımı atar de, farklı zamanlama (100, 1000) çalıştı ise: Her zaman aşımı ve ayrıca denenmiş sonsuz (0): çıkmayınt.

Sorun, libserial'un sinyal işleyicisi ile çalıştığından ve seri/usb FTDI bağdaştırıcısı kullanmayla ilgili olabilir mi? chux yorumuna göre

+0

1) Ne sadece 1 okumaya çalışıyorum hakkında bayt? (Maxlen nedir?) 2) Doğru veri, doğru baud, bit, vb. Verileri alıyor? Bu portun çıkış verisini kendi girişi olarak geri alarak potansiyel farkı ortadan kaldırabilir. – chux

+0

@chux İşaretçiniz için teşekkürler, bir defada bir bayt okumak için değişti ve mükemmel çalışıyor, bu işlev için çalışma kodu sürümü de dahil olmak üzere yanıtı yayınlayacaktır. –

cevap

1

, bir kerede yalnızca bir karakter okuyarak test edilmiş ve burada programda yöntemin son sürümüdür mükemmel çalışıyor:

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

Bu "işler" sizin için sevindim, yine de çok verimsiz olabilir. Görünüşe göre kod gerçekten beklemek istemiyor - veri mevcut değilse iade edin _now_. Verimliliği artırmak için, bir seferde birden fazla bayt elde etmek için kaç baytın mevcut olduğunu sorgulamak için bir komut kullanmayı düşünün. – chux

+0

@chux "Read" işlevi çalışmıyor (bazı nedenlerden dolayı) ve bu kod çok verimsiz çünkü karakter mevcut olmadıkça veya "MaxLen" e ulaşana kadar ... –

+0

'Read() 'idi "Çalışma". Sadece "MaxLen" baytını ve "MaxLen" baytından daha azını istediniz, bu yüzden bekler ve bekler .... IAC, Bu çözümü daha sonra gözden geçirmeyi öner. – chux

İlgili konular