本文介绍了64位平台上的串口通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,



在我的应用程序中,我需要通过串口检测连接到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位平台上的串口通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-03 17:17