串口条码枪vb.net 串口扫描枪扫不出条码( 二 )


m_ComPort.SetInputLen(0);
⑷.捕捉串口事项 。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据 。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序 。在程序中需要捕获并处理这些通讯事件 。
在MainFrm.h中:
protected:
afx_msg void OnCommMscomm();
DECLARE_EVENTSINK_MAP()
在MainFrm.cpp中:
BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射ActiveX控件事件
END_EVENTSINK_MAP()
⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可 。两个函数的原型是:
VARIANT GetInput();及 void SetOutput(const VARIANT newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的) 。
无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式) 。查阅VARIANT文档知道 , 可以用BSTR表示字符串 , 但遗憾的是所有的BSTR都是包含宽字符 , 即使我们没有定义_UNICODE_UNICODE也是这样串口条码枪vb.net! WinNT支持宽字符, 而Win95并不支持 。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:
void CMainFrame::OnCommMscomm(){
VARIANT vResponse;int k;
if(m_commCtrl.GetCommEvent()==2) {
【串口条码枪vb.net 串口扫描枪扫不出条码】k=m_commCtrl.GetInBufferCount(); //接收到的字符数目
if(k0) {
vResponse=m_commCtrl.GetInput(); //read
SaveData(k,(unsigned char*) vResponse.parray-pvData);
} // 接收到字符,MSComm控件发送事件 }
。。。。。// 处理其他MSComm控件
}
void CMainFrame::OnCommSend() {
。。。。。。。。// 准备需要发送的命令,放在TxData[]中
CByteArray array;
array.RemoveAll();
array.SetSize(Count);
for(i=0;iCount;i++)
array.SetAt(i, TxData[i]);
m_ComPort.SetOutput(COleVariant(array)); // 发送数据 }
二 使用32位的API 通信函数:
⑴.在中MainFrm.cpp定义全局变量
HANDLEhCom; // 准备打开的串口的句柄
HANDLEhCommWatchThread ;//辅助线程的全局函数
⑵.打开串口,设置串口
hCom =CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, // 允许读写
0,// 此项必须为0
NULL,// no security attrs
OPEN_EXISTING,//设置产生方式
FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信
NULL );
我使用了FILE_FLAG_OVERLAPPED结构 。这正是使用API实现非阻塞通信的关键所在 。
ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功
SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR ); //清干净输入、输出缓冲区
COMMTIMEOUTS CommTimeOuts ; //定义超时结构 , 并填写该结构
…………
SetCommTimeouts( hCom, CommTimeOuts ) ;//设置读写操作所允许的超时
DCBdcb ; // 定义数据控制块结构
GetCommState(hCom, dcb ) ; //读串口原来的参数设置
dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;
SetCommState(hCom, dcb ) ; //串口参数配置
上述的COMMTIMEOUTS结构和DCB都很重要 , 实际工作中需要仔细选择参数 。
⑶启动一个辅助线程,用于串口事件的处理 。
Windows提供了两种线程,辅助线程和用户界面线程 。辅助线程没有窗口,所以它没有自己的消息循环 。但是辅助线程很容易编程,通常也很有用 。

推荐阅读