串行数据到Excel电子表格

时间:2014-10-10 21:20:43

标签: vb.net excel serial-port

我需要帮助,我接受了一个项目,认为它应该是直截了当的,但现在我被卡住了。这是一个数据记录程序,需要从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。

1 个答案:

答案 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 = ?