【问题标题】:Arduino - Use serial print in the backgroundArduino - 在后台使用串行打印
【发布时间】:2014-01-04 15:57:48
【问题描述】:

我想知道是否可以在不暂停主程序的情况下在 Arduino uno 上处理 Serial.println()。

基本上,我使用 arduino 为 400V 电容器充电,主程序分别打开和关闭 MOSFET 晶体管上的栅极 15 微秒和 20 微秒。我还有一个连接到电容器的分压器,当它被 Arduino 充电时,我用它来测量电容器上的电压。我使用analogRead() 来获取引脚上的原始值,将该值乘以所需的比率,并尝试在每个周期结束时将该值打印到串行控制台。但问题是,为了让电容器快速充电,延迟需要非常小(在微秒范围内),并且串行打印命令的执行时间要长得多,因此会阻止整个程序。

因此,我的问题是,是否有可能让命令在不同“线程”之类的东西上执行而不会阻止主循环。 8bit AVR 能做这样的事情吗?

谢谢

【问题讨论】:

    标签: multithreading serial-port arduino


    【解决方案1】:

    Arduino 不支持多线程,但有一些库可以让您做同样的事情:

    更多信息,您也可以访问这个问题:Does Arduino support threading?

    【讨论】:

    • 线程是在嵌入式设备上实现这一点的最糟糕的方法。
    【解决方案2】:

    基本的 Arduino 串行打印功能是阻塞的,它们观察 TX 就绪标志,然后加载下一个字节进行传输。这意味着如果您发送“Hello World”,只要加载 UART 以您选择的波特率发送 10 个字符,打印功能就会阻塞。

    解决此问题的一种方法是使用高波特率,这样您就不会等待太久。

    更好的方法是使用中断驱动传输。这样,当 UART 可以接受字符时,您要发送的数据字符串与发送的每个字符一起缓冲。发送数据的调用只是加载 TX 缓冲区,将第一个字符加载到 UART 以启动该过程然后返回。

    如果您填充 TX 缓冲区,此缓冲方法仍会阻塞。 send 方法必须等待将更多内容加载到缓冲区中。一个好的串行库可能会为您提供一种检查缓冲区状态的简单方法,以便您可以实现自己的额外缓冲。

    这是一个声称是中断驱动的库。我自己没用过。让我们知道它是否适合您。 https://code.google.com/p/arduino-buffered-serial/

    【讨论】:

    • 根据发行说明。从 IDE 版本 1.0.+ 开始,核心库中应该就是这种情况。“串行传输现在是异步的 - 即,对 Serial.print() 等的调用将数据添加到在后台传输的传出缓冲区。 "
    • 我很高兴看到这种变化。所以 Serial.print() 不会阻塞,除非你填满发送缓冲区。
    • 是的,完全正确。所以不要在 serial.print 之后禁用所有中断,或者在上述情况下发送太多。我记得可能有一种方法可以轮询剩余的可用等等。但这超出了这个问题。
    【解决方案3】:

    我发现这篇文章:串行输出现在是中断驱动的。 Serial.print() 只是将数据填充到缓冲区中。必须发生中断才能真正移出该数据。发布时间:2012 年 11 月 11 日。我发现这是真的,但如果您尝试打印更多内容,那么内部串行缓冲区将保持锁定状态,直到缓冲区至少部分清空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2019-07-27
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多