5 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()// } } }

Comment on this question

2 Answers

5 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
5 years, 9 months ago.

自分もmbedを最近始めました。やっとシリアル通信を始めたのですが 上記の問題があったようなのでいろいろ調べてみました。

時間が結構たっているので、解決されているかもしれませんが・・・投稿します。

変更内容は2箇所

include "Serial.h" ->#include "RawSerial.h"

Serial SerialPort(p13,p14);->RawSerial SerialPort(p13,p14);

Serial は、割り込み処理内でputc、getcを使用しないほうがいいようです。 RawSerial は割り込み処理内に記述できるように変更した処理になっているそうです。

自分のmbedで上記の問題が発生するのを確認して、修正後にフリーズしない事を確認しました。 (テストは十分にしてないので、解決してないかもしれませんが・・・)

参考にしたリンク https://mbed.org/users/okini3939/notebook/memo_rtos/

Serial では、ミューテックスを使用しているようで、どうも競合?を起こしてフリーズしたみたいです。

つたない書き方で申し訳ないです。

ご回答ありがとうございます。大変助かります。

結局、私も原因は良く分からなかったのですが、MODSERIAL.hと言う別のシリアルライブラリを使ったところ、 問題は発生しなかったため、なんとなく使ってます。 やや動作は遅くなるようですが、バッファー化されているためデータ取りこぼしも無く使えています。 http://mbed.org/users/AjK/code/MODSERIAL/

RawSerial.hも試してみますね。

posted by Kenta Yasuda 17 Feb 2014

You need to log in to post a question