如何随时向Arduino Nano ATmega328P发送数据修改全局参数?
没问题,我来帮你搞定Arduino Nano ATmega328P的双向串口通信——其实串口本身就是双向的,不需要单独搞个「仅监听」的模式,只要在主循环里兼顾数据接收和原有输出任务就行。下面是一套完整的实现方案,你可以直接复用或者根据自己的需求调整:
Arduino Nano 双向串口通信(指令修改全局参数)
核心思路
- 利用串口的双向特性,在主循环中定期检查接收缓冲区,一旦有指令就解析并修改全局参数
- 保留原有串口输出逻辑,用非阻塞方式处理,确保不会因为等待指令而卡死系统
- 定义清晰的
键=值指令格式,方便扩展更多参数
完整代码示例
// 定义你需要修改的全局参数(根据自己的系统调整) int fanSpeed = 50; // 风扇转速百分比(0-100) float tempSetpoint = 25.0; // 温度设定值(摄氏度) bool ledStatus = false; // LED开关状态 void setup() { // 初始化串口,波特率和你的终端保持一致(这里用9600) Serial.begin(9600); // 等待串口连接(针对USB转串口的场景,可选) while (!Serial) { ; // 空循环等待串口就绪 } Serial.println("系统启动完成!可发送以下指令修改参数:"); Serial.println("格式示例:FAN=80 | TEMP=28.5 | LED=ON"); } void loop() { // 1. 优先处理串口接收的指令 if (Serial.available() > 0) { String input = Serial.readStringUntil('\n'); // 读取一行完整指令(以换行符结尾) input.trim(); // 去除首尾的空格、换行符 // 拆分指令的键和值 int equalsPos = input.indexOf('='); if (equalsPos != -1) { String paramKey = input.substring(0, equalsPos); String paramValue = input.substring(equalsPos + 1); // 根据指令修改对应参数 if (paramKey.equalsIgnoreCase("FAN")) { int newSpeed = paramValue.toInt(); // 校验参数范围,避免非法值 if (newSpeed >= 0 && newSpeed <= 100) { fanSpeed = newSpeed; Serial.print("风扇转速已更新为:"); Serial.print(fanSpeed); Serial.println("%"); } else { Serial.println("错误:风扇转速需在0-100之间"); } } else if (paramKey.equalsIgnoreCase("TEMP")) { float newTemp = paramValue.toFloat(); // 这里可以根据你的需求添加温度范围校验 tempSetpoint = newTemp; Serial.print("温度设定值已更新为:"); Serial.print(tempSetpoint); Serial.println("℃"); } else if (paramKey.equalsIgnoreCase("LED")) { if (paramValue.equalsIgnoreCase("ON")) { ledStatus = true; Serial.println("LED已开启"); } else if (paramValue.equalsIgnoreCase("OFF")) { ledStatus = false; Serial.println("LED已关闭"); } else { Serial.println("错误:LED指令需为ON或OFF"); } } else { Serial.println("错误:未知指令,请参考启动提示的格式"); } } else { Serial.println("错误:指令格式错误,请使用「参数名=值」的格式"); } } // 2. 原有系统的输出/控制逻辑(示例:每秒打印一次当前参数) static unsigned long lastUpdateTime = 0; if (millis() - lastUpdateTime >= 1000) { lastUpdateTime = millis(); Serial.print("当前状态 | 风扇:"); Serial.print(fanSpeed); Serial.print("% | 温度设定:"); Serial.print(tempSetpoint); Serial.print("℃ | LED:"); Serial.println(ledStatus ? "开启" : "关闭"); } // 这里可以添加你的其他硬件控制逻辑(比如驱动风扇、读取传感器等) }
关键细节说明
- 全局参数:把需要修改的变量放在全局作用域,这样指令解析部分可以直接修改它们
- 非阻塞接收:用
Serial.available()判断是否有数据,不会阻塞主循环的其他任务 - 指令容错:对格式错误、非法参数值做了提示,避免系统因为错误指令出问题
- 大小写兼容:用
equalsIgnoreCase()处理指令,输入fan=60和FAN=60都有效,更友好
使用方法
- 把代码上传到Arduino Nano
- 打开串口监视器(波特率设为9600)
- 在输入框发送指令,比如:
FAN=75:将风扇转速设为75%TEMP=27.0:把温度设定值改成27℃LED=ON:开启LED
- 你会看到Arduino回复参数更新结果,同时每秒自动打印一次当前的全局参数状态
内容的提问来源于stack exchange,提问作者user7320967
相关产品推荐
相关产品推荐

