1

私はvb.netWindowsアプリケーションを作成して、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

エンドクラス

4

0 に答える 0