【M5Stack_Core2】Serial 入力制御
目的を失ってキャレット制御や、BASICやXon/Xoffなどとっ散らかってしまったのでシンプルに入力を
今回わかったこと
M5Core2で使われている、ESP-IDF3.3はRXbufferは256。FIFOでいったん受信したデータは取り出さない限り消えない。
また、bufferをオーバーするとそのデータは消えていく。Serialクラスでは、Xon/Xoffをサポートしていない。ESP32のハードウエアでは
サポートしているっぽい。
// // inkey // // 2020/10/11 chiyo.h // #include <M5Core2.h> #include <utility/Sprite.h> #include <stdio.h> #define ESP32 TFT_eSprite spr = TFT_eSprite(&M5.Lcd); int rxBufferClear(){ int sBuf = Serial.available(); int dat; // read dummy. for(int i=0;i<sBuf;i++){ dat = Serial.read(); } return sBuf; } void setup() { M5.begin(); // 外部I2C off Serial.printf("\n"); Serial.flush(); rxBufferClear(); // serial read clear. delay(50); yield(); M5.Lcd.fillScreen(WHITE); M5.Lcd.setTextColor(BLACK); M5.Lcd.setTextSize(2); M5.Lcd.clear(WHITE); M5.Lcd.setCursor(10, 10); M5.Lcd.printf("Serial Test!"); Serial.println("Serial input test."); Serial.print(">"); // スプライト定義 spr.setColorDepth(8); // カラーモード spr.createSprite(320, 240); // 大きさ spr.fillSprite(TFT_WHITE); delay(50); yield(); } char inKey(){ int rSize = Serial.available(); if(rSize == 0){ return 0; } char c = Serial.read(); rSize--; for(int i=0;i<rSize;i++){ char d = Serial.read(); } return c; } uint32_t color = TFT_BLACK; void selectColor(uint32_t c){ switch(c){ case 'B': color = TFT_BLUE; break; case 'R': color = TFT_RED; break; case 'G': color = TFT_GREEN; break; case 'K': color = TFT_BLACK; break; } } void loop() { char c = inKey(); if(c != 0){ Serial.println(c); selectColor(c); // PC端末の押したキーによって制御を変える spr.drawChar(0,0,c,color,TFT_WHITE,4); spr.pushSprite(64,64); spr.fillSprite(TFT_WHITE); Serial.print('>'); } delay(10); yield(); }
まとめ:毎回parameter変更してコンパイルしなおすよりキーボード制御でモード切替をして動かすほうがいいかな。