我想知道是否有可能在不阻塞主程序的情况下处理Arduino uno上的Serial.println()。
基本上,我使用arduino为400 V电容器充电,主程序是打开和关闭MOSFET晶体管上的栅极,时间分别为15微秒和20微秒。我也有一个分压器连接到电容器上,我用它来测量电容器上的电压,当它用Arduino充电时。我使用analogRead()获取引脚上的原始值,将该值乘以所需的比率,并尝试在每个周期结束时将该值打印到串行控制台。但问题是,为了使电容器快速充电,延迟必须非常小(在微秒范围内),而串行打印命令执行的时间要比执行长得多,因此无法执行整个程序。
因此,我的问题是,在不阻塞主周期的情况下,在类似于不同的“线程”的情况下,如何才能让命令执行。8位AVR能做这样的事情吗?
谢谢
发布于 2014-01-04 16:18:35
发布于 2014-01-05 00:32:39
基本的Arduino串行打印函数都是阻塞的,它们观察TX就绪标志,然后加载下一个字节进行传输。这意味着,如果您发送"Hello“打印功能将阻塞,只要它需要加载UART发送10个字符,以您选定的波特率。
处理这一问题的一种方法是使用高波特率,这样你就不会等待太久。
更好的方法是使用中断驱动的传输。这样,当UART可以接受字符时,要发送的数据字符串就会与发送的每个字符一起缓冲。发送数据的调用只加载TX缓冲区,将第一个字符加载到UART以启动进程,然后返回。
如果您填充TX缓冲区,此缓冲区方法仍将被阻塞。send方法必须等待将更多的数据加载到缓冲区中。一个好的串行库可能为您提供一种检查缓冲区状态的简单方法,这样您就可以实现自己的额外缓冲。
这里有一个声称是中断驱动的库。我自己也没用过。如果对你有用的话请告诉我们。https://code.google.com/p/arduino-buffered-serial/
发布于 2020-04-10 18:59:18
我发现这篇文章:串行输出现在是中断驱动的。Serial.print()只是将数据填充到缓冲区中。必须发生中断,才能真正将数据移出。发布日期:2012年11月11日。我发现这是正确的,但如果您试图打印更多,那么内部串行缓冲区将保持它将锁定,直到缓冲区至少部分清空。
https://stackoverflow.com/questions/20923180
复制相似问题