You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Arduino发送的串口数据存为缓冲区并在Processing中格式化打印

解决Arduino串口数据在Processing中按指定格式打印的问题

你的核心需求是把Arduino分多行发送的功率数据,在Processing控制台整理成REV [数值] WFWD [数值] 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

火山引擎 最新活动