串行数据到Excel电子表格

我需要帮助,我接受了一个项目,认为它应该是直接的,但现在我卡住了。 这是一个数据logging程序,需要从COM端口接收串行string,处理string,然后将这些信息放入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 

这就引出了我的第一个问题,那就是如何最好地处理传入的string。 目前我正在将string拆分成一个List(Of String),我假设这是在发送到Excel之前处理string的最佳方法。 如果我错了,请纠正我。 第二个问题是如何最好地处理这个string,然后把这些信息放到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中,我只是不知道如何最好的去做。 任何有关如何最好地完成这一点的见解将不胜感激。 传入的string是一个pipe道分隔,并有一个STX和ETX。

要回答第一个问题,你在做什么工作。 我假设你试图不locking串行端口,而您将信息添加到Excel文件? 如果不是这样,你可以在同一个线程中完成所有工作,而不用做这一切。 但是你这样做很好。

我想build议一些事情

1:当你在multithreading中改变一个对象时,你不得不担心线程的安全性。 为了避免这个问题,你应该使用一个SyncLock 。 他们很容易处理。

2:你似乎在分割string并把它放在一个数组中,但是当另一个进来的时候,你是覆盖还是添加到列表中? 我无法从发布的代码中看到。 我会build议,因为DataReceived可能会触发两次或更多次,只有一个定时器的Tick,所以你把完整的string放到集合(ADD)中,然后在定时器中,parsing它并从采集。

例如,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 = ?