问题描述
大家好,
在我的应用程序中,我需要通过串口检测连接到PC的设备。在我的代码中,我正在检查8个不同波特率的PC上可用的所有通信端口。这是下面的代码。
Hello Everyone,
In my app, I need to detect the device connected to PC via Serial port. In my code, I am checking for all communication port available on PC at 8 different Baudrates. Here is the code below.
HANDLE hComHandle;
char szBaudRate[][7] = {"9600","38400", "115200", "57600",
"19200", "4800", "2400", "1200"};
char cCommand[][3] = {"k" ,"~k"};
char SerialNumberCommand[][4] = {"Ks" ,"~Ks"};
char cProduct [ ][10] = {"Kproduct", "~Kproduct"} ;
int nPortNum;
int nTmp;
int nControlChar;
WCHAR szPortName[10];
char cReadBuffer;
char cReadModel[20] = {"Apache"};
char cReadSerialNumber [ 22 ];
DWORD lpNumberOfBytesWritten = 0;
DWORD lpNumberOfBytesRead = 0;
int nSerialPortPrinter = 0;
int nPortNumber = 0;
int nCounter = 0;
int nFlag = 0;
DCB dcbConfig;
COMMTIMEOUTS commTimeout;
for (nPortNum = 0; nPortNum < m_nSerialPorts; nPortNum++ )
{
MultiByteToWideChar (CP_ACP, 0, cPortNames [nPortNum],
sizeof(cPortNames[nPortNum]),
szPortName, sizeof (cPortNames [nPortNum]));
for ( nTmp = 0; nTmp < 8; nTmp++ )
{
hComHandle = CreateFileW ((LPCWSTR)szPortName,
GENERIC_READ | GENERIC_WRITE,
0, /* Shared Mode */
NULL, /* Security */
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if ( hComHandle == INVALID_HANDLE_VALUE)
{
break;
}
if(!SetupComm(hComHandle, 1024, 1024))
{
continue;
}
if(GetCommState(hComHandle, &dcbConfig))
{
dcbConfig.BaudRate = (DWORD)atoi (szBaudRate [ nTmp ]);
dcbConfig.ByteSize = 8;
dcbConfig.Parity = NOPARITY;
dcbConfig.StopBits = 0;
dcbConfig.fBinary = TRUE;
dcbConfig.fParity = TRUE;
}
else
continue;
if(!SetCommState(hComHandle, &dcbConfig))
continue;
if(GetCommTimeouts(hComHandle, &commTimeout))
{
commTimeout.ReadIntervalTimeout = 50;
commTimeout.ReadTotalTimeoutConstant = 50;
commTimeout.ReadTotalTimeoutMultiplier = 0;
commTimeout.WriteTotalTimeoutConstant = 50;
commTimeout.WriteTotalTimeoutMultiplier = 0;
}
else
continue;
if(!SetCommTimeouts(hComHandle, &commTimeout))
continue;
for (nControlChar = 0; nControlChar < 2; nControlChar++)
{
Sleep ( 2 );
WriteFile (hComHandle, cCommand [nControlChar],
2, &lpNumberOfBytesWritten, NULL );
Sleep ( 5 );
ReadFile (hComHandle, &cReadBuffer, 1, &lpNumberOfBytesRead, NULL);
if (lpNumberOfBytesRead > 0 && cReadBuffer == 'Y' )
{
nFlag = 1;
}
}
}
}
此代码在32位平台上运行顺畅但在64位平台上运行不正常。 SetupComm(),GetCommState(),SetCommState(),SetCommTimeOutS()等函数失败。
This code works smoothly on 32 Bit Platforms but not on 64 Bit platform. Functions such as SetupComm(),GetCommState(), SetCommState(), SetCommTimeOutS() fails.
推荐答案
此代码在32位平台上运行顺畅,但在64位平台上运行不正常。 SetupComm(),GetCommState(),SetCommState(),SetCommTimeOutS()等函数失败。
This code works smoothly on 32 Bit Platforms but not on 64 Bit platform. Functions such as SetupComm(),GetCommState(), SetCommState(), SetCommTimeOutS() fails.
这不是一个好的信息。你应该检查你得到的错误代码(即:失败时调用 GetLastError
),如果你愿意,可以在这里报告。
请注意 Windows API
函数失败,您应该始终执行错误检查。
This is not good info. You should check the error codes you are getting (that is: call GetLastError
on failure) and, if you wish, report them here.
Please note on Windows API
function failure, you should always perform error checking.
这篇关于64位平台上的串口通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!