《機器人程序設計-仿人機器人競技娛樂運動設計》課件第5章_第1頁
《機器人程序設計-仿人機器人競技娛樂運動設計》課件第5章_第2頁
《機器人程序設計-仿人機器人競技娛樂運動設計》課件第5章_第3頁
《機器人程序設計-仿人機器人競技娛樂運動設計》課件第5章_第4頁
《機器人程序設計-仿人機器人競技娛樂運動設計》課件第5章_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章機器人控制串口編程5.1引言5.2打開串口5.3配置串口5.4讀寫串口5.5關閉串口

5.1引言

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

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

(1)打開串口。

(2)配置串口。

(3)讀寫串口。

(4)關閉串口。

5.2打開串口

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

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

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

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

lpSecurityAttributes:引用安全性屬性結構,缺省值為NULL。

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

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

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

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

5.3配置串口

1.設置串口參數

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

一般用CreateFile打開串口后,可以調用GetCommState函數來獲取串口的初始配置。要修改串口的配置,應該先修改DCB結構,然后再調用SetCommState函數設置串口。

DCB結構包含了串口的各項參數設置,該結構原型如下:

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

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

3.串口通信超時設置

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

要查詢當前的超時設置應調用GetCommTimeouts函數,該函數會填充一個COMMTIMEOUTS結構。調用SetCommTimeouts可以用某一個COMMTIMEOUTS結構的內容來設置超時。

讀寫串口的超時有兩種:間隔超時和總超時。間隔超時是指在接收時兩個字符之間的最大時延。總超時是指讀寫操作總共花費的最大時間。寫操作只支持總超時,而讀操作兩種超時均支持。用COMMTIMEOUTS結構可以規(guī)定讀寫操作的超時。

COMMTIMEOUTS結構的成員都以毫秒為單位??偝瑫r的計算公式是:

總超時=時間系數×要求讀/寫的字符數+時間常量

可以看出,間隔超時和總超時的設置是不相關的,這可以方便通信程序靈活地設置各種超時。

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

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

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

5.4讀寫串口

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

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

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

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

溫馨提示

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

評論

0/150

提交評論