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
Serial.print在arduino上速度减慢/失败_Arduino_Arduino Uno - Fatal编程技术网

Serial.print在arduino上速度减慢/失败

Serial.print在arduino上速度减慢/失败,arduino,arduino-uno,Arduino,Arduino Uno,我的arduino循环中有以下代码 while( !Serial.available()){//wait for data to start but keep sending the distance distance = analogRead(A0); Serial.print(F("d")); Serial.print(distance); Serial.print(F("|")); Serial.flush(); } 它从距离传感器读取数据,并将值

我的arduino循环中有以下代码

while( !Serial.available()){//wait for data to start but keep sending the distance
    distance = analogRead(A0);
    Serial.print(F("d"));
    Serial.print(distance);
    Serial.print(F("|"));
    Serial.flush();
}
它从距离传感器读取数据,并将值发送到我连接到arduino的x-bee防护罩。问题是:

  • 加载新草图后,我会在第一分钟左右收到10-15k字节的数据
  • 然后它停止发送任何东西
  • 如果我关闭和打开arduino,我可能会再收到几百个字节,但不能保证
  • 除了从我自己的代码中看到这一点之外,我还使用x-ctu的终端进行调试,并看到了同样的问题。(这也是为什么我知道我的代码的其余部分没有被触动,因为没有任何东西被发送-有趣的是,当你手动发送数据时,它被正确地处理了,除了它没有被发送回来,因为它应该是为了调试目的)有人有什么想法吗

    我还尝试在写入之后添加延迟,正如您所看到的,我分散了
    F()
    宏和
    Serial.flush()我能想到的任何地方,基本问题没有变化


    谢谢,有几个问题/意见

  • 是的,我希望它在一个while循环中,传感器测量的速率>>高于其他任何速率
  • Serial.flush()是否确保不会溢出
  • 如果不行的话,我想我将不得不玩不同长度的延迟?有更好的办法吗
  • 为什么不直接拔掉arduino/xbee上的插头“修复”这个问题?也就是说,允许我再多拿几k

  • 无论如何,我将尝试减少测量的数量,看看今晚晚些时候会发生什么

    您可能发送数据太快(每秒数百次),并导致串行缓冲区和/或xbee溢出

    另外,这一行
    而(!Serial.available()){/
    非常奇怪。您知道它将在一个紧密的循环中执行,直到有传入的数据,对吗


    你的项目范围不清楚,所以我不能提出任何建议-除了用
    if
    替换
    while
    看看这是否解决了眼前的问题。

    我在主要问题中添加了几个问题/评论,因为评论太长,添加了一个延迟(100);最后似乎解决了问题(在我不得不去上班之前,我的x-ctu收到了约60k字节的数据)。稍后我会运行一个更长的测试,并确保100%确定。同时,是时候确保我阅读/理解flush命令的工作原理了。@Brad-
    循环
    功能可以每秒运行数百次,比发送数据快得多(与
    while
    相同)。延迟功能可能会有所帮助,但最好通过检查时间来明确控制频率-请参阅Arduino示例“不延迟闪烁”。是的,谢谢,我意识到了。我没有意识到的是,刷新没有自动解决该问题(在读了更多关于它的内容后,我想我知道了)我仍然很困惑,为什么电源循环似乎没有完全重置-显然,它会在数千字节之后失败,但它甚至没有发送几百字节。我想知道数据是否以某种方式在arduino中某处/如何持久化,但这似乎有点疯狂。感谢链接!我可能会实现一些similar,我通过波特率限制检查。从实际的角度来看,为什么要在串行接口上输出格式化数据?串行通信是一个相对昂贵的操作,因此如果速度是一个优先级,您应该最小化该通道上的通信量。我只需发送原始字节并在另一端解释它们。您的意思是什么n通过格式化数据?F()关键字将内容移动到比arduino上的SRAM大的闪存中。这可能不是必需的,我将尝试删除。
    Serial.print()
    传输距离的Ascii表示。
    analogRead
    读取的值介于0和255之间,使它们的长度为一个字符,但是如果执行
    串行打印(255)
    ,您可以传输三个字符:“2”、“5”、“5”,而不是一个ascii值为255的字符,后者更紧凑。模拟读取介于0-1023之间。在我得到它们时发送它们要简单得多,并且我可以在该限制内生存。