Processing如何解析Arduino串口输出的两个不同距离值?
问题解决
一、拆分Arduino发送的两个距离数值
你的Arduino当前发送的格式是R[数值]CM\nL[数值]CM\n(例如R25CM\nL18CM\n),Processing可以通过字符串解析提取这两个数值,具体方案如下:
修改后的Processing代码
if(comPort.available() > 0){ String pulse = comPort.readStringUntil('\n'); // 按换行读取完整行,避免拿到不完整数据 if(pulse != null){ // 提取右侧距离(R开头,CM结尾) if(pulse.startsWith("R")){ int rIndex = pulse.indexOf("CM"); if(rIndex != -1){ String rightStr = pulse.substring(1, rIndex); distanceRight = Integer.parseInt(rightStr); } } // 提取左侧距离(L开头,CM结尾) else if(pulse.startsWith("L")){ int lIndex = pulse.indexOf("CM"); if(lIndex != -1){ String leftStr = pulse.substring(1, lIndex); distanceLeft = Integer.parseInt(leftStr); } } // 用解析后的数值执行逻辑(注意原代码中val、X2需对应初始化) int val = distanceRight; // 示例用右侧距离,可按需调整 int X2 = 0; // 初始化X2,根据你的场景修改初始值 if(val >= 30){ X2 -= 20; } else if(val >= 15 && val <= 30){ X2 -= 10; } else if(val >= 5 && val <= 15){ X2 += 10; } else if(val <= 5){ X2 += 20; } } }
关键说明
- 用
readStringUntil('\n')替代readString(),确保每次读取完整的一行数据,避免因串口数据分段导致解析失败。 - 通过
startsWith()判断数据归属,用indexOf("CM")定位数值边界,最后截取字符串并转换为整数。
你也可以优化Arduino的发送格式,简化解析逻辑:
// 修改Arduino串口发送部分 Serial.print(distanceRight); Serial.print(","); Serial.println(distanceLeft);
对应的Processing解析代码:
if(comPort.available() > 0){ String line = comPort.readStringUntil('\n'); if(line != null){ String[] values = split(line, ","); if(values.length == 2){ distanceRight = Integer.parseInt(values[0]); distanceLeft = Integer.parseInt(values[1]); } } }
二、Arduino是否支持文件指针操作?
这取决于使用的存储介质:
- SD卡模块:使用官方
SD库创建File对象后,可调用seek()移动文件指针,用position()获取当前指针位置,完全支持传统文件指针操作逻辑。 - 内置EEPROM:没有传统文件指针,但可通过指定内存地址直接读写,
address参数相当于手动控制的指针位置,例如EEPROM.read(address)、EEPROM.write(address, value)。 - Flash存储:程序所在的Flash区域,仅支持按地址读取常量数据,无文件指针,但可通过地址定位访问。
内容的提问来源于stack exchange,提问作者HunterM
相关产品推荐
相关产品推荐

