タイトル : Re^4: シリアル通信で異常に時間がかかってしまう 投稿日 : 2010/01/27(Wed) 09:04 投稿者 : ぽると
> PC1→PC2の伝文は可変長になっているのでしょうか? PC1→PC2への伝文は14文字の固定長となっています。 PC2→PC1への応答伝文は可変長です。4文字〜130文字。 > あと、伝文の解析部があると思いますが、 > それはどこから呼ばれるようになっているのでしょうか。 > タイマー内なら今回は大丈夫でしょうが、DataArrivalで呼ばれているのなら、 > 最長の処理時間は次回のTCP受信に間に合っていますか? > (DoEventsから復帰できるだけの余裕がありますか?) 伝文解析処理は DataArrival イベント内にて行っております。 PC1から送られてきた伝文を判断し、応答伝文を作成し、 SendData しています。 その部分の表記が抜けていたようで申し訳ないです。 処理時間が間に合っているかどうかについては、特に意識していませんでした。 早速確認してみようと思います。 > DataArrivalの処理内で毎回Closeされているようですが、 > 分割して受信することがあるので > 1伝文が揃ってからでないと下手をするとコマンドが落ちるかもしれません。 コマンド落ちについては DataArrival イベント発生時の引数 bytesTotal が 14 で コールスタックログに記録されているため大丈夫ではないかと判断しています。 また伝文解析処理にてコマンド落ち等でおかしな伝文が送信されてきた場合は、 コマンドエラーとしてPC1側に応答伝文を返しています。 PC2側の DataArrival 処理にて伝文解析処理とSendData部分が抜けていた為 修正しました。 '// ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆ '// PC2( DataArrival 修正版 ) '// ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆ Private Sub winsockClient_DataArrival(ByVal bytesTotal As Long) Dim lstrBuffer As String winsockClient.GetData lstrBuffer If (winsockDaemon.State <> sckListening) And _ (winsockDaemon.State <> sckClosed) Then winsockDaemon.Close End If winsockDaemon.Listen If (winsockClient.State <> sckConnected) And _ (winsockClient.State <> sckClosed) Then .Close End If ' 受信した伝文に応じて応答伝文を作成します <伝文解析処理> ' 応答伝文送信( 文字数は可変長4〜130文字 ) winsockClient.SendData <応答伝文> End Sub |