VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: zfight

怎样解决串口通迅时CPU占用高的问题

[复制链接]

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-27 13:30:01 | 显示全部楼层
估计你代码有问题,贴上来看看吧
回复

使用道具 举报

1

主题

19

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-7-28 08:45:01 | 显示全部楼层
Private Sub Form_Load()   
    MSComm1.SThreshold = 0
    MSComm1.RThreshold = 1
    MSComm1.Settings = "19200,e,7,1"
    MSComm1.CommPort = 1
    MSComm1.PortOpen = True
    Timer1.Interval = 5000
    Timer1.Enabled = True

End Sub
Private Sub Timer1_Timer()
    Timer1.Enabled = False
    str = "04" + "51" + Hex(&H1C00 + 510 * 2) + "0A" + Chr(3)
    ChkSum = 0
    For i = 1 To Len(str)
        ChkSum = ChkSum + Asc(Mid$(str, i, 1))
    Next i
    str = Chr(2) + str + Right(Hex(ChkSum), 2)
    MSComm1.Output = str
end sub
上面是根据发送格式,整理数据,
Private Sub MSComm1_OnComm()
    If MSComm1.CommEvent = comEvReceive Then
       Timer1.Interval = 5000
       Timer1.Enabled = True
       Text2.Text = 0
       Text2.Text = MSC1.Input
    end if
End Sub
我试过了,如果接收到的数据长度小玩45个字节RThreshold=1 时,Text2.Text中显示的结果都是是对的,大于45时,就是错的,
回复

使用道具 举报

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-28 23:45:01 | 显示全部楼层
1 如果你想每隔5秒发送一次数据的话,在通讯事件里重新启动定时器不是个好办法,你现在的做法导致在接收到第一个字节后5秒重发数据(不明白你的意图).另外Text2.Text = MSC1.Input这一句和控件名称不匹配(MSComm1).你可以先用以下方法试试能否正常接收所有数据:

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
       Text2.Text = Text2.Text & MSComm1.Input
end if
End Sub

2 另外还要注意反馈的数据格式是文本或者是二进制数据,这要和MSComm1的InputMode属性匹配,当包含二进制数据时,text控件有可能不能正常显示出来
3 适当设置InBufferSize 和InputLen 属性,或用缺省值.
回复

使用道具 举报

1

主题

19

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-7-29 12:15:02 | 显示全部楼层
MSC1.Input这个是我写错了,接收的数据是十六进制的数据,

我的意思是数据接收是正常的,并且我也用过msgbox 来监看接收的数据,虽然RThreshold设为了1,但是事实上,接收完十个数据后,才触发OnComm事件,并且只触发一次.这是我不明白的地方,按理说应该是每接收一个字节就会触发一次的.

虽然,设RThreshold=1和程序上是有点不合理,以后我也不会这样用.但是我想知道,发生上面的情况是为什么.
回复

使用道具 举报

1

主题

19

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-7-30 12:15:01 | 显示全部楼层
还有,是不是设备断线,就只能触发发送事件,不能触发ONCOMM别的事件,包括错误事件.

如果断线,还想触发ONCOMM,应该怎么办.

谢谢
回复

使用道具 举报

1

主题

19

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-8-3 17:00:01 | 显示全部楼层
断线,能不能触发ONCOMM事件,如果能对应的是什么?
回复

使用道具 举报

0

主题

18

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-8-3 18:15:01 | 显示全部楼层
通讯模式是字符串还是2进制的??
回复

使用道具 举报

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-8-3 22:15:01 | 显示全部楼层
ONCOMM事件也包括一些错误事件,但断线不一定能触发ONCOMM事件.通常检测断线的方法是对设备发送一个简单指令,若及时返回则说明线路正常.
回复

使用道具 举报

1

主题

19

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-8-4 08:00:02 | 显示全部楼层
TO:fan3786
用的通讯模式是十六进制的字符串

TO:mayhem
我现在用的就是你说的方法,不过处理起来有点麻烦,因为我要用一个串口实现多种和读写,和这些过程中,有可能设备就断线了,如果断线不能触发ONCOMM事件,我还要用一个定时器和一个BOOLEN变量,过些时间看设备有没有返回值来触发ONCOMM事件,并且还要对不同的读写来设定处理的方法,如果断线能触发ONCOMM事件,这样就简单多了
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-8-4 19:15:02 | 显示全部楼层
Do
DoEvents
Loop Until (Timer > Wait)'很占CPU
用 timer控件能好些
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表