VB和51單片機串口通信講解_第1頁
VB和51單片機串口通信講解_第2頁
VB和51單片機串口通信講解_第3頁
VB和51單片機串口通信講解_第4頁
全文預覽已結束

下載本文檔

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

文檔簡介

-.z.VB和51單片機串口通信講解mport;設置或返回串口號。SettingS:以字符串的形式設置或返回串口通信參數。Portopen:設置或返回串口狀態(tài)。InputMode:設置或返回接收數據的類型。Inputlen:設置或返回一次從接收緩沖區(qū)中讀取字節(jié)數。InBufferSize:設置或返回接收緩沖區(qū)的大小,缺省值為l024字節(jié)。InBufferCount:設置或返回接收緩沖區(qū)中等待計算機接收的字符數。Input:從接收緩沖區(qū)中讀取數據并清空該緩沖區(qū),該屬性設計時無效,運行時只讀。OutBufferSize:設置或返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。OutBufferCount:設置或返回發(fā)送緩沖區(qū)中等待計算機發(fā)送的字符數。Output:向發(fā)送緩沖區(qū)發(fā)送數據,該屬性設計時無效,運行時只讀。設置好這些屬性和方法,程序很容易就可以編出來了,其中要注意的是串口的波特串設置,Onm事件的程序編寫。

程序的設計是這樣的,計算機向單片機發(fā)送一個’S’,表示通信開場。然后緊接著又發(fā)送9個字符,其中最后一個字符是前面9個字符〔包括’S’〕的校驗和。單片機正確接收到10個字符后,把10個字符從新又送回來。//---------------------------------------初始化串口設計-----------------------------

PrivateSubForm_Load()m1.Setting="9600,n,8,1,"

’設置波特率和發(fā)送字符格式m1.mPort=1

’設置通訊串口m1.InputLen=0

’設置或返回一次從接收緩沖區(qū)中讀取字節(jié)數,0表示一次讀取所有數據m1.InBuffersize=512m1.InBufferCount=0m1.OutBufferCount=0m1.Rthreshold=1m1.PortOpen=TrueEndSub

’翻開串口//--------------------------------------給單片機發(fā)送’S’,開場通信-----------------------------

PrivateSubmand1_C1ick()Timer1.Enabled=TrueEndSubPrivateSubmand2_C1ick()Varbuffet=“S〞

m1.Ouput=varbuffeTimer2.Enabled=TrueEndSubPrivateSubForm_Unload(CancelAsInteger)m1.PortOpen=FalseEndSub//---------------------------------------向單片機發(fā)送數據-----------------------------

PrivateSubTimer2_Timer()Outputsignal=Str(Te*t2.te*t)

’向單片機發(fā)送數據Temp(1)=Cbyte(outputsignal)Varbuffer=tempml.Output=varbufferTimer2.Enabled=FalseEndSub//---------------------------------------接收單片機發(fā)送的數據,并顯示-----------------------------

PrivateSubm1_Onm()SelectCasem1.mEvent

’設置onm事件,讀取片機存的值CaseEvReceiveInputsignal=m1.InputTe*t1.Te*t=Asc(Inputsignal)

’單片機存的值用te*tbo*顯示出CaseElseEndselectEndSub關于MSM控件的一些說明

VB5.0/6.的MSm通信控件提供了一系列標準通信命令的接口,它允許建立串口連接,可以連接到其他通信設備〔如Modem〕.還可以發(fā)送命令、進展數據交換以及監(jiān)視和響應在通信過程中可能發(fā)生的各種錯誤和事件,從而可以用它創(chuàng)立全雙工、事件驅動的、高效實用的通信程序。但在實際通信軟件設計過程中,MSm控件并非像想像中那樣完美和容易控制.特別是在中文Wln95/98下通信時更會出現問題。下面就從根底開場介紹,然后逐步討淪MSm控件在編程中出現的問題以及編程技巧。一、用MSm控件通信1.串口通信根底知識

一般悅來,計算機都有一個或多個串行端口,它們依次為1、2、…,這些串口還提供了外部設備與pC進展數據傳輸和皿信的通道。這些串口在CPU和外設之間充當解釋器的角色。當字符數據從CPU發(fā)送給外設時,這些字符數據將被轉換成串行比特流數據;當接收數據時,比特流數據被轉換為字符數據傳遞給CPU,再進一步說,在操作系統(tǒng)方面,Windows用通信驅動程序〔M.DRV〕調用API函數發(fā)送和接收數據,當用通信控件或聲明調用API函數時,它門由M.DRV解釋并傳遞給設備驅動程序,作為一個vB程序員,要編寫通信程序.只需知道通信控件提供應Windows通信AP1函數的接口即可.換句話說,只需設定和監(jiān)視通信控件的屬性和事件即可。2.使用Msm控件在開場使用MSm控件之前。需要先了解其屬性、事件或錯誤屬性

描述mPort

設置或返回通信端口號Settings

以字符串的形式設置或返回波特率、奇偶校驗、數據位和停頓位PortOpen

設置或返回通信端口的狀態(tài)。也可以翻開和關閉端口Input

返回和刪除接收緩沖區(qū)中的字符Output

將字符串寫入發(fā)送緩沖區(qū)mEvent屬性為通信事件或錯誤返回以下值之一。在該控件的對象庫中也可以找到這些常量。常量

描述EventBreak

1001

收到了斷開信號EventCTSTO

1002

ClearToSendTimeout。在發(fā)送字符時,在系統(tǒng)指定的事1件,CTS〔ClearToSend〕線是低電平EventDSRTO

1003

DataSetReadyTimeout。在發(fā)送字符時,在系統(tǒng)指定的事件,DSR〔DataSetReady〕線是低電平EventFrame

1004

數據幀錯誤。硬件檢測到一個數據幀錯誤EventOverrun1006

端口溢出。硬件中的字符尚未讀,下一個字符又到達,并且喪失EventCDTO

1007

CarrierDetectTime。在發(fā)送字符時,在系統(tǒng)指定的事件,CD〔CarrierDetect〕線是低電平。CD

也稱為RLSD〔ReceiveLineSingalDetect,接收線信號檢測〕EventR*Over1008

接收緩沖區(qū)溢出。在接收緩沖區(qū)中沒有空間EventR*Parity1009

奇偶校驗錯。硬件檢測到奇偶校驗錯誤7EventT*Full1010

發(fā)送緩沖區(qū)滿。在對發(fā)送字符排隊時,發(fā)送緩沖區(qū)滿EventDCB

1011

檢取端口DCB〔DeviceControlBlick〕時發(fā)生了沒有預料到的錯誤通信事件包含了下面的設置:常量

描述EvSend

1

發(fā)送緩沖區(qū)中的字符數比Sthreshold值低EvReceive

2

接收到了Rthreshold個字符。持續(xù)產生該事件,直到使用了Input屬性刪除了接收緩沖區(qū)中的數據EvCTS

3

CTS〔ClearToSend〕線改變EvDSR

4

DSR〔DataSetReady〕線改變。當DSR從1到0改變時,該事件發(fā)生EvCD

5

CD〔CarrierDetect〕線改變EvRing6檢測到響鈴信號。一些URAT〔UniversalAsynchronousReciver-

-Transmitters,通用異步收發(fā)器〕不支持該事件EvEOF

7

收到了EOF字符〔ASCII字符26〕Error消息〔MSm控件〕下表列出了MSm控件可捕獲的錯誤消息:常量

描述InvalidPropertyValue

380

無效的屬性值SetNotSupported

383

屬性只讀GetNotSupported

394

屬性只讀PortOpen

8000

端口翻開時該存在無效

8001

超時設置必須比0值大PortInvalid

8002

無效的端口號

8003

屬性只在運行時有效

8004

屬性在運行時是只讀的PortAleadyOpen

8005

端口已經翻開

8006

設備標識符無效或不支持

8007

不支持設備的波特率

8008

指定的字節(jié)大小無效

8009

缺省參數錯誤

8010

硬件不可用〔被其他設備鎖住〕

8011

函數不能分配隊列NoOpen

8012

設備沒有翻開

8013

設備已經翻開

8014

不能使用通信通知SetmStateFailed

8015

不能設置通信狀態(tài)

8016

不能設置通信事件屏蔽PortNotOpen

8018

該存在只在端口翻開是有效

8019

設備忙ReadError

8020

通信設備讀錯誤DCBError

8021

檢取端口設備控制塊時出現部錯誤搞清楚以上根本屬性后,就可以開場編寫通信許程序了。在VB5.0/6.0中新建一個工程文件。添加MicrosoftmControl5.0組件,在簡體Form1中參加mand命令按鈕并取名為CmdTest,MSm控件取名為MSm1,參加如下程序代碼。PrivateSubcmdTestClick()

'翻開串口MSml.mPort=2

'設定2IfMSml.PortOpen=FalseThenMSm1.Settings="9600,n,8,1"

'9600波特率,無校驗,8位數據位,1位停頓位MSm1.PortOpen=True

'翻開串口EndifMSm1.OutBufferCount=0

'清空發(fā)送緩沖區(qū)MSm1.InBufferCount=0

'滑空接收緩沖區(qū)'發(fā)送字符數據時注意必須用回車符〔vbcr〕完畢MSm1.Output="Thisisaqoodbook!"&vbCr'潑打或發(fā)送AT命令MSm1.Output="ATDT,&vbCr'發(fā)送字符數組數據時注意ByteArray必須事先定義賦值DimByteArrayasbyte()'定義動態(tài)數組ReDimByteArray(1)'重定義數組大小ByteArray(0)=0ByteArray(1)=1MSm1.Output=ByteArrayEndSubprivateSubMSmEvent()SelectCaseMSm1.mEventCaseEvReceiveDimBufferAsVariantMSm1.InputLen=0'接收二進制數據MSm1.InputMode=InputModeBinaryBuffer=MSm1.Input'接收字符數據MSm1.InputMode=InputModeTe*tBuffer=MSml.InputCaseelseEndSelectEndsub(程序1)二、中文Win95/98下的通信問題與解決方法1.接收的數據少于發(fā)送的數據

如果通過MSm控件一次性傳送較多的二進制數據,則,很可能收到的數據缺乏。例如在設置為24oobps傳輸率的情況下,一次性可以傳輸2048個字符數據則在大多數情況下。一次只能收到1200個字符左右,這址出為新版的MSm32.OC*中存在一個影響傳輸二進制數據的臭蟲〔bug〕.注意這不是特性。

32位WindowsAPI函數〔以下簡稱API〕使用了幾個用MTIMEOUTS構造表示的限時變量,WriteTotalTimeOutConstant即是其中的一個,它被Windows部設定為5000〔即5秒〕,這個常量決定了在通信驅動程序停頓傳輸之前花費在發(fā)送緩沖區(qū)中數據的時間的長短,5秒鐘意味著通信速度為1200bps情況下僅能發(fā)送600個字符,24oobps情況下僅能發(fā)送1200個左右的字符。事實上,在一個緩沖區(qū)一次性發(fā)送更多的數據是非??赡艿?。這個bug同樣也能引發(fā)問題,甚至在高速串口門通信情況下,即使系統(tǒng)在使用流控制,無論叢軟件流〔*on/*ofI〕還是硬件流〔CTS/RTS〕。假設數據在發(fā)送緩沖區(qū)中時,流控制停頓了傳輸,如果停頓時間超過5秒鐘.則數據就會喪失。在*些環(huán)境下,5秒鐘可能相當短.不過也不必擔憂,VB5.0/6.0版本的MSm控件有一個新增的重要的屬性稱為mID,mID指的是當串口被翻開時,被API所調用的串口句柄或稱標志,這也意味著能利用API接口函數去修改這個常量。每次串口關閉后,Windows會自動將之恢復為5000,所以,每次翻開串口后需要重斬設定以下API聲明,其代碼見下程序。TypeMTIMEOUTSReadIntervalTimeoutAsLongReadTotalTimeoutMultiplierAsLongReadTotalTimeoutConstantAsLongWriteTotalTimeoutMultiplierAsLongWriteTotalTimeoutConstantAsLongEndTypeDeclareFunctionSetmTimeoutsLib"Kernel32"(BYValhFileAsLong,lpmTimeoutsAsMTIMEOUTS)AsLongDeclareFunctionGetmTimeoutsLib"Kernel32"(ByValhFileAsLong,lpmTimeoutsAsMTIMEOUTS)AsLongDimtimeoutsAsMEOUTSDimRetAsLongIfm1.PortOpen=FalseThenm1.PortOpen=TrueEndifRet=GetmTimeouts(m1.mID,timeouts)'SetsomedefaulttimeoutstimeOuts.ReadIntervalTimeout=1timeouts.ReadTotalTimeoutMultiplier=1timeouts.ReadTotalTimeoutConstant=1timeouts.WriteTotalTimeoutMultiplier=1timeouts.WriteTotalTimeoutConstant=(m1.OutBufferSize\Val(m1.Settings))*10000+1000Ret=SetmTimeouts(m1.mID,timeouts)(程序2)2.如何發(fā)送大于128的字符數據

在通信程序中,以單字符方式逐個發(fā)送數據時,每一個數據圍0-255〔即十六進制的00-FF〕。在單字符版本的英文Win95或DOS版的BASIC程序中,只需要將相應的數據轉換成相應的字符發(fā)送到通信端口即可。但在中文Win95/98下卻行不通,假設在中文Win95/98下運行以下程序:DimiFori=0to255MSm1.Output=chr(i)Ne*ti

希望在接收端得到預期的0-255之間的數據,結果卻是:前129個數據接收正確,為0-128,后面127個數據為126個0和一個255,造成這種給果的原因在于中文Windows使用的是雙字節(jié)字符集〔DBCS〕系統(tǒng)。DBCS系統(tǒng)使用0-128之間的數字表示ASCII字符,大于128的數字僅作為前導字符,它只是顯示是一個非拉丁語系的字符,而并不代表實際意義。上述程序在調用CHR〔〕函數時用到了DBCS字符集,岡此產生了此類錯誤。則,如何發(fā)送人于128的數據呢?答案是使用字符數組,將以上程序改為:Dimcc(255)AsByteFori=0To255cc(i)=iNe*tiMSm1.Output=ccDoDoEventsLoopUntilMSm1.OutBufferCount=0'接收過程MSm1_Onm()SelectCaseMSm1.mEventCaseEvReceiveDimBufferAsVariant,b1,iMSm1.InputMode=InputModeBineryMSm1.InputLen=0Buffer=MSm1.InputFori=LBound(Buffer)ToUBound(Buffer)Debug.PrintBuffer(i);Ne*tiCase.....

3.如何發(fā)送0字符〔00H,NULL〕在VisuaIC++中使用串口控件發(fā)送0字符有些麻煩,但在VB5.0/6.0中只要注意以下兩點即可:〔1〕設置MSm控件的屬性NullDiscard=False;?!?〕使用二進制接收,即用MSm1.InputMode=InputModeBinary便可以解決問題;

4.如何發(fā)送遞中文字符串〔DBcS字符〕VB5.0/6.0的各種參考書上均指明MSm通信控件不能發(fā)送或接收雙字節(jié)字符集系統(tǒng)DBCS〕的二進制數據,這對于我國及亞洲一些使用DBCS字符集的國家不能不說是一大人遺憾。但是我在實踐中發(fā)現,用MSm控件也可以發(fā)送中文字符,具體方法有以下兩種:〔1〕直接發(fā)送

直接發(fā)送即把中文字符等同于英文字符。如:MSm1.Intput="這是一行中文數據!",但這種方法發(fā)送的中文數據不能太長,發(fā)送緩沖區(qū)和接收緩沖區(qū)的大小需設定為中文字符的兩倍以上,而且發(fā)送與接收系統(tǒng)所處的操作系統(tǒng)版本最好要一致,否則會出現接收或發(fā)送緩沖區(qū)溢出之類的錯誤。這種方法時用于一般要求不太高的場合?!?〕間接發(fā)送

在發(fā)送端將漢字或字符轉換為機器碼或區(qū)位碼數據數組,然后將詠轉換后的數據發(fā)送到串口,在接收端接收到數據后,按照相反的順序得到的數據轉換為相應的漢字或字符,在轉換過程中.要用到位運算,如取得漢字的碼后需要將高字節(jié)和低字節(jié)分開,而VB5.0/6.0中并沒有提供此類函數,以下是求整數高、低字節(jié)的函數。PublicFunctionHiByte(aAsInteger)Dimbb=aAnd&HFF00b=b/256Ifb<0Thenb=b+256HiByte=bEndFunctionPublicFunctionLowByte(aAsInteg`er)Dimbb=aAnd&HFFLowByte=bEndFunction5.如何用單機進展通信測試

通常在寫好了通信程序后需要兩臺PC或一臺Pc、一臺單片機.將通信口連接后進展測試,但很多時侯因條件限制僅有單臺PC機,測試工程很簡單,則能否測試呢?當然可以,而且方法也很簡單。對于九針的串口,找一個廢棄的串口鼠標,剝外鼠標線,將連接2、3針的線對接即可;對于25針的串口,找一枚曲別針〔最好有塑料外套的〕將它扯直,剝削去兩頭的塑料后在兩頭各彎一個圓圈,中間對忻后直接套接在串口的2、3針上即可。如果但心不夠平安,則可以將5針按地。'''

溫馨提示

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

評論

0/150

提交評論