SerialPort.DataReceived和文件输出

时间:2012-11-22 06:58:19

标签: vb.net multithreading

我正在创建一个vb.net windows应用程序来执行许多操作,包括从EEProm下载一堆数据,然后将其保存到文件中。我正在使用DataReceived例程来捕获传入的数据,然后尝试将每16个字节写入二进制文件。我可以正常写文件,但我似乎遇到了交叉线程等问题,我不太熟悉。进度条工作正常,所以我现在需要做的就是将16个字节写入文件。

Private Sub btnTestCom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTestCom.Click

    Dim BaseFolder As String = "c:\"
    CurrentFileName = BaseFolder + "byteArray1.dat"
    Dim fStream As New FileStream(CurrentFileName, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite)
    fStream.Close()

    uart_operation = 2
    DayNum = 0

    If mySerialPort.IsOpen() Then mySerialPort.Close()

    mySerialPort.BaudRate = 256000
    mySerialPort.Parity = Parity.None
    mySerialPort.StopBits = StopBits.One
    mySerialPort.DataBits = 8
    mySerialPort.Handshake = Handshake.None
    mySerialPort.Open()

    AddHandler mySerialPort.DataReceived, AddressOf mySerialPort_DataReceived

    'This is my start byte to the microprocessor
    Dim b() As Byte = New Byte() {254}
    mySerialPort.Write(b, 0, b.Length)
    mySerialPort.BaseStream.Flush()

End Sub

Private Delegate Sub UpdateProgressBar1(ByVal value As Integer)

Public Sub SetProgress(ByVal paramvalue As Integer)
    If Me.InvokeRequired Then
        Me.Invoke(New UpdateProgressBar1(AddressOf Me.SetProgress), paramvalue)
    Else
        Me.ProgressBar1.Value = paramvalue
    End If

End Sub

Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)

    Dim tmpbyte As Byte
    fStream = New FileStream(CurrentFileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)
    Dim bw As New BinaryWriter(fStream)

    'Try

    While mySerialPort.BytesToRead > 0
        Dim msgCharArray(255) As Char
        If mySerialPort.BytesToRead >= 256 Then
            mySerialPort.Read(msgCharArray, 0, 256)
        Else
            'mySerialPort.Read(msgCharArray, 0, mySerialPort.BytesToRead)
            Select Case uart_operation
                Case 2
                    If mySerialPort.ReadByte() = &HFF Then
                        uart_operation = 22
                    End If
                Case 22
                    tmpbyte = mySerialPort.ReadByte()
                    bytearray(bytecount) = tmpbyte
                    bytecount += 1

                    If bytecount = 16 Then
                        bw.Write(bytearray)
                        bytecount = 0
                        DayNum += 1
                        Dim b() As Byte = New Byte() {255}
                        mySerialPort.Write(b, 0, b.Length)
                        mySerialPort.BaseStream.Flush()

                        If DayNum = 366 Then
                            Me.SetProgress(DayNum)
                            MsgBox("Done")
                            Me.SetProgress(0)

                            bw.Close()
                            fStream.Close()
                            bw = Nothing
                            fStream = Nothing

                        Else
                            Me.SetProgress(DayNum)
                        End If

                    End If

            End Select

        End If
    End While
    'Catch ex As Exception
    '   MessageBox.Show("Exception Occured: " + ex.Message)
    'End Try
End Sub

结束班

0 个答案:

没有答案