资源描述:
《《vc串口通讯dll》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、VC串口通讯DLL串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类;使用简单高效,具有工业强度,我在BC,BCB,VC,BCBX,GCC下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法库的层次结构:_base_com:虚基类,基本接口,可自行扩展自己的串口类_sync_com:_base_com的子类,同步应用,适合简单应用_asyn_com:_base_com的子类,异步应用(重叠I/O),适合较高效应用,NT平台_thr
2、ead_com:_asyn_com的子类,异步应用,监视线程,适合较复杂应用,窗口通知消息和继承扩展的使用方式;几个问题:结束线程如何从WaitCommEvent(pcom->_com_handle,&mask,&pcom->_wait_o)这个API退出以便顺利结束线程:方案1:SetCommMask(_com_handle,0);这个方法在MSDN有载,当在一些情况下并不完全有效,原因未知;方案2:SetEvent(_wait_o.hEvent);直接激活重叠IO结构中的事件句柄,绝对有效;这份
3、代码我两种都用;打开10以上的COM端口在NT/2000下打开编号10以上端口用_com_handle=CreateFile(“COM10“,GENERIC_READGENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPED,//重叠I/ONULL);将提示错误,这样就OK:_com_handle=CreateFile(“\\.\COM10“,//对应的就是\.COM10GENERIC_READG
4、ENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPED,//重叠I/ONULL);线程中循环的低效率问题使用SetCommMask(pcom->_com_handle,EV_RXCHAREV_ERR)监视接受字符和错误消息;一旦有个字符来就会激活WaitCommEvent通常作以下接受操作:if(!WaitCommEvent(pcom->_com_handle,&mask,&pcom->_wait_o))
5、{if(GetLastError()==ERROR_IO_PENDING){GetOverlappedResult(pcom->_com_handle,&pcom->_wait_o,&length,true);}}if(mask&EV_ERR)//==EV_ERRClearCommError(pcom->_com_handle,&error,&stat);if(mask&EV_RXCHAR)//==EV_RXCHAR{pcom->on_receive();//接收到字符//或发送到窗口消息}这样频繁
6、的函数调用或接受发送消息,效率低下,我添加扫描缓冲区的代码,当字符数超过设定的字符数才作接受字符的操作;if(mask&EV_RXCHAR)//==EV_RXCHAR{ClearCommError(pcom->_com_handle,&error,&stat);if(stat.cbInQue>pcom->_notify_num)//_notify_num是设定得字符数pcom->on_receive();}类似于流的输出方式我编了一个简单的写串口的方式,可以类似于流将简单的数据类型输出templat
7、e_asyn_com&operator<<(Tx){strstreams;s<8、rt,intbaud_rate);boolopen(intport,char*set_str);//set_str:“9600,8,n,1“boolset_state(intBaudRate,intByteSize=8,intParity=NOPARITY,intStopBits=ONESTOPBIT)//设置内置结构串口参数:波特率,停止位boolset_state(char*set_str)boolis_open();HANDLEget_handle();virt