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 アダプタを使用していることに関連している可能性がありますか?

4

1 に答える 1

1

chux のコメントにより、一度に 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;
}
于 2016-03-24T15:58:16.110 に答える