您的位置:首页 > 其它

一个使用WindowAPI函数进行编写的COM通信类

2010-05-06 22:34 204 查看
刚刚换了新的工作,主要与机器设备接触的比较多,所以使用到com通信的地方很多,以前我记得在vc 6.0中有一个专门用来进行com通信的组件,当时也是外接一个报警设备用到了com通信,主要是传输十六进制的command。现在又是要连接设备也同样要用到了com通信,通过查阅资料发现我可以使用windows api 函数来自己写一个串口通信的类。主要使用到的事CreatFile()函数。下面我就主要来共享一下我的com通信类。首先我是定义了一个CCOM类,该类定义四个函数 OpenPort()、ClosePort()、ReadBuffer()、WriteBuffer(),同时定义了一个句柄HANDLE m_hComPort。具体代码如下:

class __declspec(dllexport) CCom {
public:
//Read the data from the receive buffer of the COM Port
BOOL ReadBuffer(unsigned char* pInBufffer,DWORD dwBufferSize);
//write the data to the transmit buffer of the COM port
BOOL WriteBuffer(unsigned char* pOutBuffer,DWORD dwBufferSize);
//Close the COM Port
void ClosePort();
//Open the COM Port
BOOL OpenPort(LPSTR strPortName, //COM port Index
DWORD dwBaudRate =115200, //Baud Rate:115200
BYTE bByteSize =8, //8 Data bits
BYTE bParity = NOPARITY,//No Parity
BYTE bStopBits= ONESTOPBIT);// One Stop bit
CCom();
virtual ~CCom();
protected:
HANDLE m_hCommPort;//COM port handler };


接下来我主要是贴出各个函数的实现,这里使用了Windows API 函数的CreateFile(),该函数在MSDN里如下说明:

HANDLE CreateFile
(

LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile   // handle to file with attributes to copy

);


其实这个函数可以创建各种不同的file,比如files pipes mailslots communications resources disk devices (Windows NT only) consoles directories (open only) 这里我是创建了一个通信资源文件,具体实现如下:

BOOL CCom::OpenPort(LPSTR strPortName, DWORD dwBaudRate /* =115200 */, BYTE bByteSize /* =8 */, BYTE bParity /* = NOPARITY */, BYTE bStopBits/* = ONESTOPBIT */)
{
BOOL bPortReady = FALSE;
DCB	  PortDCB;
COMMTIMEOUTS PortTimeOuts;
ClosePort();

m_hCommPort= CreateFile(strPortName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (m_hCommPort== INVALID_HANDLE_VALUE)
{
return bPortReady;
}
bPortReady= GetCommState(m_hCommPort,&PortDCB);
if (!bPortReady)
{
return bPortReady;
}
PortDCB.BaudRate=dwBaudRate;
PortDCB.ByteSize=bByteSize;
PortDCB.fParity=FALSE ;// Disable Parity checking
PortDCB.StopBits=bStopBits;
PortDCB.fAbortOnError= TRUE;

bPortReady= SetCommState(m_hCommPort,&PortDCB);
if (!bPortReady)
{
return bPortReady;
}

bPortReady= GetCommTimeouts(m_hCommPort,&PortTimeOuts);
if (!bPortReady)
{
return bPortReady;
}
PortTimeOuts.ReadIntervalTimeout =50;
PortTimeOuts.ReadTotalTimeoutConstant=50;
PortTimeOuts.ReadTotalTimeoutMultiplier=10;
PortTimeOuts.WriteTotalTimeoutConstant=50;
PortTimeOuts.WriteTotalTimeoutMultiplier=10;
bPortReady= SetCommTimeouts(m_hCommPort,&PortTimeOuts);
if (!bPortReady)
{
return bPortReady;
}
bPortReady= SetupComm(m_hCommPort,1024,1024);
if (!bPortReady)
{
return bPortReady;
}
bPortReady= PurgeComm(m_hCommPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
return  bPortReady;

}
void CCom::ClosePort()
{
if (m_hCommPort!=INVALID_HANDLE_VALUE)
{
CloseHandle(m_hCommPort);
m_hCommPort=INVALID_HANDLE_VALUE;
}

}


接下来我们要实现的是写信息和读信息了具体的实现如下:

BOOL CCom::WriteBuffer(unsigned char* pOutBuffer,DWORD dwBufferSize)
{
DWORD dwBytesWritten;
if (m_hCommPort==INVALID_HANDLE_VALUE)
{
return FALSE;
}
//Clear the TX and RX buffer Error information
if (!PurgeComm(m_hCommPort,PURGE_RXCLEAR|PURGE_TXCLEAR))
{
return FALSE;
}
WriteFile(m_hCommPort,pOutBuffer,dwBufferSize,&dwBytesWritten,NULL);
if (dwBytesWritten!=dwBufferSize)
{
return FALSE;
}
return TRUE;
}
BOOL CCom::ReadBuffer(unsigned char* pInBufffer,DWORD dwBufferSize)
{
DWORD dwBytesRead;
if (m_hCommPort=INVALID_HANDLE_VALUE)
{
return FALSE;
}
ReadFile(m_hCommPort,pInBufffer,dwBufferSize,&dwBytesRead,NULL);
if (dwBytesRead!=dwBufferSize)
{
return FALSE;
}
return  TRUE;
}


最后当我们用完串口的时候就是要关闭串口了,其实就是收回创建的通信资源文件

这里就是把文件句柄赋予INVALID_HANDLE_VALUE.我了解在实际的项目中用到com通信还是比较多的,com网络上讲到com通信的也是比较多,这里我只是把自己的实现类贴出来,大家共同学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐