【问题标题】:VB6 RS232 not receiving full data from device using MSCOMM ControllVB6 RS232 未使用 MSCOMM 控制从设备接收完整数据
【发布时间】:2013-02-13 08:14:28
【问题描述】:

我有一个在 com 端口上发送数据的临床设备,我想从设备接收数据 在 ENQ 上发送 ACK 后,它还收到了第一帧 (254) 字符 它接收 [ETB] [CR][LF] 个字符 然后我再次为下一帧发送 ACK,但不接收数据 只接收 EOT 字符

根据设备的设备通信是:

->[确认]

**********************-[ETB]21 [CR][LF]

->[确认]

**********************-[ETX]8E [CR][LF]

->[确认]

我的代码是:

'MSComm1.Settings = "9600,n,8,1"
'MSComm1.InputLen = 1
Private Sub MSComm1_OnComm()
    Dim InBuff As String

    InBuff = MSComm1.Input
    if Chr$(5)=InBuff then    'ENQ received
        MSComm1.Output=Chr$(6) & VbCr
    elseif Chr$(10)=InBuff then 'LF received
        MSComm1.Output=Chr$(6) & VbCr
    else
        text1.text=text1.text & InBuff
    end if
End Sub

设备发送完整数据,因为设备附带了 1 个软件,该设备接收完整数据 但我再次发送 ACK 后没有收到下一帧, 如果有人知道下一个 ACK​​ 必须发送什么输出,请告诉我

提前致谢

【问题讨论】:

  • MSComm1.InputLen = 1 将每次调用 .Input 限制为仅从缓冲区读取 1 个字符; .RThreshold 将确定 rx 缓冲区中引发 _oncomm 所需的字符数,尝试使用 1。在事件运行时将其设置为 0,使用 .InBufferCount 确定和处理大于 1 个字符的缓冲区。谷歌 sysinternals portmon 查看所有端口 tx/rx 的工具。
  • 您必须阅读设备的协议规范,我们无法为您提供帮助。猜测是设备只是认为事务完成,因此发送传输结束控制代码。这将要求您使用 ENQ 开始另一个。只是猜测。

标签: interface vb6 serial-port


【解决方案1】:

做这样的事情......

MSComm1.InputLen = 1 ' for sending single character from device
MSComm1.RThreshold = 1 ' for firing events on receiving a single character

Dim InBuff As String

if MSComm1.CommEvent = comEvReceive then
do 
    InBuff = MSComm1.Input
    Loop Until MSComm1.InBufferCount < 1

首先接收所有数据,然后以自己的方式使用。

【讨论】:

  • InBuff = InBuff &amp; MSComm1.Input。否则每次循环都会覆盖 InBuff。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 2021-11-23
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多