【问题标题】:Processing bufferUntil() method only works with '\n'处理 bufferUntil() 方法仅适用于 '\n'
【发布时间】:2019-11-25 01:07:14
【问题描述】:

TL,DR : bufferUntil() 和 readStringUntil() 在设置为 '\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 串行监视器):

0.62/-0.52
0.63/-0.52
0.63/-0.52
0.64/-0.53
0.66/-0.53
0.67/-0.53
0.66/-0.54

到这里为止,一切都很好。没什么特别的。当我将 bufferUntil()readStringUntil() 函数的参数更改为“\n”以外的任何参数时,就会出现问题。当然,当我这样做时,我也会更改 arduino 代码中的相应部分。例如,当用 'k' 替换 '\n' 时,从 arduino 串行监视器看到的传入数据看起来像,

45.63/22.3k21.51/77.32k12.63/88.90k

然后就这样继续下去。但是处理无法获得每个缓冲区中的第二个值。当我通过也在处理控制台上打印值来检查它时,我得到了第一个(滚动)的值,但是第二个值(音高)显示为 NaN。那么问题是什么?是什么原因只能在'\n'时起作用。

【问题讨论】:

标签: java arduino serial-port processing


【解决方案1】:

我现在无法检查,但我认为您可能有两个问题。

首先,您不需要同时使用bufferUntil()readStringUntil()

其次,更重要的是,这两个函数都将字符作为int,所以如果你想读到字符k,你应该这样做:

data = myPort.readStringUntil(int('k'));

或者,因为k 是 ASCII 码 107:

data = myPort.readStringUntil(107);

如果你在什么都不做的情况下调用了错误类型的函数,那么端口将继续读取,直到找到默认的换行符。

【讨论】:

  • 感谢您的回答,但是我也在考虑同样的问题,但这种方法有两个缺点。 1:直接输入'\n'时它可以工作,所以它只是一个字符'k'。应该没有必要使用十进制 ascii 值。 2:我试过写107,没用。
  • 正如我所说,我现在无法测试这种东西,我将我的 cmets 放在文档中。当您使用 \n 时“它有效”这一事实可能与换行符是默认字符这一事实有关?您是否尝试过单独使用每个功能?
  • 我不知道,但我很肯定我也尝试过将 107 作为参数传递给这两个函数。
  • 如果保留bufferUntil(107) 并将data = myPort.readStringUntil('\n'); 替换为data = myPort.readString(); 会怎样。这应该可以更容易地查看事件是否被触发
  • 我知道出了什么问题,我想你可能想知道,所以这里的交易:bufferUntil() 或 readStringUntil() 正在读取数据并包括感兴趣的字符。因此,当我的 'k' 字符是 items[1] 数组的一部分时,float() 函数无法处理它。当我将其更改为 items[1] 字符串将省略其最后一个字符时,它现在可以正常工作了。剩下的唯一问题是,为什么 '\n' 对 float() 没有问题,但 'k' 会产生问题?
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多