Random Arduino序列有时给出随机值

Random Arduino序列有时给出随机值,random,arduino,return-value,accelerometer,sensors,Random,Arduino,Return Value,Accelerometer,Sensors,我正在使用sparkfun提供的MMA7361加速计,该加速计连接到我的arduino uno,然后再连接到我的电脑 我只是从每个轴(x、y、z)读取值,然后通过串行端口直接将它们发送到我的pc,并执行一系列的serial.print和serial.write操作。从那里我设置了一个程序,用myPort.readString()读取和显示信息 现在,它在80%的时间内工作正常,并给出正确的结果,但有时我会通过串行端口发送一些随机值,这会弄乱接收程序,使我无法正确使用信号 我很确定不是传感器本身发

我正在使用sparkfun提供的MMA7361加速计,该加速计连接到我的arduino uno,然后再连接到我的电脑

我只是从每个轴(x、y、z)读取值,然后通过串行端口直接将它们发送到我的pc,并执行一系列的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
我真的很想只发送一行代码,但我无法将所有的数字和字符串连接到arduino上的一行字符串。 接收:

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

我似乎已经通过使用readChar和检查当前输入的字符是否是分隔符来修复了这个问题。虽然速度稍慢,但仍能正常工作。

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

if ( myPort.available() > 0) {
  result = myPort.readString();
println(result);
}
发生的情况是,接收端获取一些字符(不一定全部),然后打印它们,添加换行符,然后退出函数

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

如果您希望确保一致的输出,您必须 1.构建一个数据包或 2.计算接收到的字节数,并在接收到所有字节时打印它们


至于1。我更喜欢的方法是在数据中添加一个开始字符和结束字符。然后,接收端将知道开始字符和结束字符之间的所有数据都是要打印的数据。

尝试在打印语句之间添加一个小延迟。也许几毫秒。例如,延迟(5)。你在电脑上用什么语言读取串行端口?它确实有一点帮助,延迟1毫秒,但它仍然把那些数字弄乱了列表。我试着用5或10,但越多越糟糕。我用处理来接收信息。嗯,我明白了。我更愿意一次将所有内容打印出来,但当我进行模拟读取并尝试将其放入字符串时,问题就出现了。它不会让我这么做,无论是+还是-。我试着在数据前后加上“,”,但我能得到的最好结果是一个空行,它得到的数字数量不正确。问题不在发送端,而是在接收端。可以在一次打印中发送所有数据,但在读取模拟值时必须生成一个字符串。但是,即使这样做,也不能保证接收端在打印出所有字符之前将所有字符放入缓冲区,因此我在上面的回答中提到的两个选项仍然是确保一行打印输出的方法。好的,但我不确定我将如何做,因为每次读取输入时我都会重写结果字符串。如果我在每次读取时都向字符串中添加,那么它可能会包含下一次读取的开始,这将在清除结果时完全删除当前通过的字符串的其余部分。但是,我确实看到了readBytesUntil或类似的东西,但在我看来,在发送之前,我必须将所有内容转换为字节,这对我来说似乎有点不必要,因为您可以按原样发送整个字符串。顺便问一下,将整数与字符串组合的运算符是什么?我找不到处理的方法。
if ( myPort.available() > 0) {
  result = myPort.readString();
println(result);
}