- 5865. CCS-CによるRS232C通信について [PICビギナー] 2005/08/19 16:45
- CCS-Cコンパイラ(Ver3.190)を使ってRS232C通信によってPICと通信を行っています。あるコマンドをPICが受けて処理を行うのですが、その処理を行っている最中にコマンドを受信するとPICがハングしてしまっているようです。
処理中に受信しているコマンドは1回ではなく沢山です。
コマンドの受信を行う関数は「getc」,「gets」の両方で行いましたがいずれもハングしてしまっているようです。アセンブラを勉強した時に受信は1個はスタックできるような記述をどこかで目にしました。CCS-Cでコマンドを受信したら処理が終わるまでRS232C機能(UART)を止めるようなことはできないのでしょうか?
使用していますデバイスはPIC16F876Aです。どなたか上記問題を回避できる方法をご存知の方がいましたら教えてください。
- 5870. Re: CCS-CによるRS232C通信について [JO_O] 2005/08/19 18:45
- 毎度JOです。
>>その処理を行っている最中にコマンドを受信するとPICがハングしてしまっているようです
PICをUARTの受信割り込みで使用していると思われます
受信割り込みを禁止すれば、ハングしないでしょうが、
次々と送られてくるコマンドを「破棄」してしまってもいのですか??
- 5877. Re: CCS-CによるRS232C通信について [新参者] 2005/08/19 20:06
- 通信相手はやはりパソコンでしょうか? コマンド形式は把握してますよね?
コマンドがパソコン側のキー入力などで、かつコマンドデータの末尾に必ず改行(CR)コードが付くならば、
全体の処理内容にも拠りますが受信割込み無しでgets関数を使うと
割合い簡単に受信プログラムが組めるかと思います。
条件に当てはまらない場合は受信割込みRDA_isr()ルーチン内でgetc関数を使い、
1バイト毎に受信バッファ(配列データ)へ保存しコマンド末を検知した後に
受信コマンドに応じた処理を行うようにします。
gets関数とgetc関数の使い方は違うので注意が必要です。
gets関数はポーリング受信方式で、改行(CR)コードを受信するまで
関数を抜けずに待ち続けますからハングしたように見えることもあります。
(受信処理中ハングの原因は他にあるかもしれません)
コマンドデータのバイト数・形式や全体の処理に応じてプログラムの組み方を検討すべきです。
現状はどうですか?
- 5881. 投稿者削除 [ ] 2005/08/19 21:25
-
- 5882. Re: CCS-CによるRS232C通信について [ビスコ] 2005/08/19 22:26
-
PICに限らず、多くのマイコンでは、UARTの受信バッファは2byte分が目一杯ですので、
受信バッファは無いものとして考える方がいいです。
どこでどんな処理をしている最中でも、何か受信されたら
「とにかく読みとって受信バッファ内を常に空にしておく」必要があります。
これはタイマー割り込み中でも例外ではありません。
こんな感じでどうでしょう。
unsigned char rx_buffer[20]; // 受信用の配列を19個用意する
unsigned char rx_counter; // 受信配列用の変数
#interrupt SCI_rx(){ // 受信割り込みが入ったら
rx_buff[rx_counter++] = getc(); // とにかく読み込む
}
void main(){
rx_counter = 0; // 受信配列カウンタを0にする
while(1){
何かの処理.....
if(rx_counter != 0){
受信したときの処理
rx_counter = 0; // 受信配列カウンタを空にする。
}
}
}
- 5888. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/20 08:20
- J○_○様 ご返答ありがとうございます。
>>PICをUARTの受信割り込みで使用していると思われます
ソースの中には特にUARTの割り込み処理を記述はしていません。
>>次々と送られてくるコマンドを「破棄」してしまってもいのですか??
はい、破棄してしまって構いません。ただ、コマンドを受け取って、そのコマンドに対する処理が終わったら再び受信状態に戻したいです。
- 5889. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/20 08:26
- 新参者さま ご返答をありがとございます。
通信相手はパソコンです。VBで自分が作成しています。ですので一応コマンドデータのバイト数・形式等は把握しています。ただ、1つのシリアルポートに対して2つのPICをつなげており、片方のPICへは周期的にコマンドを送って、もう片方のPICへは任意のタイミングでコマンドを送りたいのです。こちらの任意のタイミングのPICでは周期的にやってくるコマンドに対しては何も動作しないように書いています。
- 5891. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/20 08:29
- ビスコさま、ご返答をありがとうございます。
ご教授いただいた内容も試してみたいと思います。
- 5892. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/20 08:30
- ´Å`さま、ありがとうございます。
ご指摘の内容は一応、試してみましたがダメでした。
- 5893. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/20 08:38
- J○_○様
1つお伝えし忘れていました。
PICの通信相手はPCです。VBによる自作プログラムより通信を行っています。で、PICですが、1つのシリアルポートに対して2つのPICの受信をつなげています。2つのPICは各々違った動作を行わせるため、コマンドがかち合わないように等、コマンドは分けています。周期的にコマンドを送って動作をしているPICが1つあり、任意のタイミングで受けるPICがもう1つです。この任意のタイミングで動作させるPICが周期的なコマンドを受信しても何も動作しないようにしているのですが、任意のコマンドを受信して動作を開始し、その処理中に周期的なコマンドを受信するとハング状態になってしまいます。わかりにくい説明でスミマセン。
- 5898. Re: CCS-CによるRS232C通信について [新参者] 2005/08/20 13:12
- >新参者さま ご返答をありがとございます。
>通信相手はパソコンです。VBで自分が作成しています。ですので一応コマンドデータのバイト数・形式等は把握しています。ただ、1つのシリアルポートに対して2つのPICをつなげており、片方のPICへは周期的にコマンドを送って、もう片方のPICへは任意のタイミングでコマンドを送りたいのです。こちらの任意のタイミングのPICでは周期的にやってくるコマンドに対しては何も動作しないように書いています。
ちょっと妙なハードウェア構成のようですが、通信相手はPCの自作VBソフトってことですね。
コマンド形式などについて情報もらえないけど、アドバイスとしては…
コマンドの先頭/末尾が明確なデータ形式として、受信PIC側での受信コマンド判別と受信不正時の処理を
きちんとプログラムすることが重要でしょう。
さて、他の方への回答にも目を通した上で…
周期的なコマンドに対し何も動作しないようにしている筈なのに、
周期的なコマンドを受信するとハング状態…って矛盾してますね。
どこにプログラムミスがあるか大体絞れるんじゃないですか。
あるいは「何も動作しない=ハング」みたいなのは冗談としても、
何か間違いが無いかよく見直しましょう。
(ところで受信コマンドに応じた処理中はgetc/gets関数など使ってませんよね?)
またデバッグ環境わかりませんけど、具体的にどんな状態をハングと判断しているんでしょうか。
●気になる点
現状は受信割込み使わず 受信コマンド処理中は受信無視のようですが、
このとき発生する受信オーバーランエラーを考慮してますか?
(因みにPIC内蔵UASRTの受信バッファは2バイト)
受信エラーフラグをクリアしてない為に、それ以後は受信出来ない…って事かもしれませんね。
普通はRCSTAレジスタを操作するところだけど、CCS-Cの通信関数オプションに
errors って便利なのがあるから試してみては?
(受信エラーの自動クリアとエラー判定が可能)
#use rs232(baud=*****,xmit=PIN_C6,rcv=PIN_C7,errors)
オプション詳細はマニュアル参照のこと
http://www.datadynamics.co.jp/ccs/ccs_manual3.7_j.pdf
- 5908. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/22 10:01
- 新参者さま ご返答をありがとございます。
>>CCS-Cの通信関数オプションにerrors って便利なのがあるから試してみては?
ご教授頂きましたオプションをERRORS記述してみたところ問題が解決できました。本当にありがとうございました。ご指摘の通りオーバーランエラーでした。
度重なる質問で申し訳ありませんが、このオプション(ERRORS)ですが、訳も分からずとりあえす#use rs232()の中に記述しただけです。マニュアルには「エラーが発生するとポートをリセットする」とい記述と「受信エラーをRS232_ERRORSへ返す」とあります。今回の私の場合は前述が自動で働いいているおかげだと思うのですが、後述からマニュアルでRS232_ERRORSを参照して処理を行うこともできるのでしょうか?できる場合はどうやって参照できるのでしょうか?
- 5912. Re: CCS-CによるRS232C通信について [新参者] 2005/08/22 18:43
- >ご教授頂きましたオプションをERRORS記述してみたところ問題が解決できました。本当にありがとうございました。ご指摘の通りオーバーランエラーでした。
オーバーランエラーが原因でしたか。解決できて良かったです。
いろいろ余計なことまで書いて失礼しました。
>度重なる質問で申し訳ありませんが、このオプション(ERRORS)ですが、訳も分からずとりあえす#use rs232()の中に記述しただけです。マニュアルには「エラーが発生するとポートをリセットする」とい記述と「受信エラーをRS232_ERRORSへ返す」とあります。今回の私の場合は前述が自動で働いいているおかげだと思うのですが、後述からマニュアルでRS232_ERRORSを参照して処理を行うこともできるのでしょうか?できる場合はどうやって参照できるのでしょうか?
>
(#use rs232 の errorsオプション利用時)
rs232_errors は(byte型)変数として用意されます。
PIC内蔵USART利用の場合、rs232_errorsの内容はRCSTAレジスタの(SnapShot)コピーのようです。
(1バイト受信直後エラークリア前の状態)
なお日本語マニュアルでは一部誤訳かも
変数として自由に参照できます。(SnapShotなので参照専用と考えてください)
例:
if (rs232_errors & 0x6)
{(受信エラー有り時の処理)}
else
{(受信エラー無し時の処理)}
RCSTAレジスタ等を参照・操作する場合は次のように定義しておきます。
#byte RCSTA 0x18 //受信STATUS (PIC16F87x etc.)
- 5918. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/23 10:37
- 新参者さま、ご返答をありがとうございます。
>>変数として自由に参照できます。
>>if (rs232_errors & 0x6)
>>{(受信エラー有り時の処理)}
とありますが、0x6とは何でしょうか??
何度もスミマセンがご教授をお願いします。
- 5919. Re: CCS-CによるRS232C通信について [新参者] 2005/08/23 13:11
- >>>if (rs232_errors & 0x6)
>>>{(受信エラー有り時の処理)}
>
>とありますが、0x6とは何でしょうか??
& 0x6 は bit1,2参照のbitマスク。(0x6 = 0b00000110)
rs232errorsのbit1,2の意味はRCSTAレジスタについて調べてみてください。
http://www.picfun.com/pic19.html
- 5920. Re: CCS-CによるRS232C通信について [PICビギナー] 2005/08/23 13:16
- 新参者さま、ご返答をありがとうございます。
そういうことなんですね。
随分と理解が深まった気がします。
いろいろとありがとうございました。