« Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常 | トップページ | タミヤ★★ミニ四駆用充電池「NEO CHAMP」950mAh 800サイクル目 »

2022年4月20日 (水)

Arduino IDEでRaspberry Pi Pico:シリアル受信バッファを増やす

「rp2040・1.13.1」内の「docs」「serial.rst」ファイルを
見ますと、
 Serial1.setFIFOSize(128);
 Serial1.begin(baud);
というサンプルが記されていて、setFIFOSizeでバッファを
増やして、受信時の文字抜けを防げるぞとなっています。

Pi Picoの初期設定ではFIFOの32文字
それを指定しただけ増やせるということなのです。
それを確かめてみました。
  ※Arduino-UNOだと、「HardwareSerial.h」の中で
   送受それぞれに64バイトずつ確保されています。

こんなスケッチを書いてみました。
setFIFOSizeでバッファを128文字に。
・1ms周期で受信文字を取り出す。
・順に文字バッファに保存。
・CRが来たらそれをシリアル出力。
・動作確認のためパルス出力。
   P2:1ms周期の受信文字取り出しタイミング
   P3:シリアル出力タイミング
   P4:loopでパルスをトグル
・Serial1:UART0を115200BPSで
・別のマイコンから1秒周期でシリアルデータ
 (71文字+CR+LF)を送り込んで抜けがないかを
 確認。 (71文字に意味はなし たまたま)

オシロで見るとこんな波形。
F000_20220420163701

まず、ドバッとかたまりで受信データがやってきます。
それをゆっくりと1ms周期で読み出しています。
初期設定のまま(FIFOの32文字だけ)だったり、
割り込み処理がうまく行ってないと、バッファが
あふれて文字抜けが発生します。
タイミングにより「CR」を見つけることができなければ
受信後の処理ができなくなってしまいます。
そんなことなく、うまく処理が進みました。

もう少し波形を拡大すると、受信割り込み処理に
時間が取られて、loopパルスが広がっているところが
見えてきます。

F001

しかし・・・
残念なことにシリアル送信側のバッファ容量は
増えていません。
32文字のFIFOのままです。
F004

ですので、「送出文字数 - 32文字」を出し終わる
までの待ち時間が発生します。
Arduino UNOだと、これが64文字なんですよね。
これ、なんとかしたいなぁ。

//  Raspberry Pi PicoのSerial1.setFIFOSizeを確かめる
// 文字バッファ
#define STRBF_SIZ 256 // 文字バッファサイズ
char str_bff[STRBF_SIZ + 1]; // 文字列(null含む)
word str_cnt; // 受信文字数

/***** SETUP *****/
void setup() {
Serial1.setFIFOSize(128); // FIFO
Serial1.begin(115200); // UART0
pinMode(2, OUTPUT); // P2 受信処理中H
pinMode(3, OUTPUT); // P3 送信タイミングでH
pinMode(4, OUTPUT); // P4 loopでトグル
pinMode(LED_BUILTIN, OUTPUT); // LED
}

/***** LOOP *****/
void loop() {
byte f_xLED = 0; // LED点滅用
char c;
uint32_t t, tn; // us計時
tn = micros(); // 開始時
while(1){
f_xLED ^= 1; // LED トグル
gpio_put(LED_BUILTIN, f_xLED);
gpio_put(4, f_xLED); // P4もトグル
t = micros() - tn; // 経過us
if(t >= 1000){ // 1ms経過
tn = micros(); // 現在時
if(Serial1.available()){ // 受信データあり
gpio_put(2, HIGH); // P2 H
c = Serial1.read(); // 1文字読み出し
if(c == '\r'){ // CR?
str_bff[str_cnt] = '\0'; // nullを最後に
gpio_put(3, HIGH); // P3 H
Serial1.print(str_bff); // 受信文字列1行送信
gpio_put(3, LOW); // P3 L
sprintf(str_bff, " (%3dchr)", str_cnt);
Serial1.println(str_bff); // 受信文字数
str_cnt = 0; // 文字数ゼロに
}
else{ // CR以外の文字
if((str_cnt < STRBF_SIZ) && // バッファサイズ内
(isprint(c))){ // 表示可能文字0x20~0x7E
str_bff[str_cnt] = c; // バッファに保存
str_cnt++; // 1文字進める
}
}
}
gpio_put(2, LOW); // P2 L
}
}
}

 

|

« Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常 | トップページ | タミヤ★★ミニ四駆用充電池「NEO CHAMP」950mAh 800サイクル目 »

ラズパイ・ピコ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常 | トップページ | タミヤ★★ミニ四駆用充電池「NEO CHAMP」950mAh 800サイクル目 »