RS232 通信(2)
PC_b のプログラムです
よろしくお願い申し上げます
Private Sub cmdPort1_Click()
'変数宣言省略
' 使用するシリアルポートを設定します。
Port1.PortNumber = 3
' 通信条件を設定します。
Port1.BaudRate = 9600
Port1.DataBits = 8
Port1.StopBits = 1
Port1.Parity = parNone
' 受信バッファのサイズを設定します。
Port1.InputBufferSize = 4096
' 送信バッファのサイズを設定します。
Port1.OutputBufferSize = 4096
' フロー制御の種類を設定します。
Port1.Handshaking = hsRtsCts
' シリアルポートをオープンします。
blnOpenRet = Port1.Open(3, 9600, 8, 1, hsRtsCts, parNone, _
10000, 10000, iomBlocking)
On Error Resume Next
' 使用するシリアルポート、通信条件を設定し、
' シリアルポートをオープンします。
' 文字列にCR+LFを付けてデータを送信します。
lngOutputRet = Port1.Output("abcdefg1234" & Chr(&HD) & Chr(&HA))
' 受信処理を行います。
lngInputRet = Port1.Input(strInputString, 5)
' 送信バッファにデータが残っている場合、
' すべてが送信されるまで待機します。
Do
DoEvents
Loop Until Port1.OutputBufferByteCount = 0
' 送信バッファと受信バッファをクリアします。
Port1.ClearOutputBuffer
Port1.ClearInputBuffer
'オープンしているシリアルポートをクローズします。
If Port1.Opened Then
' シリアルポートをクローズします。
Port1.Close
End If
End Sub
関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=453883
お礼
補足するに書きたかったのですが、クリックできない ので、お礼を投稿するに書かせていただきました・・・ >ブロッキングモードでselectしてますか? ソースを見てみましたが、いまいち理解できません できたらもう少し詳しくご説明願えないでしょうか? read()は不要なループを避けるため、ブロッキング モードになっています。 これがいけないのでしょうか? ちなみにsigaction()関連は以下のとおりです alarm(60); struct sigaction act; act.sa_handler = warikomi; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGALRM, &act, 0); どうぞよろしくお願いいたします
補足
ご回答ありがとうございます >ブロッキングモードでselectしてますか? ソースを確認してみます >あと、sleep()じゃなくてわざわざalrm()を使うのは何故でしょうか? 受信するデータが連続して大量に来ることがあるのでalrm()を使用しています。 sleep()を使用するとバッファ(4096byte)からあふれて取りこぼしが発生してしまいました。 >select()使わずに、ブロッキングモードでオープンしてread()だけですむ気がするんですけど。 勉強不足です。早速調べてみます。