C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 36 を表示中)
■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文字づつ解析すればいいですね。
返信 編集キー/


管理者用

- Child Tree -