現有電子秤一台,使用串列埠與計算機進行通訊。編寫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...