我有一个连接到串行端口的条形码扫描仪。我通过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
时捕获了完整的数据注意:如果你必须在代码中添加延迟,这总是错误的方法(存在极端的例外,但这不是它)
可能的解决方案- 我建议使用
ReadLine
方法,但它有其挑战 - 简单地放置一个逻辑等待,直到所有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
ReadLine
方法,但它有其挑战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接口条形码来设置此接口。