新聞中心

EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 激光加工機(jī)器人通信協(xié)議設(shè)計(jì)

激光加工機(jī)器人通信協(xié)議設(shè)計(jì)

作者: 時(shí)間:2011-10-28 來(lái)源:網(wǎng)絡(luò) 收藏
4 的實(shí)現(xiàn)

本文引用地址:http://butianyuan.cn/article/155576.htm

4.1 下位機(jī)任務(wù)的實(shí)現(xiàn)


在實(shí)時(shí)多任務(wù)系統(tǒng)中,一項(xiàng)工作的完成往往需要通過(guò)多個(gè)任務(wù)(中斷)共同完成的。這需要各任務(wù)及中斷協(xié)調(diào)動(dòng)作,相互配合,甚至進(jìn)行。VRTXsa提供了郵箱(mailbox),隊(duì)列(queue)、事件標(biāo)志(event flag)、信號(hào)量(semaphore)互斥體(mutexes) 5種通信機(jī)制。在下位機(jī)通信系統(tǒng)中,通信工作由串口2中斷、時(shí)鐘中斷、監(jiān)控任務(wù)、顯示任務(wù)、執(zhí)行任務(wù)等共同協(xié)調(diào)完成的。如圖2所示。

機(jī)收到上位機(jī)的指令后,串口2中斷發(fā)生,它的中斷服務(wù)程序啟動(dòng)。它將設(shè)置中斷同步標(biāo)志,觸發(fā)串口2任務(wù)程序。串口2任務(wù)將處理接收到的上位機(jī)數(shù)據(jù),將解釋指令放入命令隊(duì)列中,并設(shè)置相關(guān)標(biāo)志。在一個(gè)時(shí)鐘周期內(nèi)(16ms),所有任務(wù)執(zhí)行一遍,它們根據(jù)相關(guān)標(biāo)志,完成相應(yīng)的工作,如讀取命令隊(duì)列,執(zhí)行命令,給上位機(jī)返回應(yīng)答。

  串口2任務(wù)程序如下:
void far com2_ task(void)
{刀初始化
刀裝載串口2中斷
sys_ load vrtx_ isr(Ox34,com- isr);
刀允許串口2中斷
n8259_ inerrupt enable(4);
while(true)
刀等待串口2中斷
ev_group=sc_ fpend(group_ id,0,4,0,erro);
刀中斷到來(lái),清中斷同步標(biāo)志
ev_group=sc_ fclear(gruop_ id,4,err);
read_ CommData();//處理并讀取數(shù)據(jù)
刀處理各種指令,并設(shè)置各相關(guān)標(biāo)志
process_ Comm (BYTE *Buff,BYTE *cPtr);

  4.2 上位機(jī)通信控件的實(shí)現(xiàn)

為了便于用戶使用,把上位機(jī)的通信功能封裝到ActiveX控件中。選擇VC++6進(jìn)行通信控件的開(kāi)發(fā),串口操作使用API函數(shù)來(lái)實(shí)現(xiàn)??丶胁捎昧硕嗑€程技術(shù)。為監(jiān)控串口任務(wù)創(chuàng)建了一個(gè)工作線程,以免它堵塞主線程,提高了系統(tǒng)的響應(yīng)性。通信控件采用了異步v0方式,以提高發(fā)送、接收和處理數(shù)據(jù)的效率。異步v0操作建立后會(huì)立即返回,即使操作還未完成。這樣把費(fèi)時(shí)的v0操作放在后臺(tái)進(jìn)行,線程就可以干別的事情,極大地提高了程序的運(yùn)行效率。在串口通信中,有
幾種讀取串口數(shù)據(jù)的方式,其中事件驅(qū)動(dòng)是最有效率的方式。在監(jiān)視串口的輔助線程中,當(dāng)有數(shù)據(jù)到達(dá)時(shí)串口是,串口事件觸發(fā),控件開(kāi)始讀取串口輸入緩沖區(qū)的數(shù)據(jù)。如果沒(méi)有數(shù)據(jù)到達(dá),那么使用WaitForMultipleObjects 0'數(shù)堵塞監(jiān)測(cè)線程,把資源讓給其它線程。在使用線程堵塞技術(shù)之后,監(jiān)視串口線程占用的系統(tǒng)資源大大減少,同時(shí)提高了指令的發(fā)送效率。串口讀寫和監(jiān)控是通信的最主要部分,采用了異步v0操作,使得程序復(fù)雜化。異步v0操作分兩部分:一是創(chuàng)建該v0操作,然后返回;二是探測(cè)操作的完成。下面是讀串口的部分程序清單:

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,判斷是出錯(cuò)還是沒(méi)完成
if(GetLastError()==ERROR IO_PENDING) f
//沒(méi)完成,需要等待
if(!GetOverlappedResult(hComm,m- ov,
dwRead,TRUE)) //等待讀操作完成
{…}刀完成讀操作,但出錯(cuò)
else //正確完成讀操作
{…}//處理接收的字符
else(…}/贖操作出錯(cuò)
else //讀操作在函數(shù)返回前已經(jīng)完成
{…}刀處理接收的字符
}
return; //沒(méi)有字符了,返回
}
寫串口程序和讀串口類似。監(jiān)視線程的部分代碼如下:
DINT CommWatch(LPVOID pParam)
{刀清緩存
PurgeComm(hcom,PURGE_ RXCLEAR I PURGE一XCLEAR I
PURGE_ RXABORTIPURGE一XABORT);
for(;;) f
bResult2=WaitCommEvent(hcom,dwEvtMask,m一 ov);
刀等待串口事件的發(fā)生
if(!bResult2)[//事件WaitCommEvent返回假
switch (dw=GetLastError(川
case ERROR-10-PENDING://異步I/O操作(WaitCommEvent)/
/進(jìn)行中,正常情況
{break;}
default:[ // I/O操作出現(xiàn)錯(cuò)誤
ProcESSErrorMessage(WaitCommEvent());
break;}}}
else{//事件WaitCommEven嶇回真,操作完成
bResult2=C1earCommError(hcom,dw, commstat);
if (commstat.cbInQue==0)
continue;}
刀堵塞線程,等待事件組發(fā)生。事件組包括:關(guān)閉線程事件、
刀讀事件、寫事件
Event=WaitForMultipleObjects(3, m- hEventArray, FALSE,
INFINITE);
switch (Event){//判斷是哪個(gè)事件發(fā)生
case 0:f//關(guān)閉事件
mJbThreadAlive= FALSE;
AfxEndThread(100);//關(guān)閉線程
break;)
case 1:f//字符到達(dá),讀字符
bRead=TRUE;
bResult=TRUE;
GetCommMask(hcom, CommEvent);
if(CommEventEV_ RXCHAR)(
刀通知控件句柄讀取字符
::SendMessage(CommWnd,WM_ COMM_ READ,0,0);)
break;)

case 2:{//寫事件
//通知控件句柄寫串口
::SendMessage(CommWnd,WM_ COMM_ WRITE,0,0);)}}
刀主循環(huán)結(jié)束
return 0;}


  5 結(jié)束語(yǔ)

我們根據(jù)通信的特點(diǎn),制定了相應(yīng)的通信,同時(shí)采用了多種有效的編程方法,以達(dá)到安全、高效、實(shí)用的目的。經(jīng)過(guò)大量的測(cè)試以及I年多工業(yè)運(yùn)用表明,該通信及通信系統(tǒng)取得了很好的效果,完全達(dá)到了工業(yè)機(jī)通信的要求。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉