首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

MSComm1.RThreshold = 1 ,为什么触发事件时,缓存区内如何不止一个字节

2012-06-10 
MSComm1.RThreshold 1 ,为什么触发事件时,缓存区内怎么不止一个字节?Option ExplicitDim inData As Stri

MSComm1.RThreshold = 1 ,为什么触发事件时,缓存区内怎么不止一个字节?
Option Explicit 
Dim inData As String 
Dim a() As Byte 

Private Sub Form_Load() 
MSComm1.Settings = "9600,n,8,1" 
MSComm1.RThreshold = 1 
MSComm1.InputMode = comInputModeBinary '二进制接收 
MSComm1.PortOpen = True 
End Sub 

Private Sub MsComm1_OnComm() 
Dim intInputLen As Integer 
Dim i As Integer 
Select Case MSComm1.CommEvent 
Case comEvReceive 
'此处添加处理接收的代码 
intInputLen = MSComm1.InBufferCount 
ReDim a(intInputLen) 
a = MSComm1.Input 
For i = 0 To UBound(a) 
If Len(Hex(a(i))) = 1 Then 
inData = inData & "0" & Hex(a(i)) 
Else 
inData = inData & Hex(a(i)) 
End If 
Next 
Text2 = inData 
End Select 
End Sub 

问题:既然MSComm1.RThreshold = 1 ,那么每接收一个字节就触发一次oncomm事件,那intInputLen = MSComm1.InBufferCount ,intInputLen不是应该等于1吗?a = MSComm1.Input ,.input不应该也是一个字节吗?那么UBound(a) 不就是0吗?只有a(0)里有数据,应该是8位2进制吧? 那么为什么inData里是很多个字符呢?

另外:我每接收一个字节,就把它input出来,这时候.InBufferCount 是不是应该等于0 了,但好象.InBufferCount 并不固定?为什么?? 


[解决办法]
设置MSComm1.RThreshold = 1是接收缓冲区到达1字节就必然产生接收OnComm事件.
不是接收到N字节,就一定产生N次OnComm事件.
LZ:为1个串口通信的疑问,在CSDN和BAIDU共发了6个贴子.但我感觉LZ思路有问题,你应将网络搜索的代码消化,并依据你自己的实际需求和通信协议和数据帧约定来组织你的代码算法和写出代码.

[解决办法]
那是因为有后续的数据发送过来了。虽然你是每接受一个字符就触发一次事件,但并不代表你接受到数据触发了事件时就没有数据过来,
建议你将代码如此修改:
Option Explicit 
Dim inData As String 
Dim a() As Byte 

Private Sub Form_Load() 
MSComm1.Settings = "9600,n,8,1" 
MSComm1.RThreshold = 1 
MSComm1.InputMode = comInputModeBinary '二进制接收 
MSComm1.PortOpen = True 
End Sub 

Private Sub MsComm1_OnComm() 
Dim intInputLen As Integer 
Dim i As Integer 
Select Case MSComm1.CommEvent 
Case comEvReceive 
'此处添加处理接收的代码 
MSComm1.RThreshold = 0 '屏蔽事件触发
intInputLen = MSComm1.InBufferCount 
ReDim a(intInputLen) 
a = MSComm1.Input 
For i = 0 To UBound(a) 
If Len(Hex(a(i))) = 1 Then 
inData = inData & "0" & Hex(a(i)) 
Else 
inData = inData & Hex(a(i)) 
End If 
Next 
Text2 = inData 
MSComm1.RThreshold = 1 '打开事件触发
End Select 
End Sub 

这样做可以避免你再处理OnComm事件是触发该事件。从而带来潜在的一些问题。

热点排行