■18627 / ) |
Re[4]: マイコン(PIC)とのシリアル通信 |
□投稿者/ 組込系の人 (52回)-(2008/05/15(Thu) 10:19:10)
|
■No18620 (れい さん) に返信 > ■No18605 (組込系の人 さん) に返信 >>こんな感じでどうでしょうか? > > serialPort1のクラスが不明なので正確なところはわかりませんが、 > たぶんダメですね。
すいません。自分はSystem.IO.Ports.SerialPortと仮定して話してました。
> > StreamのRead/Writeの実装にはいくつかの流儀があります。 > 昔はいろいろありましたが、 > 最近は以下の振る舞いが一般的です。 > > ・Readが戻るのは > 「バッファがいっぱいになる」 > 「エラーが発生する」 > 「ストリームが終わっている(戻り値=0)」 > 「1バイト以上読み取る(戻り値=読み取ったバイト数)」 > > ・Writeが戻るのは > 「バッファを全て書き終わる」 > 「エラーが発生する」 > > です。 > .Netでもこれが採用されています。 > なので、読み取りが0バイトであるかどうか、常に確認しないといけません。 > また、読み取りはなるべく同時にたくさん行うとよいでしょう。 > >> byte[] buffer = new byte[66]; >> int pointer = 0; >> int receivebytes = 0; >> >> while(pointer < buffer.Length){ >> receivebytes = serialPort1.Read(buffer, pointer, buffer.Length - pointer); >> if (receivebytes==0) throw new XXXException(); >> pointer += receivebytes; >> } >> >
RS232通信なんかやってると、良くSTXだのETXだのの処理で1文字ずつやりたいので 読み込み時に1文字づつ取ってました。 通信が連続していても、ETX受信直後にACK応答を返さないといけないとか その他もろもろの制約でこのような処理になっていたような・・・ 自分が使っているところでは、1文字読み取ったあとに、 ごちゃごちゃと処理をしています。例として示すには不適切でした。
たしかに読み込みは一気にやって読み取った後に1文字づつ解析すればいいですね。
|
|