《機(jī)器人程序設(shè)計(jì)-仿人機(jī)器人競技娛樂運(yùn)動(dòng)設(shè)計(jì)》課件第5章_第1頁
《機(jī)器人程序設(shè)計(jì)-仿人機(jī)器人競技娛樂運(yùn)動(dòng)設(shè)計(jì)》課件第5章_第2頁
《機(jī)器人程序設(shè)計(jì)-仿人機(jī)器人競技娛樂運(yùn)動(dòng)設(shè)計(jì)》課件第5章_第3頁
《機(jī)器人程序設(shè)計(jì)-仿人機(jī)器人競技娛樂運(yùn)動(dòng)設(shè)計(jì)》課件第5章_第4頁
《機(jī)器人程序設(shè)計(jì)-仿人機(jī)器人競技娛樂運(yùn)動(dòng)設(shè)計(jì)》課件第5章_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章機(jī)器人控制串口編程5.1引言5.2打開串口5.3配置串口5.4讀寫串口5.5關(guān)閉串口

5.1引言

在Win32下,可以使用兩種編程方式實(shí)現(xiàn)串口通信:其一是使用ActiveX控件,這種方法程序簡單,但不夠靈活;其二是調(diào)用Windows的API函數(shù),這種方法可以清楚地掌握串口通信的機(jī)制,并且自由靈活。本章只介紹API串口通信部分。

串口的操作可以有兩種操作方式:同步操作方式和重疊操作方式(又稱為異步操作方式)。同步操作時(shí),API函數(shù)會阻塞直到操作完成以后才能返回(在多線程方式中,雖然不會阻塞主線程,但是仍然會阻塞監(jiān)聽線程);而重疊操作時(shí),API函數(shù)會立即返回,操作在后臺進(jìn)行,能避免線程的阻塞。無論哪種操作方式,一般都通過以下四個(gè)步驟來完成:

(1)打開串口。

(2)配置串口。

(3)讀寫串口。

(4)關(guān)閉串口。

5.2打開串口

Win32系統(tǒng)把文件的概念進(jìn)行了擴(kuò)展。無論是文件、通信設(shè)備、命名管道、郵件槽、磁盤還是控制臺,都是用API函數(shù)CreateFile來打開或創(chuàng)建的。該函數(shù)的原型為:其中:

lpFileName:將要打開的串口邏輯名,如“COM1”。

dwDesiredAccess:指定串口訪問的類型,可以是讀取、寫入或二者并列。

dwShareMode:指定共享屬性,由于串口不能共享,該參數(shù)必須置為0。

lpSecurityAttributes:引用安全性屬性結(jié)構(gòu),缺省值為NULL。

dwCreationDistribution:創(chuàng)建標(biāo)志,對串口操作,該參數(shù)必須置為OPEN_EXISTING。

dwFlagsAndAttributes:屬性描述,用于指定該串口是否進(jìn)行異步操作,該值為FILE_FLAG_OVERLAPPED,表示使用異步的I/O;該值為0,表示同步I/O操作。

hTemplateFile:對串口而言該參數(shù)必須置為NULL。

同步I/O方式打開串口的示例代碼:

5.3配置串口

1.設(shè)置串口參數(shù)

設(shè)置串口參數(shù)需要通過一個(gè)DCB結(jié)構(gòu)來進(jìn)行。DCB結(jié)構(gòu)包含了諸如波特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和停止位數(shù)等信息。在查詢或配置串口的屬性時(shí),都要用DCB結(jié)構(gòu)來作為緩沖區(qū)。

一般用CreateFile打開串口后,可以調(diào)用GetCommState函數(shù)來獲取串口的初始配置。要修改串口的配置,應(yīng)該先修改DCB結(jié)構(gòu),然后再調(diào)用SetCommState函數(shù)設(shè)置串口。

DCB結(jié)構(gòu)包含了串口的各項(xiàng)參數(shù)設(shè)置,該結(jié)構(gòu)原型如下:

2.申請串口通信緩沖區(qū)

除了在DCB中進(jìn)行的設(shè)置外,程序一般還需要設(shè)置I/O緩沖區(qū)的大小和超時(shí)。Windows用I/O緩沖區(qū)來暫存串口輸入和輸出的數(shù)據(jù)。如果通信的速率較高,則應(yīng)該設(shè)置較大的緩沖區(qū)。調(diào)用SetupComm函數(shù)可以設(shè)置串行口的輸入和輸出緩沖區(qū)的大小。

3.串口通信超時(shí)設(shè)置

在用ReadFile和WriteFile讀寫串行口時(shí),需要考慮超時(shí)問題。超時(shí)的作用是在指定的時(shí)間內(nèi)沒有讀入或發(fā)送指定數(shù)量的字符時(shí),ReadFile或WriteFile的操作仍然會結(jié)束。

要查詢當(dāng)前的超時(shí)設(shè)置應(yīng)調(diào)用GetCommTimeouts函數(shù),該函數(shù)會填充一個(gè)COMMTIMEOUTS結(jié)構(gòu)。調(diào)用SetCommTimeouts可以用某一個(gè)COMMTIMEOUTS結(jié)構(gòu)的內(nèi)容來設(shè)置超時(shí)。

讀寫串口的超時(shí)有兩種:間隔超時(shí)和總超時(shí)。間隔超時(shí)是指在接收時(shí)兩個(gè)字符之間的最大時(shí)延??偝瑫r(shí)是指讀寫操作總共花費(fèi)的最大時(shí)間。寫操作只支持總超時(shí),而讀操作兩種超時(shí)均支持。用COMMTIMEOUTS結(jié)構(gòu)可以規(guī)定讀寫操作的超時(shí)。

COMMTIMEOUTS結(jié)構(gòu)的成員都以毫秒為單位??偝瑫r(shí)的計(jì)算公式是:

總超時(shí)=時(shí)間系數(shù)×要求讀/寫的字符數(shù)+時(shí)間常量

可以看出,間隔超時(shí)和總超時(shí)的設(shè)置是不相關(guān)的,這可以方便通信程序靈活地設(shè)置各種超時(shí)。

如果所有寫超時(shí)參數(shù)均為0,那么就不使用寫超時(shí)。如果ReadIntervalTimeout為0,那么就不使用讀間隔超時(shí)。如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都為0,則不使用讀總超時(shí)。如果讀間隔超時(shí)被設(shè)置成MAXDWORD并且讀時(shí)間系數(shù)和讀時(shí)間常量都為0,那么在讀一次輸入緩沖區(qū)的內(nèi)容后讀操作就立即返回,不管是否讀入了要求的字符。

4.清空串口通信緩沖區(qū)

在讀寫串口之前,還要用PurgeComm()函數(shù)清空緩沖區(qū),該函數(shù)原型如下:

5.4讀寫串口

使用ReadFile和WriteFile讀寫串口,下面是兩個(gè)函數(shù)的聲明:在用ReadFile和WriteFile讀寫串口時(shí),既可以同步執(zhí)行,也可以重疊執(zhí)行。在同步執(zhí)行時(shí),函數(shù)直到操作完成后才返回。這意味著同步執(zhí)行時(shí)線程會被阻塞,從而導(dǎo)致效率下降。在重疊執(zhí)行時(shí),即使操作還未完成,這兩個(gè)函數(shù)也會立即返回,費(fèi)時(shí)的I/O操作在后臺進(jìn)行。

ReadFile和WriteFile函數(shù)是同步還是異步由CreateFile函數(shù)決定,如果在調(diào)用CreateFile創(chuàng)建句柄時(shí)指定了FILE_FLAG_OVERLAPPED標(biāo)志,那么調(diào)用ReadFile和WriteFile對該句柄進(jìn)行的操作就應(yīng)該是重疊的;如果未指定重疊標(biāo)志,則讀寫操作應(yīng)該是同步的。ReadFile和WriteFile函數(shù)的同步或者異步應(yīng)該和CreateFile函數(shù)相一致。

ReadFile函數(shù)只要在串口輸入緩沖區(qū)中讀入指定數(shù)量的字符,就算完成操作。而WriteFile函數(shù)不但要把指定數(shù)量的字符拷入到輸出緩沖區(qū),而且要等這些字符從串行口送出去后才算完成操作。

如果操作成功,這兩個(gè)函數(shù)都返回TRUE。需要注意的是,當(dāng)ReadFile和WriteFile返回FALSE時(shí),不一定就是操作失敗,這時(shí)線程應(yīng)該調(diào)用GetLastError函數(shù)分析返回的結(jié)果。例如,在重疊操作時(shí)如果操作還未完成函數(shù)就返回,那么函數(shù)會返回FALSE,同時(shí)GetLastError函數(shù)返回ERROR_IO_PENDING,這說明重疊操作還未完成。在使用ReadFile和WriteFile重疊操作時(shí),線程需要?jiǎng)?chuàng)建OVERLAPPED結(jié)構(gòu)以供這兩個(gè)函數(shù)使用。線程通過OVERLAPPED結(jié)構(gòu)獲得當(dāng)前的操作狀態(tài),該結(jié)構(gòu)最重要的成員是hEvent。hEvent是讀寫事件,當(dāng)串口使用異步通信時(shí),函數(shù)返回時(shí)操作可能還沒有完成,程序可以通過檢查該事件得知是否讀寫完畢。當(dāng)調(diào)用ReadFile和Wr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論