Java 处理bufferUntil()方法仅适用于'\n';
TL、DR:BufferTill()和ReadStringTill()在设置为“\n”时工作正常,但会给其他字符带来问题 向pc发送数据的代码如下:Java 处理bufferUntil()方法仅适用于'\n';,java,arduino,serial-port,processing,Java,Arduino,Serial Port,Processing,TL、DR:BufferTill()和ReadStringTill()在设置为“\n”时工作正常,但会给其他字符带来问题 向pc发送数据的代码如下: Serial.print(rollF); Serial.print("/"); Serial.println(pitchF); 加工的相关零件为: myPort = new Serial(this, "COM3", 9600); // starts the serial communication myPort.bufferUntil(
Serial.print(rollF);
Serial.print("/");
Serial.println(pitchF);
加工的相关零件为:
myPort = new Serial(this, "COM3", 9600); // starts the serial communication
myPort.bufferUntil('\n');
void serialEvent (Serial myPort) {
// reads the data from the Serial Port up to the character '\n' and puts it into the String variable "data".
data = myPort.readStringUntil('\n');
// if you got any bytes other than the linefeed:
if (data != null) {
data = trim(data);
// split the string at "/"
String items[] = split(data, '/');
if (items.length > 1) {
//--- Roll,Pitch in degrees
roll = float(items[0]);
pitch = float(items[1]);
}
}
}
来自我输入数据的图片(来自arduino串行监视器):
在这之前,一切都是正常的。没什么特别的。当我将BufferTill()和ReadStringTill()函数的参数更改为“\n”以外的任何参数时,就会出现问题。当然,当我这样做的时候,我也改变了arduino代码中相应的部分。例如,将“\n”替换为“k”时,从arduino串行监视器看到的传入数据如下所示:
45.63/22.3k21.51/77.32k12.63/88.90k
就这样继续下去。但处理无法在每个缓冲区中获取第二个值。当我通过在处理控制台上打印值来检查它时,我得到了第一个值(roll),但是第二个值(pitch)显示为NaN。那么问题是什么呢?是什么原因导致它只在“\n”时工作。我现在无法检查它,但我认为您可能有两个问题 首先,您不需要同时使用
bufferUntil()
和readStringUntil()
第二,也是更重要的一点,这两个函数都将字符作为int
进行读取,因此如果要一直读取到字符k
,则应执行以下操作:
data = myPort.readStringUntil(int('k'));
或者,由于k
是ASCII码107:
data = myPort.readStringUntil(107);
如果你调用C++中的错误类型,java将不会出现任何错误,端口将继续读取直到找到默认的行提要。谢谢你的回答,不过我也在想同样的问题,但是这种方法有两个缺点。1:当直接放置“\n”时,它可以工作,因此它只是一个字符,就像“k”一样。没有必要使用十进制ascii值。他说:我试着写107,但没有成功。正如我所说,我现在无法测试这种东西,我的评论是基于文档的。使用
\n
时“它起作用”这一事实可能与换行符是默认字符有关?您尝试过单独使用每个函数吗?我不知道,但我肯定我也尝试过将107 to作为参数传递给这两个函数。如果您将缓冲区保留到(107)
并替换data=myPort.readStringUntil('\n')代码>带有数据=myPort.readString()代码>。这将使查看事件是否被触发变得更容易。我想您可能想知道,我已经找出了问题所在,所以这里的交易是:BufferTill()或ReadStringTill()正在读取包含感兴趣字符的数据。因此,当我的“k”字符是items[1]数组的一部分时,float()函数无法处理该字符。当我将其更改为items[1]字符串时,它将省略其最后一个字符,现在可以正常工作了。唯一剩下的问题是,为什么“\n”不会对float()产生问题,而“k”会产生问题?
data = myPort.readStringUntil(107);