10 years, 10 months ago.

mbed Serial ライブラリを使った全二重通信で、トラブル

初めまして。mbedは初めて3ヶ月程度の初心者です。よろしくお願いします。

Serial ライブラリを使った全二重通信で、 送信は約50Hzでメインループを回しその中でSerial.putc()により行い、 受信はSerial.attach(RxIrq)で割り込みしSerial.getc()で受信します。

送信だけ、受信だけ、なら問題ないのですが(putc()、受信割り込み、のどちらかをコメントアウトすると問題は発生しない) 下記プログラムの状態だと、しばらく動作した後ランダムで問題が発生します。 Rx_interrupt部分が無限に呼び出され続け、メインループがフリーズしてしまいます。 そうなってしまった場合、PC等からの送信を止めても、状況は変わりません。

受信割り込み要求フラグがクリアされない(getc()に失敗?)のような症状で、 原因はputc()とのバッティング等にありそうですが、よく分かりません。 原因、対策など。ご教授下さい。 Serial ライブラリは、19 sep 2013 Modified プラットフォームはLPC1768です。

下記にプログラムを添付

  1. include "mbed.h"
  2. include "Serial.h"

DigitalOut LED_loop(LED1); Serial SerialPort(p13,p14);

static void Rx_interrupt(void) { char test = SerialPort.getc(); /Serial.getc()/// }

static int nLoopCount;

int main() { SerialPort.baud(115200); SerialPort.format(8,Serial::None,1); SerialPort.attach(&Rx_interrupt, Serial::RxIrq);

while(1) { about 50Hz wait(0.02);

LED on and off for Debug if(nLoopCount>20){nLoopCount=0;} else{nLoopCount++;} if(nLoopCount<10){LED_loop=1;} else{LED_loop=0;}

Serial send for(int n_Count=0; n_Count <10; n_Count++) { SerialPort.putc(0x01);/Serial.putc()// } } }

1 Answer

10 years, 10 months ago.

http://mbed.org/forum/ja/topic/4471/

https://mbed.org/forum/bugs-suggestions/topic/4473/

と一緒かなあ。

ライブラリが最新か確認してみては如何ですか。

ご回答ありがとうございます。 ご指摘の部分については、インポートしたソースで、修正(4行削除)されていることを確認しています。 ただ、そのフォーラムの指摘のように、「THRレジスタとRBRレジスタのアドレスが同じ」ならば、 Serialライブラリを修正しても、問題は解決していないのでは?と思います。 あまり詳しくないので、自信はないのですが。

一応、テスターで見たところ、電源や信号ショートによるハードウエア起因のトラブルでは無いようです。 また、putc()を、送信空き割り込みを使用して、CPU占有時間を減らしても、問題は発生します。

posted by Kenta Yasuda 15 Jan 2014