主要使用了SerialEvent事件进行测试。测试中发现,这个事件实际上是伪事件,serial0和串口1的事件调用在loop内。而且,serila0 在前面优先,明显感觉,serial0 阻塞影响 serial1的Event,下面为代码,可以直接使用。
#define BTN_STOP_ALARM 0
#define LED_D4 12
#define LED_D5 13
#define TXD1 0
#define RXD1 1
#define ToggleOutput(out) do { digitalWrite(out, !digitalRead(out)); } while(0)
#define ToggleOutBlink(out,interval) do {static uint32_t estp=0;if( (millis()-estp)>=interval ){ estp=millis();digitalWrite(out, !digitalRead(out));} } while(0)
void setup() {
Serial.begin(9600);
Serial1.begin(115200,SERIAL_8N1,RXD1,TXD1);
pinMode(LED_D4, OUTPUT);
pinMode(LED_D5, OUTPUT); //
digitalWrite(LED_D4, LOW);
digitalWrite(LED_D5, LOW);
}
void loop() {
// ToggleOutBlink(LED_D5,1000);
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
/*
void serialEvent() //串口 0
void serialEvent1() //串口 1
void serialEvent2() //串口 2
void serialEvent3() //串口 3
*/
String comdata = "";//声明字符串变量
String comdata1 = "";//声明字符串变量
void serialEvent(){//串口 0
//Serial.println("Got Data on UART...");
while(1){
if(Serial.available()) // if there is data on the line
{
//SerialErrCount=0;
comdata += char(Serial.read());// read string until we see a newline character
comdata.toUpperCase();
if(comdata == "ON")
{
comdata ="";
digitalWrite(LED_D4, HIGH);
Serial.println("I turned it ON!"); // Reply text to send to Serial Monitor
}
else
if(comdata == "OFF")
{
comdata ="";
digitalWrite(LED_D4, LOW);
Serial.println("I turned it OFF"); // Reply text to send to Serial Monitor
}
else {
vTaskDelay(1 / portTICK_PERIOD_MS);
if(comdata.length()>=34){
Serial.println(comdata+"\n"); // Reply text to send to Serial Monitor
//Serial.flush(); //等待串口发送完毕???
comdata ="";
while(Serial.read()>= 0){}//clear serialport
ToggleOutput(LED_D4);
}
}
}else break; // 收到事件后处理完毕自动跳出循环 测试 OK!
//vTaskDelay(1); //必须放一个以便响应其它人物的消息循环,否则将死锁。
}
}
void serialEvent1(){//串口 1
//Serial1.println("Got Data on UART...");
while(1){
if(Serial1.available()) // if there is data on the line 是非阻塞的
{
//Serial1ErrCount=0;
comdata1 += char(Serial1.read()); // read string until we see a newline character
comdata1.toUpperCase();
if(comdata1 == "ON")
{
//comdata1 ="";
digitalWrite(LED_D4, HIGH);
Serial1.println("I turned it ON!"); // Reply text to send to Serial Monitor
}
else
if(comdata1 == "OFF")
{
//comdata1 ="";
digitalWrite(LED_D4, LOW);
Serial1.println("I turned it OFF"); // Reply text to send to Serial Monitor
}
else {
vTaskDelay(1 / portTICK_PERIOD_MS);
if(comdata1.length()>=24){
Serial1.println(comdata1+"\n"); // Reply text to send to Serial Monitor
//Serial1.flush();//等待串口发送完毕???
comdata1 ="";
while(Serial1.read()>= 0){}//clear serialport
ToggleOutput(LED_D5);
}
}
}else break; //收到事件后处理完毕自动跳出循环 测试 OK!
//vTaskDelay(1); //必须放一个以便响应其它人物的消息循环,否则将死锁。
}
}