一个使用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。具体代码如下:
接下来我主要是贴出各个函数的实现,这里使用了Windows API 函数的CreateFile(),该函数在MSDN里如下说明:
其实这个函数可以创建各种不同的file,比如files pipes mailslots communications resources disk devices (Windows NT only) consoles directories (open only) 这里我是创建了一个通信资源文件,具体实现如下:
接下来我们要实现的是写信息和读信息了具体的实现如下:
最后当我们用完串口的时候就是要关闭串口了,其实就是收回创建的通信资源文件
这里就是把文件句柄赋予INVALID_HANDLE_VALUE.我了解在实际的项目中用到com通信还是比较多的,com网络上讲到com通信的也是比较多,这里我只是把自己的实现类贴出来,大家共同学习。
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通信的也是比较多,这里我只是把自己的实现类贴出来,大家共同学习。
相关文章推荐
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算
- 编写一个Activity基类,对Activity进行封装,方便使用
- 队列和栈面试题(一)— 请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据
- 使用HTML5 Web存储的localStorage方式进行编写一个Web页面。
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 使用随机函数初始化一个数组,并对数组进行排序(冒泡排序法和选择排序法)
- (使用STL中的数据结构进行编程7.3.15)UVA 630 Anagrams (II)(求一个单词在字典中出现的次数)
- 使用过滤器+反射+枚举,简单模拟sturts2运行方式,编写一个属于自己的框架
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 2004.7.15 [C#学习记录]使用C#编写一个自定义控件
- 利用if else 语句编写程序读取输入,直到#。用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号替换,最后 报告进行了多少次替换。
- WebStrom编写CoffeeScript使用谷歌浏览器进行调试
- 综合应用WPF/WCF/WF/LINQ之二十四:使用UserControl技术编写一个翻页控件
- 编写一个手机类(Mobile),包括手机品牌(brand)、手机型号(type),方法包括显示手机信息,并编写测试类进行对象的创建
- lucene使用IKAnalyzer3.2.8中文分词器进行索引的一个小例子
- 使用Apache POI WorkBook 进行下载文件的一个问题
- Redis学习笔记(七)nginx+tomcat反向代理下使用tomcat-redis-session-manager进行session共享中值得注意的一个问题
- 使用FFmpeg进行音频处理的一个小知识点
- 打印不同的数(编写一个程序,使用指针访问数组方式,读入十个数,输出其中不同的数,即一个数如果出现多次,只打印一次)