高手您好,想向你继续请教关于VB中在mscomm控件下编通信协议的问题》

作者&投稿:郑相 (若有异议请与网页底部的电邮联系)
VB使用MScomm控件问题~

Private Sub Command1_Click()
Dim i%
Dim vsend(12) As Byte, xu(1) As Byte '定义数组数型
Dim output(12) As String
'a5 00 12 00 07 7f 00 00 00 00 00 0a c5 打开串口1指令
vsend(0) = &HA5
vsend(1) = &H0
vsend(2) = &H12
vsend(3) = &H0
vsend(4) = &H7
vsend(5) = &H7F
vsend(6) = &H0
vsend(7) = &H0
vsend(8) = &H0
vsend(9) = &H0
vsend(10) = &H0
vsend(11) = &HA
vsend(12) = &HC5 '给数组赋值
MSComm1.OutBufferCount = 0 '清空发送数据缓冲区
If MSComm1.PortOpen = True Then
For i = 0 To 12
xu(0) = vsend(i)
MSComm1.output = xu '发送数据到发送数据缓冲区
Next i
End If

End Sub

Private Sub Form_Load()
With MSComm1
.CommPort = 1 '使用COM2
.Settings = "9600,n,8,1" '波特率9600,无偶校验,8个数据位,1个停止位
.InBufferSize = 10 '设置MyComm接收缓冲区为40个字节
.OutBufferSize = 1 '设置MyComm发送缓冲区为2个字节
.InputMode = comInputModeBinary '设置接收数据模式为二进制模式
.InputLen = 1 '设置一次从接收缓冲区读取字节数为1
.SThreshold = 1 '设置一次从发送缓冲区读取字节数为1
.PortOpen = True '打开通信口
End With
End Sub

程序是好了,不过你怎么给得是0分,忘记设置了吧

Option Explicit
Dim strInput As String
Dim strSend As String
Dim sum As Integer

Private Sub Command1_Click()
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Timer1.Interval = 100 '控制发送延迟时间
Timer1.Enabled = False
End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputLen = 0
strInput = strInput & MSComm1.Input
Text1 = strInput
If strInput = "Q" Then
strSend = "R"
strInput = ""
Timer1.Enabled = True
ElseIf Len(strInput) "R" Then
strSend = strInput
strInput = ""
'MSComm1.RThreshold = 8
Timer1.Enabled = True
Else ' Then
sum = sum + 8
Text2 = sum / 8
If sum >= 160 Then
strSend = "E"
'MSComm1.PortOpen = False '本句似乎可不用
sum = 0
Else
strSend = "C"
End If
strInput = ""
Timer1.Enabled = True
End If
End Select
End Sub

Private Sub Timer1_Timer()
If MSComm1.PortOpen = True Then
MSComm1.Output = strSend
Timer1.Enabled = False
End If
End Sub


补充:2进制接收
Option Explicit
Dim strInput As String
Dim strSend() As Byte
Dim sum As Integer
Dim strSj As String
Private Sub Command1_Click()
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
'MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Timer1.Interval = 100 '控制发送延迟时间
Timer1.Enabled = False
End Sub

Private Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputLen = 0
buffer = MSComm1.Input
For i = 0 To UBound(buffer)
strInput = strInput & Right("0" & Hex(buffer(i)), 2)
Next
If Mid(strInput, 1, 2) = "51" Then
ReDim strSend(0)
strSend(0) = &H52
strInput = ""
Timer1.Enabled = True
ElseIf Len(strInput) "51" Then
ReDim strSend(1 To Len(strInput) / 2)
For i = 1 To Len(strInput) Step 2
strSend((i + 1) / 2) = Val("&H" & Mid(strInput, i, 2))
Next
strInput = ""
Timer1.Enabled = True
Else ' Then
sum = sum + 8
Text2 = sum / 8
strSj = strSj & strInput '& vbCrLf
If sum >= 160 Then
ReDim strSend(0)
Text1 = strSj
'请进入数据处理代码,转换为ASCII字符号。
MSComm1.PortOpen = False '本句似乎可不用
strSend(0) = &H45
sum = 0
Else
ReDim strSend(0)
strSend(0) = &H43
End If
strInput = ""
Timer1.Enabled = True
End If
End Select
End Sub

Private Sub Timer1_Timer()
If MSComm1.PortOpen = True Then
MSComm1.Output = strSend
Timer1.Enabled = False
End If
End Sub

'这是我写的OnComm事件程序,提供参考!
'全局变量定义一下:
Dim Inputtext As Variant
Private Sub Label10_Click()
Dim Clardata As String '用于清空缓存,准备接收数据!
If MSCOM.PortOpen = False Then
Call Desplaycomnotopen '提示串口没有打开的错误
Else
MSCOM.InputLen = 0 '接收全部数据,目的是清空接收缓存
Clardata = MSCOM.Input
MSCOM.InputLen = 4 '准备先接收四个字节
MSCOM.RThreshold = 1 '每接收一个字节就触发ONCOMM事件
TEXT_MESSAGE.Text = TEXT_MESSAGE.Text & "====================系统信息===================" & vbCrLf
TEXT_MESSAGE.Text = TEXT_MESSAGE.Text & "已发送命令:[修改设备工作模式为定时计数器模式]" & vbCrLf
TEXT_MESSAGE.SelStart = Len(TEXT_MESSAGE.Text) '显示到最后一行去
Syslink = 0 '发送成功标志位
Mstime.Enabled = True '计时器开始工作,用于判断是否发送成功
MSCOM.Output = "UPOK021" & vbCrLf '发送命令
End If
End Sub

Private Sub MSCOM_OnComm()
Select Case MSCOM.CommEvent
Case comEvReceive
Inputtext = MSCOM.Input '接收到数据
If (Inputtext = "SBOK") Then '如果是我想要的数据
Syslink = 1 '通知已联机并得到数据
MSCOM.RThreshold = 0 '停止oncommg事件
Delay1ms (100) '等待数据传送完成
MSCOM.InputLen = 2 '读取两个字节
Inputtext = Null
If (MSCOM.PortOpen = True) Then
Inputtext = MSCOM.Input '读取
End If
If (Inputtext = "ST") Then
Call Setup_ST '子程序

ElseIf (Inputtext = "AL") Then
Call Setup_AL '子程序
End If
End If
End Select
MSCOM.InputLen = 0 '读取所有字节
If (MSCOM.PortOpen = True) Then
Inputtext = MSCOM.Input '读取
End If
MSCOM.InputLen = 4 '读取两个字节,为下一次数据做准备
MSCOM.RThreshold = 1 '每接收一个字节就触发ONCOMM事件
End Sub

OnComm控件接收方法说明:
串口如果打开了,且MSCOM.RThreshold <> 0,那么串口就一直可以接收数据,并保存到缓冲区[相当于我们的临时仓库],何时去拿?只要调用XXX=mscomm.input就相当于去拿了,拿多少?MSCOM.InputLen = 几就等于拿多少。你只要拿了,仓库就没有了,它会自动移动数据到最外面,让你下次再拿
如果仓库里有些没用的东西怎么办?
把MSCOM.InputLen =0,然后找个变量将它等于mscomm.input就一下子全部拿走了
我建议:
要取数据前先:
设置要取多少位
设置每接收到一位就触发OnComm事件
取一次数据,确认是不是我们要的数据?
关闭串口事件
延时500MS,等于全部数据进入
重新定义数据读取长度
读取数据并传给第一个变量
重新定义数据读取长度
读取数据并传给第二个变量
..........
重新定义数据读取长度
清空缓存
打开OnComm事件
END HELP

Dim a As String
Dim b As String
Dim c As String
Dim d As String
Dim CRC(1) As Byte
Private Sub MSComm1_OnComm()
Dim i As Long
Dim iData() As Byte
Dim e(3) As Byte ‘待计算crc
If MSComm1.InBufferCount > 0 Then
iData = MSComm1.Input
e(0) = iData
For i = 0 To UBound(iData)
a = a & iData(i) & " "
Next i
iData = MSComm1.Input
e(1) = iData
For i = 0 To UBound(iData)
b = b & iData(i) & " "
Next i
iData = MSComm1.Input
e(2) = iData
For i = 0 To UBound(iData)
c = c & iData(i) & " "
Next i
iData = MSComm1.Input
e(3) = iData
For i = 0 To UBound(iData)
d = d & iData(i) & " "
Next i
CRC = CRC16(e)
iData = MSComm1.Input
if (CRC(0)<>iData) then End Sub
iData = MSComm1.Input
if (CRC(1)<>iData) then End Sub
Text1.Text = a
Text2.Text = b
Text3.Text = c
Text4.Text = d

End If
End Sub
Function CRC16(data() As Byte) As String
   Dim CRC16Lo As Byte, CRC16Hi As Byte   ’CRC寄存器
   Dim CL As Byte, CH As Byte        ’多项式码&HA001
   Dim SaveHi As Byte, SaveLo As Byte
   Dim i As Integer
   Dim Flag As Integer
   CRC16Lo = &HFF
   CRC16Hi = &HFF
   CL = &H1
   CH = &HA0
   For i = 0 To UBound(data)
    CRC16Lo = CRC16Lo Xor data(i) ’每一个数据与CRC寄存器进行异或
    For Flag = 0 To 7
     SaveHi = CRC16Hi
     SaveLo = CRC16Lo
     CRC16Hi = CRC16Hi \ 2      ’高位右移一位
     CRC16Lo = CRC16Lo \ 2      ’低位右移一位
     If ((SaveHi And &H1) = &H1) Then ’如果高位字节最后一位为1
      CRC16Lo = CRC16Lo Or &H80   ’则低位字节右移后前面补1
     End If              ’否则自动补0
     If ((SaveLo And &H1) = &H1) Then ’如果LSB为1,则与多项式码进行异或
      CRC16Hi = CRC16Hi Xor CH
      CRC16Lo = CRC16Lo Xor CL
     End If
    Next Flag
   Next i
   Dim ReturnData(1) As Byte
   ReturnData(0) = CRC16Hi       ’CRC高位
   ReturnData(1) = CRC16Lo       ’CRC低位
   CRC16 = ReturnData
  End Function


情话短语大全2021年、撩人说说:后来我瞒着所有人,继续爱了你很
你的余生没我 我的余生不是你 那都没关系 毕竟你的手牵过我 你的声音我也知道 你的怀抱里曾有我 你最想我的时候我都在 我最需要你的时候你都出现了也许也没什么遗憾了 qq女生说说心情短语 我瞒过了所有人,继续喜欢你 一、想你深情的眼,是如何越过沧桑的墙,穿透我,红尘过往,望断夜雨西窗。 二、我瞒过...

过试用期了老板找你谈话说叫你考虑好了要不要继续在公司做怎么回答...
这个很简单的回答,你要在这个公司做就继续做,如果不想做的话,你直接可以说谢谢公司给了这段时间实习的机会,很感谢,一般试用期过的话除非有特殊的原因,不然的话会继续在公司做的。

个人道歉信
朋友的关系彻底的破坏.(至于怎么回事,不便告诉)我知道是我不对,但我就是不承认,我们分完手之后,我...那么你就得联系好自己的语言组织能力,说得流畅,朗朗上口的感觉,你刚说了一句话就能使人想继续听

小秋往事 第十五章 我们的爱 让世界不一样
眼睛都还没睁开,沥川就伸出手臂,想去抱抱身边的小秋,不料手却碰到了空空的枕头。他猛地睁开眼睛,用胳膊肘支起身子,环顾四周,却不见小秋的身影。沥川急忙下床,拄上双拐,走出卧室。楼上找了一大圈,没有找到小秋,沥川只好到楼下继续找。电梯门一开,沥川就看到了在沙发上的小秋,半坐半躺地靠着靠枕,抱着一本书在...

思念的句子
你也会想念,想着想着叹一口气,不知他现在过的怎样?然后你继续你平静的生活,希望他早日回到你身边。36、昨夜做了一个梦梦里我们又回到了手牵着手醒来的失落无法言说!37、枫叶红了,又到了多思的季节。我用枫叶般的热情向您祝福,愿它为您带来无限的温馨38、静静消失在人海里面,不让谁看见!想念是会呼吸的痛,瞬间...

表达对爱人思念句子
你也会想念,想着想着叹一口气,"不知他现在过的怎样?"然后你继续你平静的生 活,希望他早日回到你身边。以下是我整理的表达对爱人思念的句子,希望可以帮到你! 表达对爱人思念句子篇一 1、月光恋着海洋,海洋恋着月光。啊!这般蜜也似的银夜,教我怎能不将你想? 2、你是一个宁静的港湾,我思恋的心船,将在你...

以谁谁我想对你说写作文
蓦然回首往事,不由得思绪万千,心中有太多太多的话想向你诉说。 我不善言辞,但却酷爱写作,所以我想以笔代口,向你娓娓道来。 天天,我欣赏你的明智、...因为您每次在我受挫折时,鼓励我告诉我“失败乃成功之母”,不要泄气,继续努力总有一天会成功.这句话鼓励着我,这股勇气窜到了我身上. 妈妈,我想对您说...

想念的个性签名 非常想一个人的短句
三十五、好想知道,有没有那么一秒你也害怕过失去我 三十六、我们那么爱 却爱到了分开 只剩回忆还在继续残喘的交战 三十七、如果你开始想念我,记住了,不是我自己要走的,是你自己松手的。 三十八、疯狂的想念,哪里都是你。 三十九、人前一套,背后一刀,我身边总是不缺这样的人。 四十、有些话,说与不说,都...

主持人开场白
详情请查看视频回答

真诚的道歉信
您好,我首先向您表示最衷心的感谢,感谢您购买我公司的产品!并对您遇到的问题致以最诚挚的歉意! 关于您提到的我公司的客服人员的服务态度粗鲁一事请您放心...也请老师继续监督,帮助我改正。 今后我一定会认真复习将心思放在学习上,绝不会在考试之前还把时间浪费在看小说书上,请老师相信我! 这封信已经放在我这里...

江油市13912513317: vb的问题 请教高手 -
顾径典舒: 第一问: clear多见于列表类控件(listbox等),作用是删除所有的记录. cls多见于能接受pset、line方法的控件(如form,picturebox等),其作用是清除所有的笔迹. RemoveItem方法也常见于...

江油市13912513317: 请教VB高手给一些思路!! -
顾径典舒: 1.我想你可以先提取出一条字符,然后获取该字符长度,然后依次查找剩下的字符串的长度,先做长度比较,如果相同在把字符穿转为ASCII码后比较!至于少出的方法,我想你找到后给装个字符串做标记,比如说装个字符是第几个,下次找的时候就不再处理这些标记了的!2.你可以先找到装里的空格,然后判断其前边的字符是不是字母,这是一种方法.另外你可以判断2个空格之间是不是一个单词,装样你需要一个单词库!

江油市13912513317: 本人是vb初学者,想请教几个问题,希望能有高人给予指点. -
顾径典舒: 不全对啊.. dim f1 as integer , f2 as inte...

江油市13912513317: 我想请教您一些关于VB的相关问题
顾径典舒: 拦截你要修改的游戏的窗口keypress消息,然后根据你的需要替换就可以了 比如说,原来快捷键是B,你想改成C 那就拦截keypress消息,如果按下的是C,就替换成B以后再交给原窗口消息处理函数处理即可

江油市13912513317: 怎么才能学好VB阿?哪位高手请教下!
顾径典舒: 我已经大学毕业,现在在一家公司负责数据库的维护 以前上学时学习过C语言、vfp,自己也学习过汇编(16bit),对数据结构的学习也比较了解,但是也仅仅只能编一些不入流的微小型程序.现在连一个涉及windows的系统程序都无法写出,...

江油市13912513317: 师兄,你好?师弟我是VB初学者,想请教师兄VB的一些问题, -
顾径典舒: 简单! 在窗体上添加一个image, image1的Stretch属性设为true将form1和image1的OLEDropMode属性都设为1 就这么简单那!Private Sub Form_OLEDragDrop(Data As...

江油市13912513317: 你好,我想请教一下vb.net中怎么调用用户控件,谢谢! -
顾径典舒: 关于用户控件的使用,.net与v6环境下是有那么小小的区别.v6环境下的用户控件编写后可以直接使用,而在.net环境下,则需要先生成控件库(dll,应用程序扩展格式),然后再将这个控件库导入到.net编程环境的工具箱上方可使用. 其具体方...

江油市13912513317: 你好 请教一下vb中的dll文件怎么生成?代码的界面在哪里做? -
顾径典舒: vb生成DLL的方式有2种,一种是标准的DLL,可以通过得到vb的对象文件重新编译获得,具体做法参加 http://www.applevb.com/art/vb_dll.html 第二种是所谓的Active Dll,其实是vb中可使用Com组件的一种封装方式,在建立工程的时候,选择active dll就可以了.如果你是用vb程序之间共享代码,标准Dll的作用不大,很多vb函数还不能使用,最好用active dll

江油市13912513317: (请教编程大神!!!)VB中单双精度数值相加减 -
顾径典舒: 不同类型的数值相加减,结果的类型以参与运算的数值中精度最高的类型为准,也就是说单精度数值和双精度数值若进行运算,结果为双精度型.你自己在VB的立即窗口验证一下就清楚了(100!是单精度数,100#是双精度数):? TypeName(100! + 100#)

江油市13912513317: VB中如何获得date型数据的时、分、秒?分别是多少?请教高手~ -
顾径典舒: dim t as date dim h as integer, m as integer, s as integer t = now() h = hour(t) ' 小时 m = minute(t) ' 分钟 s = second(t) ' 秒

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网