2014-10-10 168 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 = ?