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

串口通信设计有关问题

2013-01-23 
串口通信设计问题我现在有一个功能需求是这样的。有一个MSComm控件、读取数据的代码如下Private Sub MSComm1

串口通信设计问题
我现在有一个功能需求是这样的。有一个MSComm控件、读取数据的代码如下

Private Sub MSComm1_OnComm()
Dim strBuff As String
Dim BytReceived() As Byte
 Select Case MSComm1.CommEvent '事件发生
 Case 2
    MSComm1.InputLen = 0
strBuff = MSComm1.Input
If (strBuff <> Null Or strBuff <> "") Then
  If (Option1.Value = True) Then
  result = strBuff
  Text2.Text = Text2.Text + result
  End If
  If (Option2.Value = True) Then
  BytReceived() = strBuff
      For i = 0 To UBound(BytReceived)
          If Len(Hex(BytReceived(i))) = 1 Then
          result = result & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格
          Else
          result = result & Hex(BytReceived(i)) & " " '方便显示观察如: 00 0F FE
          End If
     Next
     '判断刷10次逻辑
     If (testFlag = True And UBound(BytReceived) > 0) Then
        testCount = testCount + 1
        Label5.Caption = "刷卡成功次数:" + CStr(testCount) + " 失败次数:0" + " 成功率:100%"
        If (testCount Mod 10 = 0) Then
        Label5.Caption = "已经测试了10次"
        End If
     End If
     '
     Text2.Text = result
  End If
End If
 End Select
End Sub
以为我有一个判断刷卡10次的需求。但是我发现。这个testCount 变量变化的幅度很大。我只操作一次硬件设备。会加N次。、如果我单点、一步步走下去。确实正常的。难道是要清楚什么缓存吗?MSComm1.InBufferCount = 0但是这个我也设置过啊。有谁能指点下吗?怎么实现好
[解决办法]
首先串口通信是要消耗时间的,通常情况下一次串口通信需要消耗10~100ms,但大多数都是40ms左右。所以,即使你的InputLen=0(表示一次性读取完串口缓冲区中的全部数据),但数据也有快慢,所以你的计数方法不对,你应该换一个思路,两次刷卡之间,由于手的动作,肯定是有时间间隔的,即使你动作再快也应该不小于500ms,所以,你的修改你的程序计数方式
[解决办法]
testCount = testCount + 1执行的条件是:
1 有CommEvent=2
2 strBuff <> Null Or strBuff <> ""这个是必然的,有数据肯定满足这个.
3 Option2.Value = True 
4 testFlag = True And UBound(BytReceived) > 0

BytReceived和条件2相同,
这样实际的条件只有testflag和option2,没看见这两条件的修改.

如果通讯1字节就产生一次就CommEvent事件,并且testflag和option2满足,那技术testcount就多计数了,你的 刷卡不会是1字节就算一次吧?

计数testcount应该放在一次成功的刷卡之后执行.
[解决办法]
你刷一次卡会通讯多少字节?假设是固定的 n 个,则在 MSComm 初始化时,设置

MSComm1.RThreshold = n


热点排行