Windows和Linux之间的COM端口R / W功能有什么不同

时间:2013-09-02 01:37:46

标签: linux winapi file-io serial-port linux-device-driver

我在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可以使用我的HOST程序。< / p>

更新:

在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;
}

我不确定这些设置是否足够。

0 个答案:

没有答案