不管是手滑还是被标题骗进来的(后者概率应该不大),解释一下这篇文其实只是俺学习软件模拟串口的一个小应用(用的在线仿真网站,tinkercad),本来是想做两机交互的,结果以为每次只能开一个监视器,就把其中一个UNO变成复读机了,直接贴图和代码
接线如下
上面的UNO介绍
功能 接收从USB硬件串口传来的数据,并通过软件模拟串口传到下面的UNO里,同时时刻留意下面UNO是否传来数据,并及时接收
代码
/* Name: uart.ino Created: 2022/2/8 10:38:48 Author: DESKTOP-EUF0FAK\robinbird */ // Define User Types below here or use a .h file #include "SoftwareSerial.h" String a_str = ""; String hard_str = ""; SoftwareSerial up_s(5, 2); // Define Functions below here or use other .ino or cpp files // void read_str() { while (up_s.available() > 0) { a_str += (char)(up_s.read()); delay(3); } Serial.println(a_str); a_str = ""; } void read_hd_str() { while(Serial.available() > 0) { hard_str += (char)(Serial.read()); delay(3);//延时是为了等待输入的字符进入缓冲区 } up_s.println(hard_str); hard_str = ""; } // The setup() function runs once each time the micro-controller starts void setup() { Serial.begin(9600); up_s.begin(2400); } // Add the main program code into the continuous loop() function void loop() { if(up_s.available() > 0) read_str(); if(Serial.available() > 0) read_hd_str(); }
下面的UNO介绍
功能 接收从上面UNO传来的数据,并直接原数据传回,同时13号引脚控制小LED灯闪烁
代码
/* Name: uart_down.ino Created: 2022/2/8 11:16:35 Author: DESKTOP-EUF0FAK\robinbird */ // Define User Types below here or use a .h file // #include "SoftwareSerial.h" String a_str = ""; SoftwareSerial do_s(3, 4); // The setup() function runs once each time the micro-controller starts void setup() { do_s.begin(2400); pinMode(LED_BUILTIN, OUTPUT); } void read_str() { while (do_s.available() > 0) { a_str += (char)(do_s.read()); delay(3); } do_s.println("I am a reteller, I retell:"); do_s.println(a_str); a_str = ""; digitalWrite(LED_BUILTIN, HIGH); delay(500); digitalWrite(LED_BUILTIN, LOW); } // Add the main program code into the continuous loop() function void loop() { if(do_s.available() > 0) read_str(); }
大概是代码注意事项
个人通过仿真实践感觉两UNO的通讯的波特率和 UNO与主机通讯的波特率不相同(甚至差得远一些)更好,以免出现乱码
软串口和硬串口的函数大体相似,大概为了实现功能,都有如下模块
//检查是否读到缓冲区末尾 while(abb.available() > 0) { char c = abb.read(); str += (char)c;//这里可以来点强转,保证能加上 delay(3);//给数据一点充分进入缓冲区的时间 }
软串口的初始化方法注意一下
其他:把接线看对,有的板子不是都能PCINT中断,以及注意读谁的数据后,要给谁输出
运行结果