2

関数 serialEvent のリファレンスが Arduino について十分に文書化されていないことを伝え始めます。 https://www.arduino.cc/en/Reference/SerialEvent

情報が不足しているため、この機能がどのように機能するかを誤解しています。私がArduino Mega 2560を持っているので、4つのシリアル入力/出力が付属しており、それらには独自のserialEventX関数があります(X = {'',1,2,3})。

ESP8266 モジュールとの通信に成功しました。ESP8266 モジュールは、クライアントが接続されると情報を送受信します。

serialEvent1 (RX1 と TX1 に接続されているため 1) を使用して、データが着信したときにのみ serialEvent1 を呼び出したいのですが、実際には Serial1.write(msg) を使用するたびに呼び出されるため、メッセージが送信されているときを意味します。

#define DEBUG_ESP8622 1
#include <esp8622.h>
#include <string.h>
#include "common.h"
#include <stdlib.h>
Wifi esp = Wifi(); //Here Serial1.begin(115200) happens
void setup() {
  Serial.begin(9600); //First of all SERIAL for debugging
  Serial.println("Starting");

  while(!esp.sReachable());   //Works
  Serial.println("ESP found");

  while(!esp.sSetMode(1));    //Works
  Serial.println("Mode set to Client");

  while(!esp.sConnect(WIFISSID,WIFIPASSWORD));  //Works
  Serial.println("Connected");
  Serial.print("IP:");
  Serial.println(esp.getIP());

  while(!esp.sStartServer(80));  //Works
  Serial.println("Server started");
}
void loop() {
    if(Serial.available()>0){
            int inByte=Serial.read();
            /*HERE whenever I call Serial1.write(inByte)
              serialEvent1 will be called at the end of the loop
              but actually I don't want it to
            */
            Serial1.write(inByte);
    }

}
void serialEvent(){
    return;
}
void serialEvent1(){
   Serial.println("Write or Read event?");
   while(Serial1.available()>0){
      int inByte=Serial1.read();
      //Serial.write(inByte);
   }
   //esp.onSerialEvent(); //Stores message and parses it, not relevant
   return;
}

Arduino ライブラリが AVR libc ライブラリに基づいていることがわかったので、マイクロコントローラ内の RX1 および TX1 割り込みは、Arduino ライブラリを介して serialEvent1 の両方にバインドされていると思います。

ライブラリを使用して serialEvent1 から TX1 のみをバインド解除し、Arduino ライブラリ (Serial1.write()/read()) を引き続き使用することは可能ですか?

Makefile を使用して Mega にコードをアップロードする最も簡単な方法を使用します。これまでのところ、私のニーズに合っているため、コマンドラインからarduinoを使用することを選択しました.avrdudeとavr-gccは、コマンドラインからコンパイル/アップロードするためのより完全で優れた方法であることを知っています。間違っている場合は修正してください。

CC=arduino
upload: terminal.ino
    $(CC) terminal.ino --upload

verify: terminal.ino
    $(CC) terminal.ino --verify

を使い始めたら、代わりに avrdude と avr-gcc の使い方を学び始めるべきですか? (または、AVR ライブラリを使用しているという事実とは関係ないかもしれません)

最後に、上記の Makefile を USB ケーブルで使用しています。avrdude と avr-gcc を使用する場合、ICSP 経由ですか、それとも USB ケーブル経由で使用できますか? これはブートローダーを削除しますか?

どうもありがとう

4

1 に答える 1

0

はい、SerialEvent関数はばかげています。でのポーリングと同じloopです。loop時間のかかる作業を行ってすぐに戻らないと、データが失われる可能性があります。解決策は RX 割り込みにアタッチすることですが、組み込みクラスではサポートされていませんHardwareSerial

HardwareSerialRX 割り込みにアタッチできるように修正したバージョンを投稿しました。それはNeoHWSerialと呼ばれます。

NeoSerial[#]これは置換であるため、変数のみを使用する必要があります。同じスケッチでSerialとを使用することはできません。を呼び出さなくても、代わりにNeoSerial1使用してください。NeoSerialSerialNeoSerial.attachInterrupt

void setup()
{
  NeoSerial.begin( 9600 );            // replaces `Serial.begin(9600)`
  NeoSerial.println( F("Started.") ); // ... and all your prints, too

  NeoSerial1.attachInterrupt( myRxFunction );
  NeoSerial1.begin( 9600 );

が割り込みmyRxFunctionに呼び出されることに注意してください。各文字をすばやく処理する必要があり、 や など、割り込み中ではないことに依存するものを呼び出さないでください。悪いジュジュ!printmillis()

また、一致する IDE バージョンのサブディレクトリ (1.6.5r2 など) 内のファイルがサブlibraries/NeoHWSerialディレクトリにコピーされていることを確認してください。 入れたりしないでください。libraries/1.0.5libraries/1.6.5r2

于 2016-01-27T16:33:24.437 に答える