私は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
エンドクラス