读取com端口条形码的过程在这里是如何工作的?



我有一个连接到串行端口的条形码扫描仪。我通过DataReceived-Event读取Serialport

现在有一些奇怪的定时问题发生在重复扫描,我试图在下面解释。你能给我解释一下是什么导致了这种差异吗?

我使用这个条形码:01513511220001。

我用两个例子扫描它两次

例二:

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived
If SP1.BytesToRead > 0 Then
Threading.Thread.Sleep(1) '!!!
Dim str As String = SP1.ReadExisting
Debug.WriteLine(str)
End If
End Sub
'Output Scan 1:
'01513511220001
'Output Scan 2!!!:
'01513511220001

Example2:

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived
If SP1.BytesToRead > 0 Then
Dim str As String = SP1.ReadExisting
Debug.WriteLine(str)
End If
End Sub
'Output Scan 1:
'01513511220001
'Output Scan 2!!!:
'015135112
'20001

注意有时它在第9位之后切有时在第8位之后切。

理解ReadExisting

您正在使用ReadExisting函数,根据文档

读取所有立即可用的字节

在SerialPort对象的流和输入缓冲区中,基于编码。

就像它说的,它立即读取并给你数据,即使它不是完全完整的。条形码扫描器不知道代码有多长,所以它只能连续读取,这取决于软件来理解它。

理解DataReceived

类似地,DataReceived方法在任何时候都被调用,根据文档通过端口接收数据(无论部分或完整数据,这取决于条形码扫描器,内部缓冲区等)

通过SerialPort对象表示的端口接收数据。

还是由软件来理解接收到的数据。

理解你的例子

你的例子1总是工作的原因是因为你在读取实际数据之前添加了一个延迟,给了内部缓冲区满的机会,因此你在调用ReadExisting

时捕获了完整的数据注意:如果你必须在代码中添加延迟,这总是错误的方法(存在极端的例外,但这不是它)

可能的解决方案
  1. 我建议使用ReadLine方法,但它有其挑战
  2. 简单地放置一个逻辑等待,直到所有14个字符被读取,然后移动到下一步的处理(如果你有一个固定大小的代码,即使不是这样,仍然可以做到,但逻辑变得更复杂)。

方案二粗略示例

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived
If SP1.BytesToRead >= 14 Then 'Basically wait for the bytes to fill upto the length of the code
Dim str As String = SP1.ReadExisting
Debug.WriteLine(str)
End If
End Sub

注意:我没有运行上面的例子,它只是指示需要做什么

专用于Honeywell 1911i

根据其手册,您需要确保编程接口RS232串口要做到这一点,请参阅手册第2-1页(第27页),标题为编程接口>RS232串口.

在这个界面中,它会自动添加回车和换行的后缀,基本上是换行字符。节选自手册

RS232接口在连接PC机或终端的串口时使用条码。以下RS232接口条形码还编程回车(CR)和换行(LF)后缀、波特率和数据格式,如下所示。它还将触发模式更改为手动。

这应该允许您使用ReadLine方法来获取条形码,而不需要复杂性。

您可以通过简单地扫描手册中的RS232接口条形码来设置此接口。

相关内容

  • 没有找到相关文章

最新更新