版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序宝典VB串口通讯实例程序匠人2005-9-22 14:23:00阅读全文(3939) |回复(0)|弓I用(0)| nor查看匠人的百宝箱代理商品端口号选择1-4 当前一次取值 要显示的值和算平均值是的计数个数功能号标志1-4VB串口通讯实例 作者:liwenzhao 高精度电压表(24bit) VB 源程序 Dim PortValue As In teger Dim value As Double Dim value2 As Double Dim valueSum As Double Dim nu mCo unt As DoubleDim func As In teger Dim val
2、ueFlag As In teger/*Check1_Click()为控制 Comma nd是否 En abled Private Sub Check1_Click()自动刷新被选中则刷新按钮无效If Check1.value The nComma nd1.E nabled = FalseElseComma nd1.E nabled = TrueComma nd1.SetFocusEnd IfEnd Sub*/*Private Sub Comma nd1_Click() 显示Call displayEnd Sub*/Private Sub Comma nd2_Click() 复位 valueS
3、um = 0 清计数和显示复位numCou nt = 1 清计数个数 Label6.Capti on = Str( numCou nt - 1) value = 0当前一次取值value2 = 0要显示的值valueFlag = 0Call display End SubPrivate Sub Form_Activate()nu mCo unt = 1 value = 0 valueSum = 0PortValue = 1 Text1.Visible = False Label6.Captio n = 0 Optio n1(0).value = True Opti on 2(0).value
4、= True 为什么两个都是TrueComma nd1.SetFocusSetFocus 是什么?Label1.C aptio n = Format(value2, 0.000,000) Format 为格式输出函数For i = 0 To 3If Opti on 2(i).value = True The n func = i + 1End IfNext iCheck1.value = 1Call ComPortOpe nEnd SubPublic Sub ComPortOpe n() 开串口With MSComm1.CommPort = PortValue使用 COM1.Setti ngs
5、 = 9600,N,8,1 设置通信口参数.I nBufferSize = 40设置MSComn接收缓冲区为40字节.OutBufferSize = 2设置MSCom做送缓冲区为2字节VB中OutBufferSize 是以字符为单位的? ?n putMode = comI nputModeBi nary设置接收数据模式为二进制形式n putLe n = 1VB中InputLen单位是字符数设置In put 一次从接收缓冲读取字节数为1.SThreshold = 1VB中SThreshold单位是字符数设置Output 次从发送缓冲读取字节数为1.In BufferCou nt = 0 清除接收
6、缓冲区.OutBufferCou nt =0 清除发送缓冲区MaxW = -99最大值赋初值? ?MinW = 99最小值赋初值? ?w = 0数据个数计数器清零.RThreshold = 1On Error Resume Next?设置接收一个字节产生On Com事件/*打开串口,如打不开,则If .PortOpe n = False The n判断通信口是否打开.PortOpe n = TrueIf Err The nmsg = MsgBox(OKOnly,警告)vbOKOnly显示确定按钮Exit SubEnd IfEnd If*/Err,出现 msg.打开通信口 错误处理串口 COM
7、& PortValue & 无效!,vbEnd WithMsgBox 端口已打开End SubPublic Sub ComPortClose() 关串口MSComml.PortOpe n = FalseMsgBox 端口已关闭 End SubPrivate Sub MSComm1_O nComm() Call reciveEnd SubPrivate Sub Optio n1_Click(l ndex As In teger)If MSComm1.PortOpe n = True The nCall ComPortCloseEnd IfPortValue = Index + 1Call Com
8、PortOpe nEnd SubPrivate Sub recive()检测起始位并接收数据Dim Buffer As Varia ntDim Arr() As ByteDim in Data(5) As ByteDim count As In tegerDim temp As ByteMsgBox On CommWith MSComm1Select Case .CommEve nt判断 MSCommi信事件 CommEvent ?Case comEvReceive收到Rthreshold个字节产生的接收事件Buffer =n putArr = Buffer读取一个接收字节Text1.Text
9、 = Arr(0)If Arr(0) = &H1B Then&H表示是十六进制数,1B即27 ?是27.RThreshold = 0DoDoEve ntsDoEvents 是什么?Loop Until .InBufferCount = 4这里的4是不是应该是40For i = 1 To 4co unt =n BufferC ountBuffer =n putArr = Bufferin Data(i) = Arr(0)Next iIf in Data =&HA The nIf (in Data(1) Mod 64) = 32 The n.RThreshold = 1Exit SubEnd If
10、 valueFlag = 1 0.000003814697265625 temp = inData(1) Mod 16If temp = 64 The nIf value 100000 The n nu mCo unt = 1 valueSum = 0End IfIf valueFlag = 1 The n valueSum = valueSum + value value2 = valueSum / nu mCo unt nu mCo unt = nu mCo unt + 1 valueFlag = 0Label6.Capti on = Str(n umCou nt - 1) Str()为数
11、字转换成字符串函数End IfCase 3 最大值If value value2 Then value2 = valueEnd IfCase 4 最小值If value = 80 Then MSComml.l nBufferCou nt = 0End IfEnd Sub编程技巧Visual Basic串口通讯调试方法程序匠人 2005-10-22 19:48:00阅读全文(1192) |回复(0) | 引用(0) |查看匠人的百宝箱代理商品Visual Basic 串口通讯调试方法现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型
12、仪表,输出为RS-232C标准接口, 波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符均发送11位A SCII码,一个起始位。在 VB中与串口通讯需要引入控件 MSCom串口通讯控件(在Microsoft Comm Control 6.0中)。具体程序如下:控件简称:MSCDim Out(12) As Byte 接收 var 中的值Dim var As Varia nt接收 MSC. in put 中的数值Dim nRece As Integer 计算 MSC.inputbuffer 的个数Dim i As In teger, j As In teger随即变量,计算循环*P
13、rivate Sub Form_Load() ClearTextWith MSC.CommPort = 1 设置Com1为通信端口.Settings = 9600,E,7,2设置通信端口参数9600赫兹、偶校验、7个数据位、2个停止位.(这里需要进一步说明的是:.Setting= ” BBBB,P,D,S。含义是:B: Baud Rate (波特率);P: Parity (奇偶);D: Data Bit ; S: Stop Bit ).InBufferSize = 40 设置缓冲区接收数据为 40字节.In putLen = 1设置In put 一次从接收缓冲读取字节数为1.RThreshol
14、d = 1设置接收一个字节就产生 On Com事件End WithEnd Sub*Private Sub ClearText()Text3.Text =Text2.Text = 5Text1.Text =End SubPrivate Sub Comma nd1_Click()复位并打开串口ClearTextn Rece = 0 计数器清零是不是应该把前面的去掉啊? ?With MSC.In putMode = comI nputModeBi nary设置数据接收模式为二进制形式.1 nBufferCou nt = 0清除接收缓冲区If Not .PortOpe n The n.PortOpen
15、 = True 打开通信端口End IfEnd WithEnd SubPrivate Sub MSC_ On Comm()DelayTime 用来延续时间ClearTextWith MSCSelect Case .CommEvent 判断通信事件Case comEvReceive:收到Rthreshold个字节产生的接收事件SwichVar 1是个子过程If Out(1) = 2 The n判断是否为数据的开始标志.RThreshold = 0 关闭 On Com 事件接收End IfDoDoEve ntsLoop Un til .In BufferCou nt = 3循环等待接收缓冲区=3个
16、字节 n Rece = n Rece + 1For i = 2 To 12SwichVar iText1.Text = Text1.Text & Chr(Out(i)NextText1.Text = LTrim(Text1.Text)LTrim函数是将一个字符串中最前面的所有空格去掉Text2.Text = Text2.Text & CStr(nRece) CStr 同 Str.RThreshold = 1 打开 MSCom事件接收Case Else.PortOpe n = FalseEnd SelectEnd WithEnd Sub*Private Sub DelayTime()Dim bD
17、T As Boolea n逻辑型数据Dim sPrevious As Si ngle, sLast As Si ngle单精度bDT = TruesPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)Do While bDTIf Timer - sPrevious = 0.3 The n bDT = FalseLoopbDT = TrueEnd Sub(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送5 0帧数据,每帧数据有4个字节,即每秒发送200个字节,平
18、均5.0ms发送一个 字节,连续读取串口数据时要在程序中添加循环等待程序)Private Sub SwichVar(ByVal nNum As In teger)DelayTimevar = Nullvar = MSC.I nputOut( nNum) = var(0)End Sub(设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但 用In put属性读取数据时,不能直接赋值给Byte类型变量,只能通过先赋值给 一个Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型 数变量中。)Private Sub Text1_Cha
19、 nge()Text3.Text = CText(Text1.Text) - CText(Text2.Text)End Sub*Private Fun ction CText(ByVal str As Stri ng) As CurrencyByVal是什么?If str The nCText = CCur(Val(str)CCur是什么?ElseCText = 0End IfEnd Fun cti on(仪表每秒发送50帧数据,微机收到一帧完整数据至少需要 20 ms时间, 然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据, 不
20、会存有两帧以上数据,接收缓 冲区的大小不会影响实时监测效果(接收缓冲区 4字节),这时完全可以实现 实时监测或实时控制;如果微机在 20ms内不能将数据计算处理完毕,接收缓冲 区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数 据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理 之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定 在某一值,部分数据因不能及时采集到接收缓冲区中, 数据产生丢失现象,真实 工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不 利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲
21、区设置不能过大,以保证数据处理的实时性。)小结:本文所用的仪表为梅特勒公司出产的BE01型电子秤,其输出的每个编码均为标准的 ASCII码。其他的仪表存 在发射的编码中含有BCD压缩码,而且分为高低位,需要接收后对其进行解码换 算,之后还要将高位和低位数字进行相加, 即可以将其BCD码换算成实数。另还 存在误差的可能:判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码, 位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值, 取-51为极限最小值。暂时先写这些,当然其他的情况可以依此类推程序宝典一个简单的VB串口发送程序(源码)程序匠人 2005-10-2 14:36:0
22、0阅读全文(2675) |回复(2)1弓1用(0)|0T查看匠人的百宝箱代理商品一个简单的VB串口发送程序(源码)!-发送按钮Click事件子程序Private Sub Faso ng Click()机号5 Byte控制字 1 Byte结束字Dim JIHAO(O) As Byte Dim head_data As Byte Dim en d_data(0) As ByteTIMHTIMLhead_data =Val(Combo1.Text) INMOD en d_data(0) = &HFF If Combo2.Text = If Combo2.Text = If Combo2.Text =
23、增加 清空 删除IIIIIIThen head_data(1) = & H99Then head_data(1) = & H33Then head_data(1) = & H32Ready = 0: ErrCou nt = 0 On Error GoTo ERRORCOM打开错误处理If coml.Value Then MSComml.CommPort = 1If com2.Value The n MSComml.CommPort = 2Use com1Use com2MSComm1.Setti ngs = FORM1.Combo3.Text + 率和置校验和位为1MSComm1.I nput
24、Le n = 0MSComm1.PortOpe n = -1MSComm1.OutBufferCou nt = 0II,M,8,2设定波特Ope n the portJIHAO(0) = Val(Text3.Text) head_data(0) = Val(Text4.Text) head_data(2) = & HEE head_data(3) = & HEE设定波特率和发送至+MSComm1.Output = JIHAO发送机号MSComm1.PortOpe n = False关闭串口MSComm1.Setti ngs = FORM1.Combo3.Text + ,S,8,2 置校验和位为
25、空MSComm1.OutBufferCou nt = 0MSComm1.PortOpe n = TrueMSComm1.Output = head_dataMSComm1.Output = Text2.TextMSComm1.Output = en d_dataMSComm1.PortOpe n = FalseText1.Text = 发送成功! + Chr(13) & Chr(10) + Text3.Text + 屏体,+ 信息编号:+ Text4.Text + Chr(13) & Chr(10) + Chr(13) & Chr(10) + Text1.TextGoTo come ndERR
26、ORCOM:Text1.Text = ERROR! 请重新选择 COM口 ! + Chr(13) & Chr(10) + Chr(13) & Chr(10) + Text1.Text come nd:On Error GoTo 0End Sub越程序宝典一个非常好的串口程序程序匠人2005-10-2 14:32:00阅读全文(2287) |回复(0)|弓|用(0)| HOT查看匠人的百宝箱代理商品贴一个非常好的串口程序!(from iccavr)(ha nzhaowei)#i nclude #in clude #i nclude uart.h/* USART Buffer Defi nes *
27、/#defi ne USART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */#defi ne USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 ) #defi ne USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */#defi ne USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )#if ( USART_RX_BUFFER_SIZE & USART_RX_
28、BUFFER_MASK )#error RX buffer size is not a power of 2#en dif/* Static Variables */static un sig ned char USART_RxBufUSART_RX_BUFFER_SIZE;static volatile un sig ned char USART_RxHead;static volatile unsigned char USART_RxTail;static un sig ned char USART_TxBufUSART_TX_BUFFER_SIZE;static volatile un
29、sig ned char USART_TxHead;static volatile un sig ned char USART_TxTail;/*串口初始化*/void In itUSART(INT8U baudrate)NT8U x;UBRR0L = baudrate;UCSR0B = ( (1RXCIE0) | (1RXEN0) | (1“” Then 若命令输入框不空,则将其转换为十六进制数值echoch%=Val( “&H +echo.Text)Elseechoch%=&HF0否则确省命令为F0HEndIfcomm1.Output=Chr(echoch%)向串行口写入一字节命令,由 W
30、INDOWSEndIf 动将命令发出label3.Captio n=Hex(echoch%)显示刚发出的命令DoWhilecomm1.PortOpe nIfcomm1.InBufferCount 0Then 若 comm1.lnBufferCount 0 表示接受缓冲 ch$=comm1.lnput 区有数据,并读出一个字符,IfAsc(ch$)=echoch%The n 若与发出的命令相同,则退出当前循环ExitDo 进入下一循环EndIfElsecomm1.Output=Chr(echoch%)否则继续向下位机发命令,通知下位机EndIf 送数据dummy=DoEvents()让系统处理其
31、他消息Loop下位机接受到正确的命令,并回发命令正确时,进入下面循环i=1DoWhilecomm1.PortOpe nEndIfIfcomml .In BufferC ount 5The n ch$=comm1 .In putDoWhileAsc(ch$) v echoch% 以命令字节同步测试数据ch$=comm1 .In putLoopch1$=comm1.lnput 从WINDOW串行数据接受缓冲区读测试数据 ch2$=comm1 .In putch3$=comm1 .In putch4$=comm1 .In putnewf01 &=CL ng(CL ng(Asc(ch2$)*16*16
32、+Asc(ch1$)合并为一个整数newf02&=CL ng(CL ng(Asc(ch4$)*16*16+Asc(ch3$)ifnewf01& maxf01 &Then 判断最大值,最小值maxf01 &=n ewf01&EndIfIfnewf01& v minf01&Thenminf01&=n ewf01&EndIfIfnewf02& maxf02&Thenmaxf02&=n ewf02 &EndIfIfnewf02& v minf02&Thenmi nf02&=n ewf02 &labfOl.C aptio n=Str( newfOl &)显示数据labfO2.C aptio n=Str(
33、 newf02 &) labmaxfOl.Captio n=Str(maxfO1 &) labmi nfOl.Capti on=Str(mi nfO1&) labmaxfO2.Capti on=Str(maxfO2&) labmi nfO2.Captio n=Str(mi nfO2&) Elsecomm1.Output=Chr(echoch%)Endlfdummy=DoEve nts()LoopElse 在通讯过程中,按下cmdCOM按钮则停止通信,发出停止测试 cmdcomm.Captio n“通信”命令,关闭串行口,使退出按钮有效。comm1.Output=Chr(&H5F)comm1.PortOpe n=Falsecmdexit.E nabled=TrueEndIfEndSubSubcmdExit_Click()Ifcomm1.PortOpenThen 确认关闭串行口comm1.PortOpe n=FalseEndIfEnd 终止整个程序EndIfEndSubSubTimer1_Timer()更新显示时间Iflabtime.Captio nv Time&The nlabtime.Capti on=Time$EndIfEndSub3.程序说明:a. 上述程序的通信协议为:波特率9600,偶校验,8个数据位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业污水回收处理合同3篇
- 文艺演出国际演出合同3篇
- 搅拌站转让合同范本3篇
- 摩托车货物运输合同3篇
- 安徽铁路行业劳动合同样本3篇
- 房屋买卖建筑项目监理合同3篇
- 政府采购合同性质的演变与发展3篇
- 提前解除劳动合同赔偿3篇
- 政府机关电脑销售协议3篇
- 政务信息化建设项目公告3篇
- 2024年中考地理复习 人教版全四册重点知识提纲
- 电梯季度维护保养项目表
- GB/T 44188-2024危险货物爆炸品无约束包装件试验方法
- 机动车检测站质量手册(根据补充技术要求修订)
- 2024年(学习强国)思想政治理论知识考试题库与答案
- 基于LoRa通信的智能家居系统设计及研究
- YYT 0741-2009 数字化医用X射线摄影系统 专用技术条件
- 2024届高考考前强化之分析小说人物心理作用及变化过程
- 管道基坑开挖施工方案
- 广东省汕头市金平区2023-2024学年七年级上学期期末语文试题
- 计算机组成原理(商洛学院)智慧树知到期末考试答案2024年
评论
0/150
提交评论