Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理bufferUntil()方法仅适用于'\n';_Java_Arduino_Serial Port_Processing - Fatal编程技术网

Java 处理bufferUntil()方法仅适用于'\n';

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(

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('\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);