Arduino-在后台使用串行打印

问题描述 投票:3回答:3

我想知道是否有可能在不按住主程序的情况下在Arduino uno上处理Serial.println()。

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

因此,我的问题是,可以在某种程度上使命令在不同的“线程”之类的东西上执行而又不占用主循环。 8位AVR是否可以执行类似的操作?

谢谢

multithreading serial-port arduino
3个回答
2
投票

Arduino不支持多线程,但是有一些库可让您执行等效操作:

有关更多信息,您也可以访问此问题:Does Arduino support threading?


1
投票

基本的Arduino串行打印功能处于阻塞状态,它们监视TX就绪标志,然后加载下一个字节进行传输。这意味着,如果您发送“ Hello World”,则打印功能将一直处于阻塞状态,直到加载UART以您选择的波特率发送10个字符为止。

解决此问题的一种方法是使用高波特率,因此您不必等待很长时间。

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.