首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

激光加工机器人通信协议及其实现 02

激光加工机器人通信协议及其实现 02

接收和处理数据的效率。异步v0操作建立后会立即返回,即使操作还未完成。这样把费时的v0操作放在后台进行,线程就可以干别的事情,极大地提高了程序的运行效率。在串口通信中,有几种读取串口数据的方式,其中事件驱动是最有效率的方式。在监视串口的辅助线程中,当有数据到达时串口是,串口事件触发,控件开始读取串口输入缓冲区的数据。如果没有数据到达,那么使用WaitForMultipleObjects 0'数堵塞监测线程,把资源让给其它线程。在使用线程堵塞技术之后,监视串口线程占用的系统资源大大减少,同时提高了指令的发送效率。串口读写和监控是通信的最主要部分,采用了异步v0操作,使得程序复杂化。异步v0操作分两部分:一是创建该v0操作,然后返回;二是探测操作的完成。下面是读串口的部分程序清单:
void CCommCtrl::ReadChar(COMSTAT comstat)
{
while (comstat.cbInQue>0)f
C1earCommError(mJWomm,&dwError,&comstat);
if(!ReadFile(hcomm,&RXBuf,l,&dwRead,&m_ ov))
f //ReadFile返回FALSE,判断是出错还是没完成
if(GetLastError()==ERROR IO_PENDING) f
//没完成,需要等待
if(!GetOverlappedResult(hComm,&m- ov,
&dwRead,TRUE)) //等待读操作完成
{…}刀完成读操作,但出错
else //正确完成读操作
{…}//处理接收的字符
else(…}/赎操作出错
else //读操作在函数返回前已经完成
{…}刀处理接收的字符
}
return; //没有字符了,返回
}
写串口程序和读串口类似。监视线程的部分代码如下:
DINT CommWatch(LPVOID pParam)
{刀清缓存
PurgeComm(hcom,PURGE_ RXCLEAR I PURGE一XCLEAR I
PURGE_ RXABORTIPURGE一XABORT);
for(;;) f
bResult2=WaitCommEvent(hcom,&dwEvtMask,&m一 ov);
刀等待串口事件的发生
if(!bResult2)[//事件WaitCommEvent返回假
switch (dw=GetLastError(川
case ERROR-10-PENDING://异步I/O操作(WaitCommEvent)/
/进行中,正常情况
{break;}
default:[ // I/O操作出现错误
ProcessErrorMessage("WaitCommEvent()");
break;}}}
else{//事件WaitCommEven岖回真,操作完成
bResult2=C1earCommError(hcom,&dw, &commstat);
if (commstat.cbInQue==0)
continue;}
刀堵塞线程,等待事件组发生。事件组包括:关闭线程事件、
刀读事件、写事件
Event=WaitForMultipleObjects(3, m- hEventArray, FALSE,
INFINITE);
switch (Event){//判断是哪个事件发生
case 0:f//关闭事件
mJbThreadAlive= FALSE;
AfxEndThread(100);//关闭线程
break;)
case 1:f//字符到达,读字符
bRead=TRUE;
bResult=TRUE;
GetCommMask(hcom,t);
if(CommEvent&EV_ RXCHAR)(
刀通知控件句柄读取字符
::SendMessage(CommWnd,WM_ COMM_ READ,0,0);)
break;)

case 2:{//写事件
//通知控件句柄写串口
::SendMessage(CommWnd,WM_ COMM_ WRITE,0,0);)}}
刀主循环结束
return 0;}
 
5结束语


我们根据激光加工机器人通信的特点,制定了相应的通信协议,
返回列表