2014-10-10 114 views
1

我需要帮助,我接受了一个项目,认为它应该是直接的,但现在我卡住了。这是一个数据记录程序,需要从COM端口接收串行字符串,处理字符串,然后将该信息放入Excel电子表格中。到目前为止,我的串行端口正在工作。串行数据到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。

回答

1

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

我想建议有两件事情

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

2:你似乎在分割字符串并将其放入一个数组中,但是当另一个进来时,你是覆盖还是添加到列表中?我从发布的代码中看不到。我会建议,因为DataReceived可能可能触发2次或更多次,只有一个定时器的Tick,所以将完整的字符串放入集合(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 = ?