VB串列埠通訊例程

2022-11-18 10:18:02 字數 3459 閱讀 3652

現有電子秤一台,使用串列埠與計算機進行通訊。編寫vb程式來訪問串列埠,達到讀取電子秤上顯示的資料。該電子秤為be01型儀表,輸出為rs-232c標準介面,波特率為300-9600、偶校驗、7個資料位、2個停止位。

所有字元均傳送11位ascii碼,乙個起始位。在vb中與串列埠通訊需要引入控制項mscomm串列埠通訊控制項(在microsoft comm control 6.0中)。

具體程式如下:控制項簡稱:msc

dim out(12) as byte '接收var中的值

dim var as variant '接收中的數值

dim nrece as integer '計算的個數

dim i as integer, j as integer '隨即變數,計算迴圈

private sub form_load()

cleartext

with msc

.commport = 1 '設定com1為通訊埠

.settings = "9600,e,7,2" '設定通訊埠引數 9600赫茲、偶校驗、7個資料位、1個停止位.(這裡需要進一步說明的是:.

setting=」bbbb,p,d,s」。

含義是:b:baud rate(波特率);p:parity(奇偶);d:data bit;s:stop bit)

.inbuffersize = 40 '設定緩衝區接收資料為40位元組

.inputlen = 1 '設定input一次從接收緩衝讀取位元組數為1

.rthreshold = 1 '設定接收乙個位元組就產生oncomm事件

end with

end sub

private sub cleartext()

= ""

= "5"

= ""

end sub

private sub command1_click()

cleartext

' nrece = 0 '計數器清零

with msc

.inputmode = cominputmodebinary '設定資料接收模式為二進位制形式

.inbuffercount = 0 '清除接收緩衝區

if not .portopen then

.portopen = true '開啟通訊埠

end if

end with

end sub

private sub msc_oncomm()

delaytime 『用來延續時間

cleartext

with msc

select case .commevent '判斷通訊事件

case comevreceive: '收到rthreshold個位元組產生的接收事件

swichvar 1

if out(1) = 2 then '判斷是否為資料的開始標誌

.rthreshold = 0 '關閉oncomm事件接收

end if

dodoevents

loop until .inbuffercount >= 3 '迴圈等待接收緩衝區》=3個位元組

' nrece = nrece + 1

for i = 2 to 12

swichvar i

= & chr(out(i))

next

= ltrim(

= & cstr(nrece)

.rthreshold = 1 '開啟mscomm事件接收

case else

' .portopen = false

end select

end with

end sub

private sub delaytime()

dim bdt as boolean

dim sprevious as single, slast as single

bdt = true

sprevious = timer (timer可以計算從子夜到現在所經過的秒數,在microsoft windows中,timer函式可以返回一秒的小數部分)

do while bdt

if timer - sprevious >= 0.3 then bdt = false

loop

bdt = true

end sub

(通訊傳輸速率為9600bps,則最快速度1.04ms傳送乙個位元組,儀表每秒傳送50幀資料,每幀資料有4個位元組,即每秒傳送200個位元組,平均5.0ms 傳送乙個位元組,連續讀取串列埠資料時要在程式中新增迴圈等待程式)

private sub swichvar(byval nnum as integer)

delaytime

var = null

var =

out(nnum) = var(0)

end sub

(設定接收資料模式採用二進位制形式,即 inputmode="cominputmodebinary",但用input屬性讀取資料時,不能直接賦值給 byte 型別變數,只能通過先賦值給乙個 variant 型別變數,返回乙個二進位制資料的陣列,再轉換儲存到byte型別數變數中。)

private sub text1_change()

= ctext( - ctext(

end sub

private function ctext(byval str as string) as currency

if str <> "" then

ctext = ccur(val(str))

else

ctext = 0

end if

end function

(儀表每秒傳送50幀資料,微機收到一幀完整資料至少需要20 ms時間,然後再進行資料處理。如果微機在下一幀資料接收前即20ms內能將資料計算處理完畢,則接收緩衝區內只會儲存有一幀資料,不會存有兩幀以上資料,接收緩衝區的大小不會影響實時監測效果(接收緩衝區》4位元組),這時完全可以實現實時監測或實時控制;如果微機在20ms內不能將資料計算處理完畢,接收緩衝區設定得又很大,在資料計算處理完畢前,接收緩衝區內就會儲存有兩幀以上資料,而且一次工作時間越長,緩衝區內滯留資料幀就越多,資料採集和資料處理之間產生逐漸增大的額外時間差,當接收緩衝區充滿後,時間差不再增大,固定在某一值,部分資料因不能及時採集到接收緩衝區中,資料產生丟失現象,真實工作情況就會和微機處理結果產生較大的時間差,對實時監測和實時控制很不利,這種情況下接收緩衝區的大小就會影響實時監測效果,所以接收緩衝區設定不能過大,以保證資料處理的實時性。)

小結:本文所用的儀表為梅特勒公司出產的be01型電子秤,其輸出的每個編碼均為標準的ascii碼。其他的儀表存在發射的編碼中含有bcd壓縮碼,而且分為高低位,需要接收後對其進行解碼換算,之後還要將高位和低位數字進行相加,即可以將其bcd碼換算成實數。

另還存在誤差的可能:判斷最大值,儀表在剛開始工作時有干擾,會傳導一些亂碼,位移感測器有引數偏差,最大值一般都略大於50公釐,所以取51為極限最大值,取-51為極限最小值。暫時先寫這些,當然其他的情況可以依此類推!

VC 串列埠通訊

代翔在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex 控制項 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述 這兩種方法。一 microsoft communications control m...

TG串列埠通訊協議

tg 串列埠通訊協議 咸陽機場 微控制器與計算機均以11位元組為一包進行傳送資料微控制器快取 30h 3ah 50h 5ah 40h 4ah 62h 67h 功能位 命令上傳 a z,50h 5ah 命令下傳 a z 30h 3ah 開始位用中括號 結束位用中括號 微控制器上傳命令格式 微控制器下傳...

232 485串列埠通訊詳解

串列埠通訊詳解 一 rs 232 rs 232在1962年發布,命名為eia 232 e,作為工業標準,以保證不同廠家產品之間的相容。rs 232 c是美國電子工業協會eia electronic industry association 制定的一種序列物理介面標準。rs是英文 推薦標準 的縮寫,2...