/*****************************************/ /* シリアルデータ入力のテスト */ /* RX0:GP1とRX1(GP5)を入力してUSBに出力 */ /*****************************************/ // 2023-03-30 // GP1 RX0 シリアルch1受信 // GP5 RX1 シリアルch2受信 // GP16 SW1 動作モード設定SW1,2 // GP17 SW2 // GP18 SW3 プッシュSW // GP20 LED2 赤:アクセス表示,エラー // GP20 LED1 緑:待機中点灯,記録中点滅 // テストポート // GP6 TX0タイミング // GP7 TX1タイミング /***** 初期設定 *****/ UART Serial2(4, 5, NC, NC); // そのままではSerial2が使えないので // ピン番号指定を実行 /***** マクロ *****/ #define LED_BLINK digitalWrite(LED_BUILTIN, f_xLED) #define GP6_H gpio_put(6, HIGH) #define GP6_L gpio_put(6, LOW) #define GP7_H gpio_put(7, HIGH) #define GP7_L gpio_put(7, LOW) /***** データ *****/ uint32_t tm_1sec; // 1秒タイマー #define BFF_SIZE 80 // 文字バッファの文字数 char rx_bff0[BFF_SIZE]; // 文字入力バッファ char rx_bff1[BFF_SIZE]; char tx_bff0[BFF_SIZE]; // 文字出力バッファ char tx_bff1[BFF_SIZE]; // rx_bffをコピーしてf_rxをオン int rx_wrp0; // 受信データ書き込みポインタ int rx_wrp1; byte f_rx0; // 受信完了フラグ byte f_rx1; byte f_xLED; // LED点滅用 /***** 記録モード入力 *****/ // SW2,SW1を入力 // off off 0 ch1とch2受信入力を独立してログ // 行頭に"1: ","2: "を付加 // off on 1 ch1を先頭にしてch1が来た時に // ch2データをその行末に付加。 // 新ch2データが無くても古いデータを使う。 // on off 2 ch1を先頭にしてch1が来た時に // ch2データをその行末に付加。 // その後,ch2データは消すのでch1データしか // 残らないこともある。 // on on 3 予備 int logmode(void) { int r = 0; if(gpio_get(16)) r |= 0b01; // SW1 if(gpio_get(17)) r |= 0b10; // SW2 return r; } /***** SETUP *****/ void setup() { pinMode(LED_BUILTIN, OUTPUT); // LED pinMode(1, INPUT_PULLUP); // GP1 RX0 pinMode(5, INPUT_PULLUP); // GP5 RX1 pinMode(6, OUTPUT); // GP6 テストポート pinMode(7, OUTPUT); // GP7 テストポート pinMode(16, INPUT_PULLUP); // GP16 SW1 pinMode(17, INPUT_PULLUP); // GP17 SW2 pinMode(18, INPUT_PULLUP); // GP18 SW3 Serial.begin(9600); // USB Serial1.begin(9600); // RX0,TX0 Serial2.begin(9600); // RX1,TX1 tm_1sec = millis(); // 現時間 } /***** LOOP *****/ void loop() { uint32_t tm1; char c; delay(1000); // wait Serial.println("Test RX0,RX1"); // USBに出力 while(1){ // loop tm1 = millis(); // 現時間 if((tm1 - tm_1sec) >= 1000){ // 1秒経過 tm_1sec = tm1; f_xLED ^= 1; // LED点滅 LED_BLINK; } // RX0入力チェック if (Serial1.available() > 0){ // 受信データあり GP6_H; // (!!!) c = Serial1.read(); // 1バイト読み出し if(c == '\r'){ // CR rx_bff0[rx_wrp0] = '\x0'; // 最後にnullを strcpy(tx_bff0, rx_bff0); // 送信バッファにコピー f_rx0 = 1; // 受信ok rx_wrp0 = 0; // 書き込みポインタ } else if(isprint(c)){ // 表示可能文字 if(rx_wrp0 < (BFF_SIZE-1)){ // 書き込みできる? rx_bff0[rx_wrp0] = c; // 文字をバッファに rx_wrp0++; // 書き込みポインタを進める } } GP6_L; // (!!!) } // RX1入力チェック if (Serial2.available() > 0){ // 受信データあり GP7_H; // (!!!) c = Serial2.read(); // 1バイト読み出し if(c == '\r'){ // CR rx_bff1[rx_wrp1] = '\x0'; // 最後にnullを strcpy(tx_bff1, rx_bff1); // 送信バッファにコピー f_rx1 = 1; // 受信ok rx_wrp1 = 0; // 書き込みポインタ } else if(isprint(c)){ // 表示可能文字 if(rx_wrp1 < (BFF_SIZE-1)){ // 書き込みできる? rx_bff1[rx_wrp1] = c; // 文字をバッファに rx_wrp1++; // 書き込みポインタを進める } } GP7_L; // (!!!) } // 受信データ送信 SW1,S2の状態で記録方法を決定 switch(logmode()){ case 0: // ch1,ch2 別の行で記録 case 3: if(f_rx0){ // RX0 ch1 1行受信? GP6_H; // (!!!) Serial.print("1: "); Serial.println(tx_bff0); // USBに出力 f_rx0 = 0; // 次を待つ GP6_L; // (!!!) } if(f_rx1){ // RX1 ch2 1行受信? GP7_H; // (!!!) Serial.print("2: "); Serial.println(tx_bff1); // USBに出力 f_rx1 = 0; // 次を待つ GP7_L; // (!!!) } break; case 1: // ch1を優先 ch2を行末に付加 if(f_rx0){ // RX0 ch1 1行受信? GP6_H; // (!!!) Serial.print(tx_bff0); // ch1を出力 f_rx0 = 0; // 次を待つ if(f_rx1){ // RX1 ch2 1行受信している? Serial.print(" "); // space 1つ Serial.print(tx_bff1); // ch2を行末に付加 } // f_rx1は残したまま Serial.println(); // 改行 GP6_L; // (!!!) } break; case 2: // ch1を優先 ch2を行末に付加してch2の次を待つ if(f_rx0){ // RX0 ch1 1行受信? GP6_H; // (!!!) Serial.print(tx_bff0); // ch1を出力 GP6_L; // (!!!) f_rx0 = 0; // 次を待つ if(f_rx1){ // RX1 ch2 1行受信している? Serial.print(" "); // space 1つ Serial.print(tx_bff1); // ch2を行末に付加 f_rx1 = 0; // 次を待つ } Serial.println(); // 改行 GP6_L; // (!!!) } break; } } } /*==== end of "tx_data_2ch1.ino" ====*/