0

WindowsとLinuxでCOMポートの読み取りと書き込みの両方を作成し、HOSTにリンクした同じハードウェアを使用しました。

Linux では、次のコードを使用して、HOST からハードウェアへの COM ポート書き込みを実現します。これwriteは Linux api です。

DWORD l1_SerWrite(const BYTE *pbData, DWORD dwLen) {
  DWORD dwRet = write(g_hDevice, pbData, dwLen);
  tcdrain(g_hDevice);
  return dwRet;
}

Windowsでは、以下のコードを使用しますWriteFile.winapiです:

DWORD l1_SerWrite(const BYTE *pbData, DWORD iLen) {
  DWORD dwNumBytesWritten;
  WriteFile(g_hPort, pbData, iLen, &dwNumBytesWritten, NULL);
  return dwNumBytesWritten;
}

プログラムのテスト中に、Windows ではいつでもハードウェアにデータを書き込めることがわかりましたが、Linux では常に失敗しますが、ハードウェアにデータを書き込めることもあります。また、スコープを使用して BUS からの波形をキャッチします。Windows と Linux の両方で、データが既に HOST によって送信されていることを確認できます。

純粋な 9 ピン COM ケーブルを使用した場合、Windows は問題ありませんが、Linux はデータの取得に失敗することがありますが、USB2Serial ケーブルを使用した場合、Linux はホスト プログラムで動作します。

アップデート:

Linux では、COM ポートを開く前に、次の設定を行いました。

BOOL l1_OpenCOM(char *szCOM, DWORD nxBaud, BOOL fHwFlowCtrl) {
struct termios settings;

  strcpy(g_szCOMPort, szCOM);

  g_hDevice = open(g_szCOMPort, O_RDWR | O_NOCTTY);

  if (g_hDevice < 0) {
    g_hDevice = INVALID_HANDLE_VALUE;
    return FALSE;
  }

  memset(&settings, 0, sizeof(settings));
  settings.c_cflag = CS8 | CREAD | CLOCAL | HUPCL;
  if (fHwFlowCtrl) {//during the data transition, the fHwFlowCtrl is FALSE
    settings.c_cflag |= CRTSCTS;
  }

  if (tcsetattr(g_hDevice, TCSANOW, &settings) != 0) {
    close(g_hDevice);
    return FALSE;
  }

  if (l1_ChangeBaud(nxBaud) == FALSE) {
    close( g_hDevice );
    return FALSE;
  }

  if (l1_SetTimeouts() == FALSE) {
    close( g_hDevice );
    return FALSE;
  }

  l1_PurgeCOM();

  return TRUE;
}

これらの設定で十分かどうかはわかりません。

4

0 に答える 0