|
RT,最近要做一个小玩意,需要一块 Arduino 与电脑通讯,根据电脑发来的指令控制另一块装有 GRBL 的 Arduino,与电脑通讯的 Arduino 还要同时处理别的设备发来的串口数据,于是折腾了一番,终于解决了,记录如下,供需要的筒子们参考:
简单的说,就是想用一块 Arduino 同时接收硬件串口和软件串口发来的不同指令,处理后用软件串口将 G 代码发给另一块装了原版 GRBL 的 Arduino。方法如下:
首先我们将处理指令的 Arduino 称为 A,装了 GRBL 的 Ardunio 称为 B,将 A 的 pin 5 和 pin 6 设为了软件串口的 RX 和 TX,然后将 A 的 pin 5(RX) 连接到 B 的 pin 1(TX),再将 A 的 pin 6(TX) 连接到 B 的 pin 0(RX),A 和 B 的 GND 也要相连。然后在 A 中写入如下代码:
- #include <SoftwareSerial.h> // 软件串口
-
- // 软件串口设置
- SoftwareSerial WRSerial(3, 4); // 其他软件串口数据通讯TTL RX, TX
- SoftwareSerial GBSerial(5, 6); // GRBL数据通讯TTL RX, TX
- String WRComData = ""; // 串口字串缓存
- String GBComData = ""; // 串口字串缓存
-
- void setup() {
- // 串口初始化
- Serial.begin(9600);
- GBSerial.begin(9600);
- WRSerial.begin(9600);
- }
-
- void loop() {
-
- // 其他软件串口数据处理
- while(WRSerial.available()) {
- WRComData += char(WRSerial.read()); // 将串口数据全部写入字串
- delay(2);
- }
- if(WRComData.length() == 11) {
- // 任意内容
- }
- WRComData = ""; // 清除缓存
-
-
- // GRBL数据处理
- while(Serial.available()) {
- GBComData += char(Serial.read()); // 将串口数据全部写入字串
- delay(2);
- }
- if(GBComData[0] == 'G') {
- GBSerial.listen();
- GBSerial.println(GBComData);
- WRSerial.listen();
- }
- GBComData = ""; // 清除缓存
-
- }
复制代码
运行后,如果 A 接收到从硬件串口(比如电脑)传来的 G 代码,则将该代码完整的发送给 B,同时 A 还可以随时接收来自 pin 3(RX) 和 pin 4(TX) 串口的数据,进行其他处理。
如果大家有更好的办法,欢迎探讨 |
|