Processing中Serial Monitor字符串转int恒返回0问题求助
问题分析与解决
你的问题出在串口读取的字符串包含不可见的空白字符(比如Arduino发送的回车符\r),导致Processing的int()函数无法正确解析纯数字,返回默认值0。
Arduino的Serial.println()会发送\r\n(回车+换行),而readStringUntil('\n')读取到的字符串会包含前面的\r,比如实际是"494\r"而非纯"494",这种带非数字字符的字符串用int()解析就会失败。
修复步骤
- 先判断读取到的字符串是否为
null,避免空指针异常 - 使用
trim()方法去除字符串首尾的所有空白字符(包括\r、\n、空格等) - 再将处理后的纯数字字符串转换为int类型
- 调整
myPort.clear()的位置,避免误删未处理的串口数据
修改后的Processing代码
import processing.serial.*; Serial myPort; String sVal; float w = 1023; float h = 100; void setup() { size(1023, 100); background(255); String portName = Serial.list()[2]; myPort = new Serial(this, portName, 9600); } void draw() { if (myPort.available() > 0 ) { sVal = myPort.readStringUntil('\n'); // 先判断字符串是否有效,再处理 if (sVal != null) { sVal = sVal.trim(); // 去除首尾空白字符 int val = int(sVal); println("i am int " + val); println("i am string " + sVal); line(val, 0, val, h); } myPort.clear(); // 处理完数据再清空缓冲区 } }
额外说明
trim()是关键:它会移除字符串开头和结尾的所有空白字符(包括不可见的控制字符),确保传给int()的是纯数字字符串- 不要在
draw()的全局范围调用myPort.clear(),否则会清空还未处理的串口数据,导致丢包或读取不完整
内容的提问来源于stack exchange,提问作者Lux
相关产品推荐
相关产品推荐

