マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
Uartx_Read()関数で3バイト以上のデータをループで受信すると正しく受信できない
Uartx_Read()関数で3バイト以上のデータをfor文等のループ構造で配列に1バイトずつ受信する場合、正しく受信できない場合があります。
これは、PICマイコンの仕様によるものでレジスタの操作が必要です。PICマイコンのEUSARTの受信レジスタは2バイトであり、ここにデータが2バイト分入ると、次のデータを受信しなくなります。データが2バイト入った状態でオーバーフローエラーが発生し、継続受信ができなくなります。そのためmikroCでループ構造にして複数バイト(3バイト以上)受信しようとすると正しく配列にデータが入らないことになります。

その場合には、SPENビットなどを手動でクリアーする必要があります。
SPENビットはEUSARTの有効/無効を設定するビットですが、これを手動でUartx_Read()関数実行後に一度無効(=0)にして再度有効(=1)にするとバッファがクリアーされ、上記の問題は解決します。

RCSTA.SPEN=0;
RCSTA.SPEN=1;

デバイスによってはレジスタ名が異なっている場合がありますので、使用するデバイスのデータシートのEUSARTの項目を必ずお読みください。オーバーフローについて注意書きがありますので、そこの内容に従いレジスタの手動での操作を記述してください。

※PIC24シリーズの場合にはUART1_Data_Ready()実行後に次のように記述します。

U1STA.OERR=0;

U1STAレジスタはUART1モジュールのステータスレジスタです。OERRビットはRXバッファのオーバーフローを示すビットで手動でクリアできます。UART2モジュールを使っている場合にはU2STAなど適宜変更して記述します。
これによって受信バッファがオーバーフローしなくなり継続してUart1_Read()関数で受信できます。
オリジナル - FAQみたいです - 猫でいいです