【VB开源代码栏目提醒】:网学会员为广大网友收集整理了,[通信/电子]VB串口通信源程序 - 电子电信,希望对大家有所帮助!
程序宝典
VB串口通讯实例 程序匠人 2005-9-22 14:23:00 阅读全文3939 回复0 引用0 查看《匠人的百宝箱》代理商品
VB串口通讯实例 作者liwenzhao 高精度电压表24bit
VB源程序 Dim PortValue As Integer 端口号选择1-4 Dim value As Double 当前一次取值 Dim value2 As Double 要显示的值 Dim valueSum As Double 和 Dim numCount As Double 算平均值是的计数个数 Dim func As Integer 功能号标志1-4 Dim valueFlag As Integer / Check1_Click为控制Command1是否Enabled Private Sub Check1_Click 自动刷新 被选中则 刷新按钮无效 If Check1.value Then Command1.Enabled False Else Command1.Enabled True Command1.SetFocus End If End Sub / / Private Sub Command1_Click 显示 Call display End Sub / Private Sub Command2_Click 复位 valueSum 0 清计数和 numCount 1 清计数个数 Label6.Caption StrnumCount - 1 显示复位 value 0 当前一次取值 value2 0 要显示的值 valueFlag 0 Call display End Sub Private Sub Form_Activate numCount 1 value 0 valueSum 0 PortValue 1 Text1.Visible False Label6.Caption quot0quot Option10.value True Option20.value True 为什么两个都是True Command1.SetFocus SetFocus是什么 Label1.Caption Formatvalue2 quot0.000000quot Format为格式输出函数 For i 0 To 3 If Option2i.value True Then func i 1 End If Next i Check1.value 1 Call ComPortOpen End Sub Public Sub ComPortOpen 开串口 With MSComm1 .CommPort PortValue 使用COM1 .Settings quot9600N81quot 设置通信口参数 .InBufferSize 40 设置MSComm1接收缓冲区为40字节 .OutBufferSize 2 设置MSComm1发送缓冲区为2字节
VB中OutBufferSize是以字符为单位的 .InputMode comInputModeBinary 设置接收数据模式为二进制形式 .InputLen 1
VB中InputLen单位是字符数 设置Input 一次从接收缓冲读取字节数为1 .SThreshold 1
VB中SThreshold单位是字符数 设置Output 一次从发送缓冲读取字节数为1 .InBufferCount 0 清除接收缓冲区 .OutBufferCount 0 清除发送缓冲区 MaxW -99 最大值赋初值 MinW 99 最小值赋初值 w 0 数据个数计数器清零 .RThreshold 1 On Error Resume Next 设置接收一个字节产生OnComm事件 / 打开串口如打不开则Err出现msg???? If .PortOpen False Then 判断通信口是否打开 .PortOpen True 打开通信口 If Err Then 错误处理 msg MsgBoxquot 串口 COMquot amp PortValue amp quot 无效 quot vbOKOnly quot警告quot vbOKOnly显示确定按钮 Exit Sub End If End If / End With MsgBox quot端口已打开quot End Sub Public Sub ComPortClose 关串口 MSComm1.PortOpen False MsgBox quot端口已关闭quot End Sub Private Sub MSComm1_OnComm Call recive End Sub Private Sub Option1_ClickIndex As Integer If MSComm1.PortOpen True Then Call ComPortClose End If PortValue Index 1 Call ComPortOpen End Sub Private Sub recive 检测起始位并接收数据 Dim Buffer As Variant Dim Arr As Byte Dim inData5 As Byte Dim count As Integer Dim temp As Byte MsgBox quotOnCommquot With MSComm1 Select Case .CommEvent 判断MSComm1
通信事件 CommEvent Case comEvReceive 收到Rthreshold个字节产生的接收事件 Buffer .Input Arr Buffer 读取一个接收字节 Text1.Text Arr0 If Arr0 ampH1B Then ampH表示是十六进制数1B即27 是27 .RThreshold 0 Do DoEvents DoEvents是什么 Loop Until .InBufferCount gt 4 这里的4是不是应该是40 For i 1 To 4 count .InBufferCount Buffer .Input Arr Buffer inDatai Arr0 Next i If inData4 ampHA Then If inData1 Mod 64 gt 32 Then .RThreshold 1 Exit Sub End If valueFlag 1 0.000003814697265625 temp inData1 Mod 16 If temp lt 7 Then value inData1 Mod 8 value value 256 256 value value ValinData2 256 value value ValinData3 value value 3.814697265625E-06 Text1.Text Formatvalue quot0.000000quot Else value inData1 Mod 8 value value 256 256 value value ValinData2 256 value value ValinData3 value value 3.814697265625E-06 value 0 - value End If temp inData1 Mod 128 test OF If temp gt 64 Then If value lt 0 Then value value - 0.000004 Else value value 0.000004 End If End If 检测自动刷新 If Check1.value Then valueFlag 1 Call display End If Else .RThreshold 1 Exit Sub End If .InBufferCount 0 .RThreshold 1 End If Case Else End Select End With Text1.Text Text1.Text 1 End Sub Private Sub Option2_ClickIndex As Integer func Index 1 End Sub Public Sub display 判断功能并显示 功能选择 Select Case func Case 1 当前值 value2 value Case 2 平均值 If numCount gt 100000 Then numCount 1 valueSum 0 End If If valueFlag 1 Then valueSum valueSum value value2 valueSum / numCount numCount numCount 1 valueFlag 0 Label6.Caption StrnumCount - 1 Str为数字转换成字符串函数 End If Case 3 最大值 If value gt value2 Then value2 value End If Case 4 最小值 If value lt value2 Then value2 value End If Case Else End Select Text1.Text StrvalueSum Label1.Caption Formatvalue2 quot0.000000quot End Sub Private Sub Timer1_Timer清缓冲区 Text1.Text MSComm1.InBufferCount If MSComm1.InBufferCount gt 80 Then MSComm1.InBufferCount 0 End If End Sub 编程技巧Visual Basic串口通讯调试方法 程序匠人 2005-10-22 19:48:00 阅读全文1192 回复0 引用0 查看《匠人的百宝箱》代理商品 Visual Basic串口通讯调试方法 现有电子秤一台使用串口与
计算机进行通讯。
编写
VB程序来访问串口达到读取电子秤上显示的数据。
该电子秤为BE01型仪表输出为RS-232C标准接口波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符均发送11位ASCII码一个起始位。
在
VB中与串口通讯需要引入控件MSComm串口通讯控件在Microsoft Comm Control 6.0中。
具体程序如下控件简称MSC Dim Out12 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 quot9600E72quot ’设置通信端口参数 9600赫兹、偶校验、7个数据位、2个停止位.这里需要进一步说明的是.Setting”BBBBPDS”。
含义是BBaud Rate波特率PParity奇偶DData BitSStop Bit .InBufferSize 40 ’设置缓冲区接收数据为40字节 .InputLen 1 ’设置Input一次从接收缓冲读取字节数为1 .RThreshold 1 ’设置接收一个字节就产生OnComm事件 End With End Sub Private Sub ClearText Text3.Text quotquot Text2.Text quot5quot Text1.Text quotquot 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 Out1 2 Then ’判断是否为数据的开始标志 .RThreshold 0 ’关闭OnComm事件接收 End If Do DoEvents Loop Until .InBufferCount gt 3 ’循环等待接收缓冲区gt3个字节 ’ nRece nRece 1 For i 2 To 12 SwichVar i Text1.Text Text1.Text amp ChrOuti Next Text1.Text LTrimText1.Text ’ LTrim函数是将一个字符串中最前面的所有空格去掉 Text2.Text Text2.Text amp CStrnRece ’ CStr同Str .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 gt 0.3 Then bDT False Loop bDT True End Sub 通信传输速率为9600bps则最快速度1.04ms发送一个字节仪表每秒发送50帧数据每帧数据有4个字节即每秒发送200个字节平均5.0ms 发送一个字节连续读取串口数据时要在程序中添加循环等待程序 Private Sub SwichVarByVal nNum As Integer DelayTime var Null var MSC.Input OutnNum var0 End Sub 设置接收数据模式采用二进制形式即 InputModecomInputModeBinary但用Input属性读取数据时不能直接赋值给 Byte 类型变量只能通过先赋值给一个 Variant 类型变量返回一个二进制数据的数组再转换保存到Byte类型数变量中。
Private Sub Text1_Change Text3.Text CTextText1.Text - CTextText2.Text End Sub Private Function CTextByVal str As String As Currency ’ ByVal是什么 If str ltgt quotquot Then CText CCurValstr ’ CCur是什么 Else CText 0 End If End Function 仪表每秒发送50帧数据微机收到一帧完整数据至少需要20 ms时间然后再进行数据处理。
如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕则接收缓冲区内只会保存有一帧数据不会存有两帧以上数据接收缓冲区的大小不会影响实时监测效果接收缓冲区gt4字节这时完全可以实现实时监测或实时控制如果微机在20ms内不能将数据计算处理完毕接收缓冲区设置得又很大在数据计算处理完毕前接收缓冲区内就会保存有两帧以上数据而且一次工作时间越长缓冲区内滞留数据帧就越多数据采集和数据处理之间产生逐渐增大的额外时间差当接收缓冲区充满后时间差不再增大固定在某一值部分数据因不能及时采集到接收缓冲区中数据产生丢失现象真实
工作情况就会和微机处理结果产生较大的时间差对实时监测和实时控制很不利这种情况下接收缓冲区的大小就会影响实时监测效果所以接收缓冲区设置不能过大以保证数据处理的实时性。
小结本文所用的仪表为梅特勒公司出产的BE01型电子秤其输出的每个编码均为标准的ASCII码。
其他的仪表存在发射的编码中含有BCD
压缩码而且分为高低位需要接收后对其进行解码换算之后还要将高位和低位数字进行相加即可以将其BCD码换算成实数。
另还存在误差的可能判断最大值仪表在刚开始工作时有干扰会传导一些乱码位移传感器有参数偏差最大值一般都略大于50毫米所以取51为极限最大值取51为极限最小值。
暂时先写这些当然其他的情况可以依此类推
程序宝典一个简单的
VB串口发送程序源码 程序匠人 2005-10-2 14:36:00 阅读全文2675 回复2 引用0 查看《匠人的百宝箱》代理商品 一个简单的
VB串口发送程序源码 -----发送按钮Click事件子程序----------- Private Sub Fasong_Click Dim JIHAO0 As Byte ’机号 Dim head_data4 As Byte ’5 Byte控制字 Dim end_data0 As Byte 1 Byte 结束字 JIHAO0 ValText3.Text head_data0 ValText4.Text head_data2 ampHEE TIMH head_data3 ampHEE TIML head_data4 ValCombo1.Text INMOD end_data0 ampHFF If Combo2.Text quot增加quot Then head_data1 ampH99 If Combo2.Text quot清空quot Then head_data1 ampH33 If Combo2.Text quot删除quot Then head_data1 ampH32 Ready 0: ErrCount 0 On Error GoTo ERRORCOM ’打开错误处理 ---------------------------------------------------------- If com1.Value Then MSComm1.CommPort 1 Use com1 If com2.Value Then MSComm1.CommPort 2 Use com2 MSComm1.Settings FORM1.Combo3.Text quotM82quot 设定波特率和置校验和位为1 MSComm1.InputLen 0 MSComm1.PortOpen -1 Open the port MSComm1.OutBufferCount 0 MSComm1.Output JIHAO ‘发送机号 MSComm1.PortOpen False ’关闭串口 MSComm1.Settings FORM1.Combo3.Text quotS82quot 设定波特率和置校验和位为空 MSComm1.OutBufferCount 0 MSComm1.PortOpen True MSComm1.Output head_data MSComm1.Output Text2.Text MSComm1.Output end_data MSComm1.PortOpen False Text1.Text quot发送成功quot Chr13 amp Chr10 quot发送至quot Text3.Text quot屏体quot quot信息编号:quot Text4.Text Chr13 amp Chr10 Chr13 amp Chr10 Text1.Text GoTo comend ERRORCOM: Text1.Text quotERROR请重新选择COM口quot Chr13 amp Chr10 Chr13 amp Chr10 Text1.Text comend: On Error GoTo 0 End Sub 程序宝典一个非常好的串口程序 程序匠人 2005-10-2 14:32:00 阅读全文2287 回复0 引用0 查看《匠人的百宝箱》代理商品 贴一个非常好的串口程序from iccavrhanzhaowei include ltiom128v.hgt include ltmacros.hgt include quotuart.hquot / USART Buffer Defines / define USART_RX_BUFFER_SIZE 16 / 1248163264128 or 256 bytes / define USART_RX_BUFFER_MASK USART_RX_BUFFER_SIZE - 1 define USART_TX_BUFFER_SIZE 16 / 1248163264128 or 256 bytes / define USART_TX_BUFFER_MASK USART_TX_BUFFER_SIZE - 1 if USART_RX_BUFFER_SIZE amp USART_RX_BUFFER_MASK error RX buffer size is not a power of 2 endif / Static Variables / static unsigned char USART_RxBufUSART_RX_BUFFER_SIZE static volatile unsigned char USART_RxHead static volatile unsigned char USART_RxTail static unsigned char USART_TxBufUSART_TX_BUFFER_SIZE static volatile unsigned char USART_TxHead static volatile unsigned char USART_TxTail / 串口初始化 / void InitUSARTINT8U baudrate INT8U x UBRR0L baudrate UCSR0B 1ltltRXCIE0 1ltltRXEN0 1ltltTXEN0 /RX Complete Interrupt Enable Receiver Enable and Transmitter Enable/ x 0 / flush receive buffer / USART_RxTail x USART_RxHead x USART_TxTail x USART_TxHead x / 接收中断 / void USART_RX_interrupt void unsigned char data unsigned char tmphead data UDR0 / read the received data / .