首页 > 开发 > 综合 > 正文

Visual Basic串口通讯调试方法

2024-07-21 02:20:43
字体:
来源:转载
供稿:网友
现有电子秤一台,使用串口与计算机进行通讯。编写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 '接收msc.input中的数值
dim nrece as integer '计算msc.inputbuffer的个数
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()
 text3.text = ""
 text2.text = "5"
 text1.text = ""
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
   do
    doevents
   loop until .inbuffercount >= 3 '循环等待接收缓冲区>=3个字节
   ' nrece = nrece + 1
   for i = 2 to 12
    swichvar i
    text1.text = text1.text & chr(out(i))
   next
   text1.text = ltrim(text1.text)
   text2.text = text2.text & 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 = msc.input
 out(nnum) = var(0)

end sub

(设置接收数据模式采用二进制形式,即 inputmode=cominputmodebinary,但用input属性读取数据时,不能直接赋值给 byte 类型变量,只能通过先赋值给一个 variant 类型变量,返回一个二进制数据的数组,再转换保存到byte类型数变量中。)

private sub text1_change()

 text3.text = ctext(text1.text) - ctext(text2.text)

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为极限最小值。暂时先写这些,当然其他的情况可以依此类推!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表