打印
[STM32F1]

问个VB串口接收相关的帖子,看这里人多

[复制链接]
3020|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hualiming025|  楼主 | 2015-11-11 12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我VB入门水平,情况这样,下位机每隔一秒上传一组8个字节的数据,我VB需要接收这8个字节再分析显示出来。
当前设置接收事件触发个数是8,经常出现收到的8个数据不属于同一组,比如可能就是前一组的6个数据和后一组的两个数据刚好也是8个字节,它也触发接收事件了。导致我显示的东西都是混乱的。
请问如何避免这种状况?
提提思路也可以!
不胜感激。

MSComm1.CommPort = Combo1.Text
MSComm1.Settings = "9600,n,8,1"           '波特率:9600 无验,8位数据,1 位停止位
MSComm1.InputLen = 0                      '读取接收缓冲区的所有字符
MSComm1.OutBufferSize = 512               '设置发送缓冲区为512 字节
MSComm1.InBufferSize = 512                '设置接收缓冲区为512 字节
MSComm1.SThreshold = 0                    '禁止发送事件
MSComm1.RThreshold = 8                   '每8个字符到接收缓冲区都触发接收事件
MSComm1.InputMode = comInputModeBinary    '二进制方式收发
沙发
huzi2099| | 2015-11-11 12:26 | 只看该作者
本帖最后由 huzi2099 于 2015-11-11 12:31 编辑

你的问题是如何封装数据包的问题,方法很多各有利弊,你得自己做个设计。
常用的比如应答式,校验字方式,时间戳方式。。
如果你有校验的字可以修改RThreshold 等待接受到正确的校验字后再改成正常包值。

使用特权

评论回复
板凳
hualiming025|  楼主 | 2015-11-11 12:46 | 只看该作者
huzi2099 发表于 2015-11-11 12:26
你的问题是如何封装数据包的问题,方法很多各有利弊,你得自己做个设计。
常用的比如应答式,校验字方式, ...

首先谢谢您帮助。你的意思是接收触发值先设置为1,等接收到校验字节后再该为8是吗?
如果我想利用下位机发送的时间间隔来识别每一组数据的开始,有什么办法吗?

使用特权

评论回复
地板
huzi2099| | 2015-11-11 13:18 | 只看该作者
hualiming025 发表于 2015-11-11 12:46
首先谢谢您帮助。你的意思是接收触发值先设置为1,等接收到校验字节后再该为8是吗?
如果我想利用下位机 ...

那样你就1字节1接收然后软件处理。

使用特权

评论回复
5
yklstudent| | 2015-11-11 13:31 | 只看该作者
Private Sub Init_MSComm(ByVal comPort As Integer, ByVal comBaud As String)
On Error GoTo ErrHandler:
    'Mscomm控件初始化赋值设置
    MSComm.CommPort = comPort                       ' 设置串口
    MSComm.InputMode = comInputModeBinary           ' 二进制输入模式
    MSComm.RThreshold = 1                           ' 接收1个字符触法OnComm 事件
    MSComm.SThreshold = 1                           ' 发送1个字符触法OnComm 事件
    MSComm.Settings = CStr(comBaud) + ",n,8,1"      ' 设置波特率
    MSComm.OutBufferSize = 1024
    MSComm.InBufferSize = 1024
    MSComm.InputLen = 0
    MSComm.InBufferCount = 0
   
    If MSComm.PortOpen = False Then
        MSComm.PortOpen = True                      ' 打开串口
        CmdControl.Caption = "关闭串口"
        CbComPort.Enabled = False
        CbComBaud.Enabled = False
    End If
    Exit Sub
   
ErrHandler:
    Exit Sub
End Sub
我串口一般都这么设

使用特权

评论回复
6
nbsmaps| | 2015-11-11 15:53 | 只看该作者
发送部分不要一个一个字节发了。
具体要看接收处理函数

使用特权

评论回复
7
天灵灵地灵灵| | 2015-11-11 16:33 | 只看该作者
这个VB应该是可以图形化编写的,楼主这用代码写,看来功底不浅啊

使用特权

评论回复
8
yklstudent| | 2015-11-11 20:37 | 只看该作者
天灵灵地灵灵 发表于 2015-11-11 16:33
这个VB应该是可以图形化编写的,楼主这用代码写,看来功底不浅啊

什么VB可以图形化编程?????

使用特权

评论回复
9
nuaabob| | 2015-11-11 21:39 | 只看该作者
yklstudent 发表于 2015-11-11 20:37
什么VB可以图形化编程?????

他的意思应该是用控件了,但用控件也不代表不需要写代码。你学的是VB6还是VB.Net?如果是VB6还是别学了,Win7都是最后一款支持VB6的系统了。

使用特权

评论回复
10
yklstudent| | 2015-11-11 22:26 | 只看该作者
nuaabob 发表于 2015-11-11 21:39
他的意思应该是用控件了,但用控件也不代表不需要写代码。你学的是VB6还是VB.Net?如果是VB6还是别学了, ...

VB6.0,老早就学了;WIN7后面也没必须学VB.NET了,直接学的C#,将来可以跨平台

使用特权

评论回复
11
MJM_WSY| | 2015-11-11 23:10 | 只看该作者
这个要看你单片机发送的问题。比如说带个帧头和帧尾,就不会出现这个对不齐的问题了。帧头+字节数....末尾加CRC啥的。那么VB处理起来也好办,帧头开始检索第二个字节,然后重复接收直到接收完所有字节。校验CRC。数据正确显示。不正确发送指令使其重发。

使用特权

评论回复
12
jlhgold| | 2015-11-11 23:34 | 只看该作者
一个字节一个字节的触发就行

使用特权

评论回复
13
yhn1973| | 2015-11-12 09:32 | 只看该作者
nuaabob 发表于 2015-11-11 21:39
他的意思应该是用控件了,但用控件也不代表不需要写代码。你学的是VB6还是VB.Net?如果是VB6还是别学了, ...

瞎说吧?我怎么看WIN10还能用VB6哪

使用特权

评论回复
14
hbzjt2011| | 2015-11-12 09:37 | 只看该作者
可以一个一个字节接收,判断为手字节后,开始接收,到最后一个字节停止,存入数组后处理就可以了

使用特权

评论回复
15
mmhh3000| | 2015-11-12 11:39 | 只看该作者
一字节接收,程序再判断。这个协议帧里应该是要设计首尾字节标志的,而不是靠字节数,程序判断这个首尾字节标志就可以了

使用特权

评论回复
16
yiqianlong| | 2015-11-12 12:19 | 只看该作者
用轮询也行。如果不想重新设计帧首尾字节标志,用TIMER隔100MS查询一次,300MS没新数据则认为新帧开始

使用特权

评论回复
17
nuaabob| | 2015-11-13 17:44 | 只看该作者
yhn1973 发表于 2015-11-12 09:32
瞎说吧?我怎么看WIN10还能用VB6哪

不好意思,我是很久以前看到的新闻,说是微软表示,win7将是最后一款支持VB6的windows系统,后来微软是不是真的这么干了,我就不清楚了,现在还能找到这样的新闻:http://www.win7china.com/html/673.html
至于现在win8、win10是否还能支持vb6,我就不清楚了,我自己的电脑还是win7系统,但.Net语言是趋势,尤其是C#,学VB6不如学.Net。

使用特权

评论回复
18
天灵灵地灵灵| | 2015-11-14 14:13 | 只看该作者
可以一个一个字节接收,判断为手字节后,开始接收,到最后一个字节停止,存入数组后处理就可以了
很久不用VB了,都忘了。

使用特权

评论回复
19
gmm2015| | 2015-11-14 16:14 | 只看该作者
可以使用校验的方式。或者使用带起始字节的通讯方式(类似HART通讯)。
如果非得用间隔时间控制,则加个定时器,如果当前接收到的字节与上次接收到的字节间隔时间超过一定的值,则认为当前这个字节是新的数据的第一个字节。当然你的数据包间隔时间要远大于同一个数据包中两个相邻字节的间隔时间

使用特权

评论回复
20
金刚葫芦娃啊| | 2015-11-14 17:02 | 只看该作者
只需要做个类似fifo的缓冲   收到八个字节  读取  然后再进行  后边的接收   超时的话直接读取就行了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

114

帖子

2

粉丝