2016-03-22 4 views
1

現在、シリアルポートで動作するPIC32UBL Qt/Linux/Macポートを作成しようとしています。これまでのところ、私はシリアルポートを読んでいる間は常にタイムアウトに陥りました。常にタイムアウトを取得します

ここには完全なPIC32UBL-qtオープンソースプロジェクトがあります。

私は/dev/ttyUSB0をシリアルポートとして使用しています。このアダプタはテストされています。また、ターゲット回路がロジックアナライザを使用してホストプログラム(PIC32UBL-qt)にデータを送受信していることを確認しました。また、PIC32UBLのWindows版と完全に連携しています。出ることはありません:

不良部品が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; 
} 

であるのでReadは常にタイムアウトをスローし、異なるタイミング(100、1000)試してみました:(0)常にタイムアウトを、そしてまた無限みました。

libserialがシグナルハンドラで動作していて、シリアル/ USB FTDIアダプタを使用していますか? chuxさんのコメントによって

+0

1)どのようなだけ1を読み取ろうとする程度バイト? (maxlenとは何ですか?)2)自信を持ったデータが正しいボー、ストップビットなどのデータを受信して​​いますか?このポートの出力データを独自の入力としてループバックすることで、その電位差を排除することができます。 – chux

+0

@chuxポインタをありがとう、一度に1バイトを読むために変更され、それは完全に動作しています、この関数の作業コードバージョンを含む答えを投稿します。 –

答えて

1

は、私は一度に1文字を読み取り、それが完璧に働いていることにより、テスト、ここでは方法の最終版は、プログラムである:

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

これはあなたのために「うまくいく」とうれしいですが、非常に非効率的かもしれません。コードが実際に待っているとは思わない - データが利用できない場合に戻る。効率を向上させるために、一度に複数のバイトを取得できるバイト数を調べるコマンドを使用することを検討してください。 – chux

+0

@chuxまあ、 'Read'関数が何らかの理由で動作していなかったので、このコードは利用可能な文字やMaxLenに達するまでループしますので、あまり効率的ではありません。 –

+0

' Read() 'が"ワーキング"。あなたが 'MaxLen'バイトを要求し、' MaxLen'バイトよりも小さいバイトが利用可能であったので、それは待っています、そして待っています.... IAC、後でこの解決策を見直すことを提案する。 – chux

関連する問題