USB->シリアル アダプター (Windows 7 64 ビット、VS2013、.Net Framework 3.5 SP1 をターゲット) を介して開発ボックスの外部デバイスと通信するアプリケーションを設計しました。また、Windows XP SP3 および .Net Framework 3.5 SP1 でネイティブ シリアル ポートを備えたテスト ボックスをセットアップしました。外部デバイスは 19200、N、8、1 で通信し、ハードウェア フロー制御をサポートします。デバイスでレポートを開始するときに、フロー制御を [なし] に設定し、DTR をオンまたはオフにするためのチェックボックスを手動で作成すると、DTR がオフになるとデバイスが一時停止するため、フロー制御が機能することはわかっています。
ただし、Windows デスクトップ アプリケーション (Handshake.RequestToSend) を介してハードウェア フロー制御を自動的に機能させるのに問題があります。ハンドシェイクをなしに設定したままにしておくと、通信は「通常」成功します。非常に大きなバッファを設定し、DataReceived ルーチンを可能な限り効率的にしたにもかかわらず、ネイティブ シリアル ポートを備えた低速のテスト ボックスでは、デバイスから大量のデータを要求すると、受信バッファがオーバーランしていると思われることがあります。ドライバー自体でさまざまなフロー制御設定を試しましたが、効果がありませんでした。アプリケーションでハンドシェイクを RequestToSend に設定すると、通信が停止しているように見え、デバイスが最初のステータス要求に応答しません。True/False と DtrEnable および RtsEnable のさまざまな組み合わせを試しましたが、役に立ちませんでした。私' 何時間もインターネットを検索しましたが、これまでに役立つものは何もありませんでした. これが私のコードの一部です:
Private sbReceive_Extract As New StringBuilder 'Receive buffer
Private WithEvents comPort As SerialPort
Private bReady as Boolean = False 'data ready flag
Private bExtract as Boolean = False 'type of data request
Public Sub Status_Request()
sbReceive_Extract.Length = 0 'clear buffer
If Open_Port() = True
comPort.DiscardInBuffer()
comPort.DiscardOutBuffer()
'Send status request to external serial device
comPort.Write(Chr(27) & "?" & Chr(13))
bExtract = False 'Just get status header this time
'Loop until device responds to request
bReady = False
Do Until bReady = True
Application.DoEvents()
'update an onscreen status label as buffer fills
lblStatus.Text = "Buffer read: " & sbReceive_Extract.Length.ToString
Loop
End If
End Sub
Public Function Open_Port() As Boolean
'return code for port open or closed
Dim bReturnResult As Boolean = False
If comPort Is Nothing Then
comPort = New SerialPort
End If
Try
With comPort
.PortName = "COM1" 'comm port 1
.BaudRate = 19200 'transfer speed
.DataBits = 8 '8 bits
.StopBits = StopBits.One
.Parity = Parity.None
.ReadBufferSize = 32768 '32768=size of buffer in bytes
.ReadTimeout = SerialPort.InfiniteTimeout
.Handshake = Handshake.RequestToSend 'works when set to none
.DtrEnable = True 'tried both true/false
.RtsEnable = True 'tried both true/false
.Encoding = Encoding.Default
.NewLine = Chr(13) '13=carriage return
.ReceivedBytesThreshold = 1
End With
If comPort.IsOpen = False Then
comPort.Open()
End If
If comPort.IsOpen = True Then
bReturnResult = True
Else
bReturnResult = False
End If
Catch Ex As Exception
bReturnResult = False
End Try
Return bReturnResult
End Function
Private Sub comVoteExt_DataReceived (ByVal sender As SerialPort, ByVal eArgs As SerialDataReceivedEventArgs) comVoteExt.DataReceived を処理します
Dim sData As Integer = 0 'integer to hold serial data
Try
Do
sData = sender.ReadChar 'take one char off the stack
sbReceive_Extract.Append(Chr(sData))
If bExtract = True Then
'Check for data
If iLength = 0 Then
'hex 04 is end of data on tally stream
If Chr(sData) = Chr("&H04") Then
iLength = sbReceive_Extract.Length
End If
Else
'6 bytes reserved for checksum and carriage return
If sbReceive_Extract.Length >= iLength + 6 Then
'Meets checksum length. Ready for next stage.
bReady = True
End If
End If
Else
'20 bytes of header information
If sbReceive_Extract.Length > 20 Then
'Data is ready for next stage. Minimum header length met.
bReady = True
End If
End If
Loop Until sender.BytesToRead = 0
Catch exc As Exception
End Try
サブ終了
ハンドシェイクの問題を引き起こしているように見えるものはありますか? ポートが開いて通信を開始したら、デバイスを「ウェイクアップ」する方法はありますか? ポートが開いた後に DTREnable を true に設定しようとしましたが、問題ではないようです。私はかなり困惑しています。