【问题标题】:Arduino serial sometimes gives random valuesArduino 序列有时会给出随机值
【发布时间】:2013-11-19 18:50:12
【问题描述】:

我正在使用来自 sparkfun 的 MMA7361 加速度计,它连接到我的 arduino uno,然后又连接到我的电脑。

我只是从每个轴 (x,y,z) 读取值,然后使用一系列 Serial.print 和 Serial.write 将它们直接通过串行端口发送到我的电脑。从那里我设置了一个程序来读取和显示信息 myPort.readString();

现在它在 80% 的时间里都能正常工作,而且它给出了正确的结果,但有时我会通过串口发送一些随机值,它会弄乱接收程序,使我无法正确使用信号。

我很确定不是传感器本身发送了干扰信号,因为我尝试保存 10 个不同的读数,然后发送平均值以尽量减少影响,但没有运气。接收 pc 仍然得到 0-200 左右的奇怪值峰值(从我看到的输出)。

我尝试拔出从传感器连接到模拟输入端口的电缆,但奇怪的是它给出了一些随机值而不是预期的 0,我不确定,但对我来说似乎有一些事情要做关于我的问题。

我读过一些下拉电阻,但它只适用于按钮,对吧?

我刚拿到我的 arduino,我正在尝试学习如何使用传感器以及你可以用它们做什么以及会出现什么问题,所以如果有人能帮助我解决这个问题,我将不胜感激 :)

这是一个随机值弄乱输出的例子:

252:236:218

251:202:215
2                        <-- this is where it begins
59:231:245
28
4:144:142                <-- messing up the order of the values
251:19
2:187
246:235
:244
240:190:
238
250:202:2
32
248:243:224

245:227:240

251:228:244

253:223:241

如果你愿意,我也有发送和接收的代码:

Serial.print(analogRead(xpin));
Serial.write(":");
Serial.print(analogRead(ypin));
Serial.write(":");
Serial.println(analogRead(zpin));

我真的希望发送只是一行代码,但我无法将所有数字和字符串连接到 arduino 上的单行字符串。 收货:

if ( myPort.available() > 0) {
  result = myPort.readString();
  println(result);
}

【问题讨论】:

  • 尝试在打印语句之间添加一个小的延迟。可能是几毫秒。延迟(5)例如。您在 PC 上使用什么语言来读取串口?
  • 它确实对 1ms 的延迟有所帮助,但它仍然让那些数字弄乱了列表。我尝试了 5 或 10,但越多越糟糕。
  • 我正在使用处理来接收信息。

标签: random arduino return-value accelerometer sensors


【解决方案1】:

查看您的输出,似乎所有值都已收到,但不知何故将 CR 和/或 LF 字符添加到输出中。这来自 println 语句:

if ( myPort.available() > 0) {
  result = myPort.readString();
println(result);
}

会发生什么情况是接收端得到一些字符(不一定是全部),它打印它们,添加换行符然后退出函数。

然后它再次进入 if 语句并打印缓冲区中的可用字符。就这样。

如果您希望确保输出一致,您必须 1.构建数据包或 2.统计接收到的字节数,全部接收完毕后打印出来。

至于 1. 这将是我的首选方法,为数据添加开始和结束字符。接收端将知道开始字符和结束字符之间的所有数据都是要打印的数据。

【讨论】:

  • 嗯,我明白了。我更愿意一次打印所有内容,但是当我执行模拟读取并尝试将它们放入字符串时,问题就来了。它不会让我这样做,无论是 + 还是 &。我尝试在数据之后和之前放置一个“,”,但我能得到的最好结果是一个空行,其中的数字数量不正确。
  • 问题不在发送端,而在接收端。可以一次打印全部发送,但您必须在读取模拟值时构建一个字符串。但即使你这样做了,也不能保证接收端在打印出来之前会将所有字符都放入缓冲区,所以我上面的回答中提到的 2 个选项仍然是确保单行打印输出的方法。跨度>
  • 好的,但我不确定我会怎么做,因为我每次读取输入时都会重写结果字符串。如果我要在每次读取时添加到字符串中,它可能会包含下一次读取的开始,这将在清除结果时完全删除当前通过的字符串的其余部分。
  • 但是,我确实在某处看到了一些关于 readBytesUntil 或类似的东西,但在我看来,我必须在发送之前将所有内容转换为字节,而且在我看来有点不必要,因为你可以将整个字符串发送为它是。顺便问一下,将整数与字符串组合的运算符是什么?我找不到处理的方法。
【解决方案2】:

我似乎已经通过使用 readChar 并检查当前输入的字符是否是分隔符来解决这个问题。它有点慢,但它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多