Technical Information/etc.
Technical Information/etc./XIAO Serial Extension で説明した方法ではWireを使用するときにSERCOMの競合エラーが発生するので、対策した方法を説明します。
// Serial2 extern Uart Serial2; #define PIN_SERIAL2_TX (4ul) #define PIN_SERIAL2_RX (5ul) #define PAD_SERIAL2_TX (UART_TX_PAD_0) #define PAD_SERIAL2_RX (SERCOM_RX_PAD_1) // Serial3 extern Uart Serial3; #define PIN_SERIAL3_TX (10ul) #define PIN_SERIAL3_RX (9ul) #define PAD_SERIAL3_TX (UART_TX_PAD_2) #define PAD_SERIAL3_RX (SERCOM_RX_PAD_1)
#ifndef Serial2_h #define Serial2_h #include "variant.h" void SERCOM2_Handler(void); #endif
#include "Serial2.h" Uart Serial2( &sercom2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX ) ; void SERCOM2_Handler() { Serial2.IrqHandler(); }
#ifndef Serial3_h #define Serial3_h #include "variant.h" void SERCOM0_Handler(void); #endif
#include "Serial3.h" Uart Serial3( &sercom0, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX ) ; void SERCOM0_Handler() { Serial3.IrqHandler(); }
#include "Serial2.h"
#include "Serial3.h"
// // Serial2, Serial3 機能追加 動作確認 // // 接続 および USBシリアルへの表示(1秒毎) // 開始表示 "Start" // Serial1-Tx (6) - Serial2-Rx (5) "Send 1->" // Serial2-Tx (4) - Serial3-Rx (9) "Send 1->2->" // Serial3-Rx (10)- Serial1-Rx (7) "Send 1->2->3->" // -> Serial0-Tx 結果表示 "send 1->2->3->1->0" #include "Serial2.h" #include "Serial3.h" #include <TimerTC3.h> int sendflag = 0; void sendmsg(void){ sendflag = 1; } void setup() { Serial.begin(115200); Serial1.begin(115200); Serial2.begin(115200); Serial3.begin(115200); delay(3000); while (!Serial); Serial.println("Serial ready."); while (!Serial1); Serial.println("Serial1 ready"); //Serial1.println("Serial1 ready"); while (!Serial2); Serial.println("Serial2 ready"); //Serial2.println("Serial2 ready"); while (!Serial3); Serial.println("Serial3 ready"); //Serial3.println("Serial3 ready"); TimerTc3.initialize(1000000); // 1000,000us = 1s TimerTc3.attachInterrupt(sendmsg); TimerTc3.start(); } void loop() { char rxchr; static char buff1[256]; static char buff2[256]; static char buff3[256]; static int i1=0; static int i2=0; static int i3=0; if (sendflag==1){ sendflag=0; Serial.println("Start"); Serial1.println("send 1->"); // 1->2 } if (Serial2.available() > 0) { // データが受信されたら1バイト読み込む while( -1 == (rxchr = Serial2.read()) ); buff2[i2++] = rxchr; if(rxchr == '\n'){ buff2[i2-2]=0x00; //delete \r\n strcat(buff2,"2->\r\n"); Serial2.print(buff2); // 2->3 i2=0; } } delay(1); if (Serial3.available() > 0) { // データが受信されたら1バイト読み込む while( -1 == (rxchr = Serial3.read()) ); buff3[i3++] = rxchr; if(rxchr == '\n'){ buff3[i3-2]=0x00; // delete \r\n strcat(buff3,"3->\r\n"); Serial3.print(buff3); // 3->1 i3=0; } } delay(1); if (Serial1.available() > 0) { // データが受信されたら1バイト読み込む while( -1 == (rxchr = Serial1.read()) ); buff1[i1++] = rxchr; if(rxchr == '\n'){ buff1[i1-2]=0x00; // delete \r\n strcat(buff1,"1->0\r\n"); Serial.print(buff1); // 1->0(usb) i1=0; } } delay(1); }