我在 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程序一起工作。
更新:
在 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;
}
我不确定这些设置是否足够。