タイトル : Re: シリアル通信の割込み禁止 投稿日 : 2009/10/19(Mon) 01:05 投稿者 : オショウ
> 割り込み禁止?の手続きがわからない為、途中で受信割り込みが > 走ってしまい、うまくいかず困っています。 数々シリアル通信のコードは書いてますが・・・ わざわざ割り込み禁止にしなければならない理由 が解りません。 確かにシリアル通信は、全2重なので、送信しながらや 受信しながら、反する受信する・送信するという機能は 行えます。 が、一般的にコマンド等文字列を送信し、相手から何等 かの結果(ステータス)が返信されてこないと、次の送 信は行いません。 よって、動作は半2重的です。 今回、問題になっているのは、送信の完了・受信の完了 が正しく行えていない為に発生しているのでは? また、シリアル通信のタイムアウト設定が為されてませ んが、タイマーでタイムアウト処理を行わせることも、 可能です。 汎用的に行うのであれば、シリアル通信クラスのタイム アウト設定を使うより、送信完了後の受信タイムアウト にタイマー使う方がある意味便利です。 それと、SerialPort_DataReceivedで、わざわざデリゲー ト使ってSetRecieveDataを行わせると、実際に受信バッ ファにデータが着ているにも関わらず受信動作が行われ るのが余計に遅延してしまいます。 ReceivedBytesThreshold = 1 と言う設定ですが、実際にDataReceivedのイベント処理 に入った段階では、1バイト以上の受信データがバッファ に入っている場合もあります。 シリアル通信は非同期処理なので、わざわざ割り込みを どうこうする細工を行うより、イベントが発生した時点 で、バッファにあるデータを一気に読出し、アプリ内で の受信データ処理で細工をする方が安全です。 因みにそのマイコンとの通信ですが、プロトコルが定義 されていると思いますが、アスキー通信?バイナリ通信? またアスキー通信の場合、デリミタがあるならば、その デリミタを受信待ちさせるようにしてやれば、受信ルー チンが簡素化し高速化します。 以上。参考まで |