![VB MSComm控件下串行通信在電子衡器中的應(yīng)用_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-12/14/0f52d7d8-bbdf-40dd-b87e-3d12d28e2166/0f52d7d8-bbdf-40dd-b87e-3d12d28e21661.gif)
![VB MSComm控件下串行通信在電子衡器中的應(yīng)用_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-12/14/0f52d7d8-bbdf-40dd-b87e-3d12d28e2166/0f52d7d8-bbdf-40dd-b87e-3d12d28e21662.gif)
![VB MSComm控件下串行通信在電子衡器中的應(yīng)用_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-12/14/0f52d7d8-bbdf-40dd-b87e-3d12d28e2166/0f52d7d8-bbdf-40dd-b87e-3d12d28e21663.gif)
![VB MSComm控件下串行通信在電子衡器中的應(yīng)用_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-12/14/0f52d7d8-bbdf-40dd-b87e-3d12d28e2166/0f52d7d8-bbdf-40dd-b87e-3d12d28e21664.gif)
![VB MSComm控件下串行通信在電子衡器中的應(yīng)用_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-12/14/0f52d7d8-bbdf-40dd-b87e-3d12d28e2166/0f52d7d8-bbdf-40dd-b87e-3d12d28e21665.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VB MSComm控件下串行通信在電子衡器中的應(yīng)用發(fā)布時(shí)間:2005年1月12日摘要:本文首先介紹了異步串行通信的工作方式,然后給出了VB MSComm控件下異步串行通信在電子衡器中的應(yīng)用實(shí)例,包括硬件接口及軟件設(shè)計(jì)。關(guān)鍵詞 :RS-232 異步串行通信 Visual Basic 電子衡器 控件 計(jì)算機(jī)一般提供了2個(gè)25針或9針的RS-232標(biāo)準(zhǔn)串行口,簡(jiǎn)稱為COM1和COM2。在某些應(yīng)用中,我們還可以通過(guò)插通信卡來(lái)獲得額外的RS-232標(biāo)準(zhǔn)串行口。利用這些串行口可以與其它數(shù)字設(shè)備進(jìn)行一般的數(shù)據(jù)通信,計(jì)算機(jī)的串行接口主要用于遠(yuǎn)程通信和低速輸入輸出設(shè)備。由于串行數(shù)據(jù)通信傳輸線條數(shù)最少,而且有許多
2、較便宜的專用芯片可實(shí)現(xiàn)它,發(fā)送和接受器也簡(jiǎn)單,因而對(duì)數(shù)據(jù)傳輸速度要求不高的計(jì)算機(jī)和數(shù)字設(shè)備間的近程通信,多采用串行通信實(shí)現(xiàn)。而目前各個(gè)廠家生產(chǎn)的電子衡器的稱重儀表多配有與上位機(jī)通信的RS232C串行接口,因而計(jì)算機(jī)與稱重儀表之間的數(shù)據(jù)通信用串口很容易實(shí)現(xiàn),只需要制作一條2芯或3芯的數(shù)據(jù)線編寫相應(yīng)的接口程序即可實(shí)現(xiàn),不需要增加其他硬件設(shè)備。采用這種方式組成的微機(jī)電子衡器有許多優(yōu)點(diǎn):稱重儀表經(jīng)過(guò)多年的發(fā)展,在數(shù)據(jù)采集、抗干擾、可靠性等方面技術(shù)成熟,質(zhì)量穩(wěn)定;而計(jì)算機(jī)在存儲(chǔ)容量、數(shù)據(jù)處理、查詢、統(tǒng)計(jì)報(bào)表等數(shù)據(jù)管理方面有明顯優(yōu)勢(shì)。正是兩者的完美結(jié)合,才使計(jì)算機(jī)與稱重儀表組成的在線式稱重管理系統(tǒng)得到了廣
3、泛的應(yīng)用。1串行通信的工作方式串行通信,可分為同步和異步兩種方式。異步方式是指在約定的波特率下,傳送和接受的數(shù)據(jù)不需要嚴(yán)格的保持同步,允許有相對(duì)的延遲,雖然速度較慢,但經(jīng)濟(jì)實(shí)用,所以異步串行通信現(xiàn)大量應(yīng)用于計(jì)算機(jī)接口技術(shù)中。計(jì)算機(jī)與稱重儀表就采用異步通信的方式傳送數(shù)據(jù)。1.1異步串行通信的數(shù)據(jù)格式在這種通信方式中,一般以一個(gè)字符為一幀。一幀最少由三部分組成:起始位、數(shù)據(jù)位、停止位,開(kāi)始是一位起始位以發(fā)送一個(gè)邏輯“0”表示,接著是表示這個(gè)數(shù)據(jù)的數(shù)據(jù)位,數(shù)據(jù)位可以是5位、6位、7位或8位,再加一位奇偶校驗(yàn)位,然后是一個(gè)、一個(gè)半或二個(gè)停止位,停止位以邏輯“1”表示。1.2波特率串行通信每秒傳送的位數(shù)
4、,傳送時(shí)先低位后高位。常用的波特率有600、1200、2400、4800、9600等。1.3端口在計(jì)算機(jī)中,一般都配有兩個(gè)標(biāo)準(zhǔn)串行口,用COM1和COM2表示。(通常采用2個(gè)9針D型陽(yáng)性插頭。)1.4信號(hào)線RS232C標(biāo)準(zhǔn)規(guī)定有25根連線,使用21個(gè)信號(hào)線。在我們討論的微機(jī)電子衡器中僅用到3根信號(hào)線,它們是:發(fā)送數(shù)據(jù)線TXD(輸出信號(hào)),接受數(shù)據(jù)線RXD(輸入信號(hào)線),信號(hào)地GND。其余信號(hào)線定義可參考相關(guān)書籍。2串行通信在電子衡器中的應(yīng)用實(shí)例串行通信接口設(shè)計(jì),包括硬件、軟件設(shè)計(jì)兩部分。在WINDOWS操作系統(tǒng)下,可選用VC+、VB等可視化開(kāi)發(fā)工具。下面將以上海耀華稱重系統(tǒng)公司的XK3190A
5、1+為例,以VB6.0編程語(yǔ)言,說(shuō)明串行通信的軟、硬件設(shè)計(jì)過(guò)程。2.1稱重儀表儀表選用上海耀華XK31901+儀表,其串口通信格式如下:2.1.1連續(xù)方式發(fā)送:所傳送的數(shù)據(jù)為儀表顯示的當(dāng)前稱量(毛重或凈重),每幀數(shù)據(jù)由12組數(shù)據(jù)組成。第X組內(nèi) 容 及 注 釋102(XON) 開(kāi)始2+或- 符號(hào)位 3稱量數(shù)據(jù) 高位 :稱量數(shù)據(jù) : :稱量數(shù)據(jù) :8稱量數(shù)據(jù) 低位9小數(shù)點(diǎn)位數(shù) 從右到左(04)10異或校驗(yàn) 高四位11異或校驗(yàn) 低四位1203(XOFF) 結(jié)束2.1.2指令方式發(fā)送:通信協(xié)議內(nèi)容較多,詳見(jiàn)XK3190A1+專業(yè)技術(shù)手冊(cè)。2.2硬件構(gòu)成一臺(tái)計(jì)算機(jī)通過(guò)串口既可與一臺(tái)稱重儀表進(jìn)行通信,也可
6、與多臺(tái)稱重儀表進(jìn)行通信。2.2.1計(jì)算機(jī)與一臺(tái)稱重儀表通信計(jì)算機(jī)串行口與稱重儀表串行口通過(guò)通信電纜直接相連.2.2.2計(jì)算機(jī)與多臺(tái)稱重儀表通信計(jì)算機(jī)配置有兩個(gè)標(biāo)準(zhǔn)串行口,最多可與兩臺(tái)稱重儀表通信,但通過(guò)添加多串口卡或采用RS485總線可實(shí)現(xiàn)與多臺(tái)稱重儀表通信。RS485總線傳輸距離遠(yuǎn),只用普通雙絞線即可掛接多至256個(gè)終端。計(jì)算機(jī)無(wú)RS485接口,計(jì)算機(jī)端可選用RS232/RS485轉(zhuǎn)換器,如波士485C。稱重儀表可選用帶RS485接口的儀表,如杭州科利的XK3128儀表,或加RS232/RS485轉(zhuǎn)換器。2.3軟件設(shè)計(jì)用VB開(kāi)發(fā)串口通信程序常用兩種方法,一種是利用WINDOWS的通信API函
7、數(shù)實(shí)現(xiàn),另一種是采用VB內(nèi)集成的MSComm通信控件實(shí)現(xiàn)。實(shí)踐證明,MSComm控件提供的串行通信功能已能滿足一般數(shù)據(jù)采集和控制系統(tǒng)的RS-232串行通信要求。MSComm控件通過(guò)串行端口發(fā)送和接收數(shù)據(jù),向應(yīng)用程序提供串行通信,該控件具有豐富的與串口通信密切相關(guān)的屬性和事件,提供了對(duì)串口的各種操作。在實(shí)例中選用MSComm控件實(shí)現(xiàn)串口通信的編程。2.3.1 MSComm控件的主要屬性及事件CommPort屬性:設(shè)置并返回通信端口號(hào)。在設(shè)計(jì)時(shí),可取1到16的任何數(shù)(缺省值為1)。PortOpen屬性:設(shè)置并返回通信端口的狀態(tài)(打開(kāi)或關(guān)閉)。Settings屬性:指定或返回波特率、奇偶性、數(shù)據(jù)位及
8、終止位參數(shù)。格式為:“波特率,奇偶校驗(yàn)位,數(shù)據(jù)位的位數(shù),停止位的位數(shù)”。Sthreshold屬性:在MSComm控件設(shè)置CommEvent屬性為ComEvsend并產(chǎn)生OnComm事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。若設(shè)置Sthreshold屬性為0(缺省值),數(shù)據(jù)傳輸事件不會(huì)產(chǎn)生OnComm事件。Rthreshold屬性:指定或返回在MSComm控件將CommEvent屬性設(shè)置為ComEvReceive并生成OnComm事件之前所要接收的字符數(shù)目。若將Rthreshold屬性設(shè)置為0(默認(rèn)值),將在接收字符時(shí)禁止生成OnComm事件。InputLen屬性:指定或返回Input屬
9、性從接收緩沖區(qū)中讀到的字符數(shù)目。設(shè)置屬性為0表示Input讀取整個(gè)緩沖區(qū)的內(nèi)容。Input屬性:從接收緩沖區(qū)中返回并刪除一串字符。Output屬性:向發(fā)送緩沖區(qū)寫一個(gè)字符串。OnComm事件:當(dāng)CommEvent屬性值更改時(shí)出現(xiàn),表明出現(xiàn)了一個(gè)通信事件或一個(gè)錯(cuò)誤。CommEvent屬性:包含一個(gè)最近通信事件或錯(cuò)誤的值。例如:屬性值為ComEvReceive(值為2),接收緩沖區(qū)內(nèi)字符數(shù)達(dá)到Rthreshold指定的值。2.3.2接口程序部分源代碼在窗體中添加MSComm通信控件、TEXTBOX文本框控件及TIMER定時(shí)器控件,設(shè)置控件屬性、編寫事件代碼即可實(shí)現(xiàn)串口通信,用VB6.0編程的部分代
10、碼設(shè)計(jì)如下:儀表采用連續(xù)方式發(fā)送數(shù)據(jù):(不適合于RS485總線方式)串口初始化模塊:Private Sub Form_Initialize() MSComm1.CommPort=1 使用COM1口MSComm1.Settings=”4800,N,8,1” 4800波特率,無(wú)奇偶校驗(yàn),8位數(shù)據(jù)位,1位停止位MSComm1.InputLen=0 輸入時(shí)讀整個(gè)緩沖區(qū)Timer1.Interval=500 設(shè)置定時(shí)器定時(shí)時(shí)間MSComm1.PortOpen=True 打開(kāi)端口Timer1.Enabled=True 打開(kāi)定時(shí)器End sub 數(shù)據(jù)讀取及顯示模塊:Private Sub Ti
11、mer1_Time()Dim Instring As String 變量定義Dim Disstring As stringDim I As longInstring=MSComm1.Input 取6位重量數(shù)據(jù)并顯示I=InStr(1,Instring,CHR()Disstring=Mid(Instring,I,6)Text1=DisstringEnd sub退出模塊:Private Sub Form_QueryunLoad()MSComm1.PortOpen=False 關(guān)閉端口Timer1.Enabled=False 關(guān)閉定時(shí)器End sub 儀表以指令方式發(fā)送數(shù)據(jù):(適合于以
12、上各種方式)以讀取地址為A(01)的稱重儀表的數(shù)據(jù)為例,讀取其他地址儀表的數(shù)據(jù)依次類推。串口初始化模塊:Private Sub Form_Initialize()MSComm1.CommPort=1 使用COM1口MSComm1.Settings=”4800,N,8,1” 4800波特率,無(wú)奇偶校驗(yàn),8位數(shù)據(jù)位,1位停止位MSComm1.InputLen=0 輸入時(shí)讀整個(gè)緩沖區(qū)MSComm1.PortOpen=True 打開(kāi)端口End sub數(shù)據(jù)讀取及顯示模塊:Private Sub Command1_Click()Dim Instring As String 變量定義MSComm1.Outp
13、ut=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3) 計(jì)算機(jī)發(fā)送指令: 讀A(01)地址稱重儀表的毛重值Do While MSComm1.inbuffercount14 等待接收全部數(shù)據(jù) DoeventsLoopInstring=MSCcomm1.Input 取重量數(shù)據(jù)并顯示Text1=InstringEnd sub退出模塊:Private Sub Form_QueryunLoad()MSComm1.PortOpen=False 關(guān)閉端口End sub 3結(jié)束語(yǔ)串行通信作為一種技術(shù)成熟、方便可靠的通信方式,不失為一種有效的通信手段,因此被廣泛應(yīng)用于工
14、業(yè)控制中。計(jì)算機(jī)與電子衡器在串行異步通信中,除了應(yīng)保證通信雙方的波特率一致外,為了能夠成批傳送數(shù)據(jù),還應(yīng)保證數(shù)據(jù)幀同步,以免數(shù)據(jù)到達(dá)端口的速度太快,通信設(shè)備可能來(lái)不及將數(shù)據(jù)移入接收緩沖區(qū),造成緩沖區(qū)溢出而導(dǎo)致數(shù)據(jù)丟失。VisualBasic 版 (精華區(qū))發(fā)信人:Love1976(狄飛驚),信區(qū):VisualBasic標(biāo)題:用MSCOMM控件實(shí)現(xiàn)串口通信(經(jīng)典文章了,轉(zhuǎn)自木棉)發(fā)信站:BBS水木清華站(SatApr115:17:292000)這篇文章好象很早就看到了,不過(guò)精華區(qū)里還沒(méi)有?,F(xiàn)在從木棉轉(zhuǎn)過(guò)來(lái),沒(méi)看過(guò)的網(wǎng)友還是可以好好看看的。發(fā)信人:nyrx(飛的好累又不想停),信區(qū):VisualB
15、asic標(biāo)題:Re:問(wèn)個(gè)問(wèn)題發(fā)信站:華南網(wǎng)木棉站(SunMar2621:02:412000),轉(zhuǎn)信MSComm控件實(shí)現(xiàn)中文Win9x下的通信VB5.0/6.0的MSComm通信控件提供了一系列標(biāo)準(zhǔn)通信命令的接口,它允許建立串口連接,可以連接到其他通信設(shè)備(如Modem)、還可以發(fā)送命令、進(jìn)行數(shù)據(jù)交換以及監(jiān)視和響應(yīng)在通信過(guò)程中可能發(fā)生的各種錯(cuò)誤和事件,從而可以用它創(chuàng)建全雙工的、事件驅(qū)動(dòng)的、高效實(shí)用的通信程序。但在實(shí)際通信軟件設(shè)計(jì)過(guò)程中,MSComm控件并非像想像中那樣完美和容易控制,特別是在中文Win95/98下通信時(shí)更會(huì)出現(xiàn)問(wèn)題。下面就從基礎(chǔ)開(kāi)始介紹,然后逐步討論MSComm控件在編程中出現(xiàn)的
16、問(wèn)題以及編程技巧。一用MSComm控件通信1串口通信基礎(chǔ)知識(shí)一般說(shuō)來(lái),計(jì)算機(jī)都有一個(gè)或多個(gè)串行端口,它們依次為Com1、Com2、.。這些串口還提供了外部設(shè)備與PC進(jìn)行數(shù)據(jù)傳輸和通信的通道,這些串口在CPU和外設(shè)之間充當(dāng)解釋器的角色。當(dāng)字符數(shù)據(jù)從CPU發(fā)送給外設(shè)時(shí),這些字符數(shù)據(jù)將被轉(zhuǎn)換成串行比特流數(shù)據(jù);當(dāng)接收數(shù)據(jù)時(shí),比特流數(shù)據(jù)被轉(zhuǎn)換為字符數(shù)據(jù)傳遞給CPU。再進(jìn)一步說(shuō),在操作系統(tǒng)方面,Windows用通信驅(qū)動(dòng)程序(COMM.DRV)調(diào)用API函數(shù)發(fā)送和接收數(shù)據(jù)。當(dāng)用通信控件或聲明調(diào)用API函數(shù)時(shí),它們由COMM.DRV解釋并傳遞給設(shè)備驅(qū)動(dòng)程序。作為一個(gè)VB程序員,要編寫通信程序,只需知道通信控件
17、提供給Windows通信API函數(shù)的接口即可,換句話說(shuō),只需設(shè)定和監(jiān)視通信控件的屬性和事件即可。2使用MSComm控件在開(kāi)始使用MSComm控件之前,需要先了解其屬性(見(jiàn)下表)。在開(kāi)始使用MSComm控件之前,需要先了解其屬性(見(jiàn)下表)。屬性描述數(shù)據(jù)類型舉例CommPort設(shè)置并返回通信端口號(hào)Integer2Settings設(shè)置并返回波特率、校驗(yàn)位、數(shù)據(jù)位、停止位String9600,N,8,1PortOpen設(shè)置并返回端口狀態(tài),也可以用于打開(kāi)和關(guān)閉串口BooleanTrueOutBufferSize設(shè)置并返回發(fā)送緩沖區(qū)的大小,以字符為單位Integer512InBufferSize設(shè)置并返回
18、接收緩沖區(qū)的大小,以字符為單位設(shè)置并返回接收緩沖區(qū)的大小,以字符為單位Integer1024SThreshold設(shè)置并返回發(fā)送時(shí)產(chǎn)生ONComm事件的字符數(shù)Integer0不產(chǎn)生ONComm事件RThreshold設(shè)置并返回接收時(shí)產(chǎn)生ONComm事件的字符數(shù)Integer8收到8個(gè)字符時(shí)發(fā)生OnComm事件NullDiscard設(shè)定是否忽略發(fā)送0(Null)字符BolleanTrue不發(fā)送,F(xiàn)alse發(fā)送InputMode設(shè)置并返回接收類型ComInputModeText字符方式,ComInputModeBinary二進(jìn)制方式InputLen設(shè)置并返回從接收緩沖區(qū)讀取的字符Integer256
19、搞清楚以上基本屬性后就可以開(kāi)始編寫通信程序了:在VB5.0/6.0中新建一個(gè)工程搞清楚以上基本屬性后就可以開(kāi)始編寫通信程序了:在VB5.0/6.0中新建一個(gè)工程文件,添加MicrosoftCommcontrol5.0組件,在窗體Form1中加入Command命令按鈕并取名為cmdTest,MSComm控件取名為MSComm1,寫入以下代碼:PrivateSubcmdTest_Click()打開(kāi)串口MSComm1.CommPort=2設(shè)定Com2IfMSComm1.PortOpen=FalseThenMSComm1.Settings=9600,n,8,19600波特率,無(wú)校驗(yàn),8位數(shù)據(jù)位,1位停
20、止位MSComm1.PortOpen=True打開(kāi)串口EndIfMSComm1.OutBufferCount=0清空發(fā)送緩沖區(qū)MSComm1.InBufferCount=0清空接收緩沖區(qū)發(fā)送字符數(shù)據(jù),注意必須用回車符(vbCr)結(jié)束MSComm1.Output=Thisisagoodbook!&vbCr撥打電話號(hào)碼或發(fā)送AT命令MSComm1.Output=ATDT&vbCrMSComm1.Output=ATDT&vbCr發(fā)送字符數(shù)組數(shù)據(jù),注意ByteArray必須事先定義賦值DimByteArrayasbyte()定義動(dòng)態(tài)數(shù)組ReDimByteArray(1)重定義數(shù)組大小ByteArray
21、(0)=0ByteArray(1)=1MSComm1.Output=ByteArrayEndSubPrivateSubMSComm1_OnComm()SelectCaseMSComm1.CommEventCasecomEvReceive接收字符數(shù)據(jù)DimBufferAsVariantMSComm1.InputLen=0MSComm1.InputMode=comInputModeBinaryBuffer=MSComm1.Input接收二進(jìn)制數(shù)據(jù)MSComm1.InputMode=comInputModeTextBuffer=MSComm1.InputCaseelseCaseelseEndSele
22、ctEndSub二中文Win95/98下的通信問(wèn)題與解決方法1接收的數(shù)據(jù)少于發(fā)送的數(shù)據(jù)如果通過(guò)MSComm控件一次性傳送較多的二進(jìn)制數(shù)據(jù),那么,很可能收到的數(shù)據(jù)不足。例如在設(shè)置為2400bps傳輸率的情況下,一次性可以傳輸2048個(gè)字符數(shù)據(jù),那么在大多數(shù)情況下一次只能收到1200個(gè)字符左右,這是因?yàn)樾掳娴腗SComm32.OCX中存在一個(gè)影響傳輸二進(jìn)制數(shù)據(jù)的臭蟲(chóng)(bug),注意這不是特性。32位WindowsAPI函數(shù)(以下簡(jiǎn)稱API)使用了幾個(gè)用COMMTIMEOUTS結(jié)構(gòu)表示的限時(shí)變量,WriteTotalTimeOutConstant即是其中的一個(gè),它被Windows內(nèi)部設(shè)定為5000(
23、即5秒),這個(gè)常量決定了在通信驅(qū)動(dòng)程序停止傳輸之前花費(fèi)在發(fā)送緩沖區(qū)中數(shù)據(jù)的時(shí)間的長(zhǎng)短。5秒鐘意味著通信速度為1200bps情況下僅能發(fā)送600個(gè)字符,2400bps情況下僅能發(fā)送1200個(gè)左右的字符。事實(shí)上,在一個(gè)緩沖區(qū)內(nèi)一次性發(fā)送更多的數(shù)據(jù)是非常可能的。這個(gè)bug同樣也能引發(fā)問(wèn)題,甚至在高速串口通信情況下,即使系統(tǒng)在使用流控制,無(wú)論是軟件流(Xon/Xoff)還是硬件流(CTS/RTS)。假如數(shù)據(jù)在發(fā)送緩沖區(qū)中時(shí)流控制停止了傳輸,如果停止時(shí)間超過(guò)5秒鐘,則數(shù)據(jù)就會(huì)丟失。在某些環(huán)境下,5秒鐘可能相當(dāng)短,不過(guò)也不必?fù)?dān)心,VB5.0/6.0版本的MSComm控件有一個(gè)新增的重要的屬性稱為CommI
24、D,CommID指的是當(dāng)串口被打開(kāi)時(shí),被API所調(diào)用的串口句柄或稱標(biāo)志,這也意味著能利用API接口函數(shù)去修改這個(gè)常量。每次串口關(guān)閉后,Windows會(huì)自動(dòng)將之恢復(fù)為5000,所以,每次打開(kāi)串口后需要重新設(shè)定以下API聲明,其代碼如下。TypeCOMMTIMEOUTSReadIntervalTimeoutAsLongReadTotalTimeoutMultiplierAsLongReadTotalReadIntervalTimeoutAsLongReadTotalTimeoutMultiplierAsLongReadTotalTimeoutConstantAsLongWriteTotalTime
25、outMultiplierAsLongWriteTotalTimeoutConstantAsLongEndTypeDeclareFunctionSetCommTimeoutsLibKernel32(ByValhFileAsLong,lpCommTimeoutsAsCOMMTIMEOUTS)AsLongDeclareFunctionGetCommTimeoutsLibKernel32(ByValhFileAsLong,lpCommTimeoutsAsCOMMTIMEOUTS)AsLongDimtimeoutsAsCOMMTIMEOUTSDimRetAsLongIfComm1.PortOpen=F
26、alseThenComm1.PortOpen=TrueEndIfRet=GetCommTimeouts(Comm1.CommID,timeouts)Setsomedefaulttimeoutstimeouts.ReadIntervalTimeout=1timeouts.ReadTotalTimeoutMultiplier=1timeouts.ReadTotalTimeoutConstant=1timeouts.WriteTotalTimeoutMultiplier=1timeouts.WriteTotalTimeoutConstant=(Comm1.OutBufferSizeVal(Comm1
27、.Settings)*10000+1000Ret=SetCommTimeouts(Comm1.CommID,timeouts)Ret=SetCommTimeouts(Comm1.CommID,timeouts)(程序1)2如何發(fā)送大于128的字符數(shù)據(jù)在通信程序中,以單字符方式逐個(gè)發(fā)送數(shù)據(jù)時(shí),每一個(gè)數(shù)據(jù)范圍為0-255(即十六進(jìn)制的00-FF)。在單字符版本的英文Win95或DOS版的BASIC程序中,只需要將相應(yīng)的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的字符發(fā)送到通信端口即可。但在中文Win95/98下卻行不通,假設(shè)在中文Win95/98下運(yùn)行以下程序:DIMiFori=0To255MSComm1.Output=ch
28、r(i)Nexti希望在接收端得到預(yù)期的0-255之間的數(shù)據(jù),結(jié)果卻是:前129個(gè)數(shù)據(jù)接收正確,為0-128,后面127個(gè)數(shù)據(jù)為126個(gè)0和一個(gè)255。造成這種結(jié)果的原因在于中文Windows使用的是雙字節(jié)字符集(DBCS)系統(tǒng)。DBCS系統(tǒng)使用0-128之間的數(shù)字表示ASCII字符,大于128的數(shù)字僅作為前導(dǎo)字符,它只是顯示是一個(gè)非拉丁語(yǔ)系的字符,而并不代表實(shí)際意義。上述程序在調(diào)用CHR()函數(shù)時(shí)用到了DBCS字符集,因此產(chǎn)生了此類錯(cuò)誤。那么,如何發(fā)送大于128的數(shù)據(jù)呢?答案是使用字節(jié)數(shù)組,將以上程序改為:Dimcc(255)AsByteFori=0To255cc(i)=iNextiMSCo
29、mm1.Output=ccDoDoDoEventsLoopUntilMSComm1.OutBufferCount=0接收過(guò)程MSComm1_OnComm()SelectCaseMSComm1.CommEventCasecomEvReceiveDimBufferAsVariant,b1,iMSComm1.InputMode=comInputModeBinaryMSComm1.InputLen=0Buffer=MSComm1.InputFori=LBound(Buffer)ToUBound(Buffer)Debug.PrintBuffer(i);Nexticase.3如何發(fā)送0字符(00H,NUL
30、L)在VisualC+中使用串口控件發(fā)送0字符有些麻煩,但在VB5.0/6.0中只要注意以下兩點(diǎn)即可:(1)設(shè)置MSComm控件的屬性NullDiscard=False;(2)使用二進(jìn)制接收,即用MSComm1.InputMode=comInputModeBinary便可以解決問(wèn)題;4如何發(fā)送中文字符串(DBCS字符)VB5.0/6.0的各種參考書上均指明MSComm通信控件不能發(fā)送或接收雙字節(jié)字符集系VB5.0/6.0的各種參考書上均指明MSComm通信控件不能發(fā)送或接收雙字節(jié)字符集系統(tǒng)(DBCS)的二進(jìn)制數(shù)據(jù),這對(duì)于我國(guó)及亞洲一些使用DBCS字符集的國(guó)家不能不說(shuō)是一大遺憾。但是我在實(shí)踐中發(fā)
31、現(xiàn),用MSComm控件也可以發(fā)送中文字符,具體方法有兩種:(1)直接發(fā)送直接發(fā)送即把中文字符等同于英文字符。如:MSComm1.output=這是一行中文數(shù)據(jù)!,但這種方法發(fā)送的中文數(shù)據(jù)不能太長(zhǎng),發(fā)送緩沖區(qū)和接收緩沖區(qū)的大小需設(shè)定為中文字符的兩倍以上,而且發(fā)送與接收系統(tǒng)所處的操作系統(tǒng)版本最好要一致,否則會(huì)出現(xiàn)接收或發(fā)送緩沖區(qū)溢出之類的錯(cuò)誤。這種方法可用于一般要求不太高的場(chǎng)合。(2)間接發(fā)送在發(fā)送端將漢字或字符轉(zhuǎn)換為機(jī)器內(nèi)碼或區(qū)位碼數(shù)據(jù)數(shù)組,然后將轉(zhuǎn)換后的數(shù)據(jù)發(fā)送到串口,在接收端接收到數(shù)據(jù)后,按照相反的順序?qū)⒌玫降臄?shù)據(jù)轉(zhuǎn)換為相應(yīng)的漢字或字符。在轉(zhuǎn)換過(guò)程中,要用到位運(yùn)算,如取得漢字的內(nèi)碼后需要將高字節(jié)和低字節(jié)分開(kāi),而VB5.0/6.0中并沒(méi)有提供此類函數(shù),以下是求整數(shù)高、低字節(jié)的函數(shù)。PublicFunctionHiByte(aAsInteger)Dimbb=aAnd&HFF00b=b/256Ifb0Thenb=b+256HiByte=bEndFunctionPublicFunctionLowByte(aAsInteger)DimbDimbb=aAnd&HFFLowByte=bEndFunction5如何更精準(zhǔn)地計(jì)算時(shí)間差在通信過(guò)程中,特別是在工業(yè)控制中,需要每隔若干秒做某
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年山東公務(wù)員考試行測(cè)試題
- 2025年太陽(yáng)能光伏組件安裝服務(wù)合同
- 2025年商業(yè)地產(chǎn)租賃協(xié)議深度剖析
- 2025年醫(yī)院食堂食用油采購(gòu)協(xié)議
- 2025年紫外光固化油墨項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 2025年互聯(lián)網(wǎng)用戶權(quán)益協(xié)議
- 2025年貨運(yùn)司機(jī)勞動(dòng)合同
- 2025年腫瘤類生物制品項(xiàng)目提案報(bào)告模范
- 2025年保障性住房貸款合同
- 2025年標(biāo)準(zhǔn)個(gè)人古董押借款合同樣本
- 輔導(dǎo)員入職培訓(xùn)課件
- 中建雨季專項(xiàng)施工方案
- 《我國(guó)個(gè)人所得稅制下稅收征管問(wèn)題研究》
- 建筑工程三通一平技術(shù)方案
- 綠化養(yǎng)護(hù)工安全培訓(xùn)
- DB21-T 1720-2017海水源熱泵系統(tǒng)工程技術(shù)規(guī)程
- 組長(zhǎng)競(jìng)選課件教學(xué)課件
- 《基于UTAUT2模型的虛擬學(xué)術(shù)社區(qū)用戶持續(xù)使用意愿影響因素研究》
- 2022年公務(wù)員多省聯(lián)考《申論》真題(遼寧A卷)及答案解析
- 2024 ESC慢性冠脈綜合征指南解讀(全)
- 消防設(shè)施操作員(初級(jí))題庫(kù)與參考答案
評(píng)論
0/150
提交評(píng)論