【问题标题】:Bad data received from Arduino serial while reading from analog port从模拟端口读取时从 Arduino 串行接收到错误数据
【发布时间】:2013-04-06 07:02:22
【问题描述】:

也许这只是一派胡言,但它让我发疯了。我正在尝试读取 Arduino 中的一个模拟端口,并使用 node.js 通过串行端口将值发送到 JavaScript。当我在 Arduino 控制台中显示数据时,一切正常,但是当我在 Mac 中使用终端时,一些值出现在两行中。

460
460
4
60
460

我使用的代码是:

阿杜诺:

const int analogInPin = A0;
int sensorValue = 0;

void setup() {
  Serial.begin(500000);
}

void loop() {
  sensorValue = analogRead(analogInPin);
  Serial.print(sensorValue);
  delay(200);
}

节点:

var com = require('serialport').SerialPort;

var opts = {baudrate: 500000};

var serialPort = new com('/dev/tty.usbmodem641', opts);

serialPort.on('data', function(data) {
  console.log(data.toString());
});

代码再简单不过了,但仍然不能正常工作。我知道我错过了一些东西,但我看不到它。我测试了不同的波特率,但没有任何效果。你能帮帮我吗?

提前致谢

【问题讨论】:

  • 500000 看起来像一个不寻常的波特率值,预计更容易受到噪声的影响。您是否尝试过像115200 这样更“标准”的波特率?
  • 是的,我尝试过使用其他波特率,但还是一样。当我尝试从 ADC 读取一个数字(例如 525)时,有时它会在计算机通过串行端口读取时分成 5 和 25。例如 1021 (1 - 021, 10 - 21) 也会发生这种情况。

标签: javascript node.js arduino analog-digital-converter node-serialport


【解决方案1】:

我想Elias Benevedes 可能试图在他们的回答中提出这一点:现在你的 Arduino 数据根本没有分隔。假设您的sensorValue 始终读取为1。在这种情况下,Arduino 的输出将是

11111111111111111111111111111111111111111111111111111111111....

等等;因为您打印的整数值没有任何分隔符。因此,将其解析为不同数字的方式与数据到达的时间有关。继续上面的示例,有时您的值被读取为1,有时为11,有时为111 等等,这取决于读取和写入的时间。

开始修复它的方法是在传感器读数输出之间插入一些非数字数据。一个(同样,这可能是Elias Benevedes 的想法)是在每个打印的数字之间插入换行符

 Serial.println(sensorValue);

另一种方法是在数据之间添加空格

 Serial.print(sensorValue);
 Serial.print(" ");

任何一种解决方案都会将您的数字读数彼此分开,这正是您想要的。

【讨论】:

  • 我现在正在尝试。使用分隔符而不是信任从计算机读取时间。
  • 好吧,它有效!我喜欢 JavaScript :) 我在 Arduino 的代码中使用了Serial.println(),并且在打开串行端口时我在 JavaScript 的代码中使用了解析器:var serialPort = new SerialPort('/dev/tty.usbmodem641', {baudrate: 115200, parser: serialport.parsers.readline("\n")});。我降低了一点波特率,但它对每个人都非常有效。我什至以 2kHz (500us) 从 ADC 读取数据:)
  • 感谢大家的帮助:)
【解决方案2】:

我也遇到过这种情况。 Serial.print() 将数据发送到 arduino。 Serial.println() 会将信息从 arduino 发送到计算机串行留言板(或任何您想调用的名称。

【讨论】:

  • Mmmm.. Serial.print() 和 Serial.println()` 之间的唯一区别是添加到末尾的行终止符。
  • 我上次尝试修复时,它奏效了。对不起,如果我提供了不好的信息。顺便说一句,这个 Q 应该转移到电子产品中......
  • 转向电子产品:也许吧?这里有许多 Arduino 问题。 Serial.print()Serial.println()的方向是一样的:都是在Arduino的串口上输出数据。也许您试图建议 OP 对所有内容都使用 Serial.println()
  • Arduino 工作正常。这个问题与Arduino没有直接关系。问题出在计算机端,因为当我读取数据流时,我相信时间而不是界定我从 Arduino 发送的数据(正如 angelatlarge 上面所指出的那样)。 print和println的区别就是我想的输出流:print() -> 121212121212println() -> 12\n12\n12\n12\n12\n12\n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多