我需要帮助,我接受了一个项目,认为它应该是直截了当的,但现在我被卡住了。这是一个数据记录程序,需要从com端口接收一个串行字符串,处理字符串,然后将该信息放入Excel电子表格中。到目前为止,我使用的串口工作正常。
Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serPort.DataReceived
Dim str As String = serPort.ReadExisting()
Invoke(myDelegate, str)
End Sub
Sub procString(input As String)
bufString = input
If InStr(bufString, "|") Then
tempString.Add(bufString.Split(New Char() {ChrW(2)}))
End If
End Sub
这让我想到了第一个问题,如何最好地处理传入的字符串。目前我正在将字符串拆分为List(Of String),我假设这是在发送到excel之前处理字符串的最佳方法。如果我错了,请纠正我。 第二个问题是如何最好地处理这个字符串,然后将该信息放入Excel。我已经尝试使用计时器将数据导入Excel,但它无法正常工作
Private Sub Timer1_Tick(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Timer1.Tick
UsedRange = xlWorkSheet.UsedRange
RowRange = UsedRange.Rows
Dim CurrentRow As Int32 = RowRange.Count + 1
xlCells = xlWorkSheet.Cells
xlCells(CurrentRow, 1) = tempString(0).ToString() ' Start of text
xlCells(CurrentRow, 2) = tempString(1).ToString() ' Unit Address
xlCells(CurrentRow, 3) = tempString(2).ToString() ' Product SKU
我确信有一种更简单的方法可以将这些数据导入Excel,我只是不确定如何最好地解决它。 任何有关如何最好地完成这项工作的见解将不胜感激。 传入的字符串是一个管道分隔,并具有STX和ETX。
答案 0 :(得分:1)
回答第一个问题,你在做什么。我假设您在将信息添加到excel文件时尝试不锁定串行端口?如果没有,你可以在同一个线程上完成所有这一切。但你这样做很好。
我想建议一些事情
1:当您在多个线程中更改对象时,您必须担心线程安全。为避免出现此类问题,您应使用SyncLock。它们非常容易使用。
2:您似乎正在分割字符串并将其放入数组中,但当另一个字符串进入时,您是否覆盖或添加到列表中?我无法从发布的代码中看到。我建议,因为DataReceived可能只能为你的计时器的一个Tick激发2次或更多次,你将完整的字符串放入集合(ADD),然后在计时器中,你解析它并从中删除它集合。
例如,DataRecieved可能会这样做:
SyncLock MyLock
tempString.add(bufString)
End SyncLock
你的计时器可能会这样做:
SyncLock MyLock
For Each s As String In tempString
Dim sAry As String() = bufString.Split(New Char() {ChrW(2)})
For i As Int16 = 1 To sAry.Length
xlCells(CurrentRow, i).Value = sAry(i - 1).ToString()
Next
Next
tempString.Clear()
End SyncLock
要回答第二个问题,您的问题可能是因为您没有在Excel中设置适当的属性。当你这样做时:
xlCells(CurrentRow, 1) = ?
你应该这样做:
xlCells(CurrentRow, 1).Value = ?