如何将Arduino发送的串口数据存为缓冲区并在Processing中格式化打印
解决Arduino串口数据在Processing中按指定格式打印的问题
你的核心需求是把Arduino分多行发送的功率数据,在Processing控制台整理成REV [数值] W和FWD [数值] W的单行格式。问题根源在于Arduino当前是分多次发送零散字符串(比如先发"REV",再发数值,再发"W"),而Processing只是直接打印原始接收内容,所以保留了杂乱的换行结构。
下面给你两种可行的解决方案,按需选择:
方案一:修改Arduino代码,直接发送格式化后的整行数据
这种方法最直接高效,让Arduino提前把数据拼接成你想要的格式再发送,Processing只需要简单接收打印即可。
修改后的Arduino代码:
// 读取模拟值 int analog_value = analogRead(A0); // 正向电压读数 int analog_valuer = analogRead(A1); // 反向电压读数 // 计算电压值 float fwd_voltage = (analog_value * 5.0) / 1024.0; float rev_voltage = (analog_valuer * 5.0) / 1024.0; // 计算功率值 float fpower = (fwd_voltage * fwd_voltage) * 10000; float rpower = (rev_voltage * rev_voltage) * 10000; // 直接拼接成目标格式发送 Serial.println("REV " + String(rpower) + " W"); Serial.println("FWD " + String(fpower) + " W");
配套简化后的Processing代码:
import processing.serial.*; Serial port; void setup() { // 替换成你的Arduino对应串口,可用Serial.list()查看所有端口 port = new Serial(this, Serial.list()[0], 9600); } void serialEvent(Serial port) { String val = port.readStringUntil('\n'); if (val != null) { println(val.trim()); // 去除多余换行和空格后打印 } }
方案二:修改Processing代码,通过缓冲区拼接数据
如果无法修改Arduino代码,那Processing需要把零散的多行数据收集到缓冲区,等凑齐完整的一组数据后再格式化输出。
修改后的Processing代码:
import processing.serial.*; Serial port; String dataBuffer = ""; // 存储未处理的串口数据缓冲区 void setup() { // 初始化串口,波特率需与Arduino一致(默认9600) port = new Serial(this, Serial.list()[0], 9600); } void serialEvent(Serial port) { // 读取所有可用的串口字符,存入缓冲区 while (port.available() > 0) { char incomingChar = port.readChar(); dataBuffer += incomingChar; } // 检查是否收集到完整的REV+FWD数据块 if (dataBuffer.contains("REV") && dataBuffer.contains("FWD") && dataBuffer.indexOf("W", dataBuffer.indexOf("FWD")) != -1) { // 提取反向功率数值 int revStart = dataBuffer.indexOf("REV") + 3; int revWPos = dataBuffer.indexOf("W", revStart); String revValue = dataBuffer.substring(revStart, revWPos).trim(); // 提取正向功率数值 int fwdStart = dataBuffer.indexOf("FWD") + 3; int fwdWPos = dataBuffer.indexOf("W", fwdStart); String fwdValue = dataBuffer.substring(fwdStart, fwdWPos).trim(); // 按指定格式打印 println("REV " + revValue + " W"); println("FWD " + fwdValue + " W"); // 清空缓冲区,准备接收下一组数据 dataBuffer = ""; } }
关键注意事项
- 确保Arduino和Processing的串口波特率完全一致(默认都是9600,若修改Arduino波特率,Processing需同步调整)
- 不确定串口端口时,可在Processing的
setup()中添加println(Serial.list());,打印所有可用串口后选择对应端口。
内容的提问来源于stack exchange,提问作者Aparna B




