我为无线交流调光器制作了一个pcb,它基于ATMega328p(Arduino Uno),433 MHZ UART模块用于无线通信,TRIAC用于交流负载调光,MOC3020用于零交叉检测arduino中断。简而言之,我有一个发送器向调光器发送命令,命令是两个字节;第一个字节是ID,第二个字节是调光级别,分为5级:0%,25%,50%,75%,100%。我已将其编程为在每个级别之间花费约2秒钟。串行通信波特率为9600 bps。我的问题是,当我在调光时发送命令时,串行通信完全丢失。问题是串口在发生中断时无法读取数据。我想在读取数据之前分离中断并在完成时重新连接它但它没有工作。我也试图读取ISR内部的串行数据,但它也没有工作。我想到的最后一件事是改变波特率,但我还没有尝试过。
任何解决此问题的建议。
由于
答案 0 :(得分:0)
我认为你是用Arduino的处理语言来做这个,这是单线程的,所以我怀疑它不会达到执行点,它注意到IRQ,直到它返回到主循环。
针对此类问题建议使用Here protothreads。我也听说过在Arduino上运行Golang代码,这听起来有助于执行,但是你必须为收音机移植/找到所有的libs。虽然我看起来并不太远。
否则你会想要一个不阻塞的函数,你可以通过循环每次调用来更新调光器的状态(如绘制函数)。这里的想法是当它注意到IRQ时你改变目标状态,并且"绘制"函数只是向目标状态迈出一步,然后将执行返回到主循环...在那里你可以再次注意到IRQ来设置不同的目标状态。