人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

arduino micro について


void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println(Serial.available());
}

上記のようなプログラムをarduino microとarduino UNOに書き込み、
シリアルモニタで文字を打ち表示させると、
microの方は0 1で動作が停止してしまう。
対しUNOの方は0から63まで表示される。
どういうことなの…
改善案はあるの…?

●質問者: 匿名質問者
●カテゴリ:コンピュータ 趣味・スポーツ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● 匿名回答1号
ベストアンサー

Serial.available() は
arduinoの受信バッファに溜まっている文字の数を返す関数です

受信バッファには上限があり,その上限が micro は1で,UNOは63ということでしょう.つまり microは最大2文字, UNOは64文字までなら受信バッファに保存できる,ということになります


とりあえず 受信バッファに溜まっている文字は read を呼べば取り出せるので
以下のようにプログラムすれば数字が増えたり減ったりするはずです

void loop()
{
Serial.println(Serial.available());
Serial.read() ;
}

匿名質問者さんのコメント
説明不足で済みません、以前に if(Serial.avaiable>2) { //うんたらかんたら } と言うものを作ってUNOとmicroで比較させて案の定microが息を詰まらせるんです。 いろいろNETを回ってみたところ Serial.println(SERIAL_BUFFER_SIZE); というものでバッファのサイズを確認したところ、 UNOもmicroも同じ 64 でした。 コメントで長文すみません。

匿名回答1号さんのコメント
バグかも知れません レポートが上がっていました https://github.com/arduino/Arduino/issues/4964 マニュアルに書かれた挙動とは異なっている ハードウェアの仕組み上しかたない とかいろいろ書いてあります

匿名質問者さんのコメント
Serial.abailable()>1以上 が使用不能と判断したため、別の策を練ろうと思います。 ありがとうございました。

匿名回答1号さんのコメント
個人的にも Serial.avaiable() > 2 のような使い方は やめた方が良いと思います 理由は,たとえば - 受信バッファが溢れ,受信文字の一部が取りこぼされた場合 - 通信エラーで一文字欠落した場合 - 送信側プログラムがデータ送信中に途中で止まったり,再起動した場合 などに,リカバリ処理の実装が難しくなるからです Serial.avaiable() がゼロ以外なら,read()で一文字読み込む という処理を書いた方が,バグが少なく,実用的なコードになるように思います

匿名質問者さんのコメント
あのプログラムは試験的に簡略したものです。 指摘ありがとうございます。 実用的には、 UNO int PL,PR,a; void setup() { Serial.begin(115200); } void loop() { Serial.write('L'); if(Serial.available()>2) { if(Serial.read()=='A') { if(Serial.read()=='A') { PL=Serial.read(); } } } analogWrite(5,PL); Serial.write('R'); if(Serial.available()>2) { if(Serial.read()=='D') { if(Serial.read()=='D') { PR=Serial.read(); } } } analogWrite(6,PR); } です、文字でPWMの値を送っています。 これをMICROに搭載しようとして、息がとまってしまっていました。 今回上記の点を理解し、 char c[4]; int a=0; int PL,PR; void setup() { Serial.begin(115200); } void loop() { while(a<3) { Serial.write('L'); Serial.write('R'); if(Serial.available()) { c[a]=Serial.read(); a++; } if(a>=2) { if(c[0]=='A'){ if(c[1]=='A') {PL=c[2];}} if(c[0]=='D'){ if(c[1]=='D') {PR=c[2];}} } } analogWrite(5,PL); analogWrite(6,PR); a=0; } このようにして、挙動を似せました。

匿名回答1号さんのコメント
a=0 の位置を if (a>=2)の末尾に移動させると, プログラムが読みやすくなると思います >|c| Serial.write('L'); Serial.write('R'); if(Serial.available()) { c[a]=Serial.read(); a++; } if(a>=2) { if(c[0]=='A'){ if(c[1]=='A') {PL=c[2];}} if(c[0]=='D'){ if(c[1]=='D') {PR=c[2];}} a=0; /* ここに a=0 を移動 */ } ||< これで while (a<3) のループが不要になります

匿名質問者さんのコメント
1人で物事を済ませようとすると無駄な行動をやってることがありますね。 ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ