Arduino - 在后台使用串行打印

时间:2014-01-04 15:57:48

标签: multithreading serial-port arduino

我想知道是否可以以某种方式在Arduino uno上处理Serial.println()而不用占用主程序。

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

因此,我的问题是,在不占用主循环的情况下,以某种方式可以使命令在不同的“线程”上执行。 8位AVR能够做到这样吗?

由于

3 个答案:

答案 0 :(得分:2)

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

有关详细信息,您还可以访问此问题:Does Arduino support threading?

答案 1 :(得分:1)

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

解决这个问题的一种方法是使用高波特率,这样您就不会等待很长时间。

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

如果填充TX缓冲区,此缓冲区方法仍会阻止。 send方法必须等待加载到缓冲区中。一个好的串行库可能会让您轻松检查缓冲区状态,以便您可以实现自己的额外缓冲。

这是一个声称是中断驱动的库。我自己没用过它。如果它适合您,请告诉我们。 https://code.google.com/p/arduino-buffered-serial/

答案 2 :(得分:0)

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