Anred 发表于 2024-12-30 08:55:07

ahong 发表于 2024-12-27 19:04
P40=1后要加延时,不然复位了,看不到指示动作

我中间测试的时候是加了的,能够看到指示动作

_奶咖君_ 发表于 2024-12-30 09:02:47

Anred 发表于 2024-12-30 08:54
好的

结果如何?

Anred 发表于 2024-12-30 10:07:38

_奶咖君_ 发表于 2024-12-30 09:02
结果如何?

并不能进入复位,然后如果删除复位的那条,则可以进入灯的状态显示

Anred 发表于 2024-12-30 10:26:29

_奶咖君_ 发表于 2024-12-27 19:44
咱就说,,能不能把你的while循环里的delay_ms 干掉啊

大佬,可以了,干掉所有的delay_ms后,能启动了

_奶咖君_ 发表于 2024-12-30 11:11:57

<p>那么问题应该是这样的,,在你的串口中断中,判断了一包的数据结尾,并清除了计数值 RF,将标志位置1,并在主函数中处理接收的数据包。。虽然写的不算太好,但是就目前的这些功能上来说也是能用的,从你测试修改RTC时间的功能上就能看的出来。</p>
<p>由于你再没有处理当前数据包的时候就清除了RF,,那么在你主函数运行到数据包处理的代码之前,如果串口再次接收到其他的数据,那么你下面处理数据包的代码(你所谓的有限状态机部分)就会判断失效。</p>
<p>那么为什么 修改RTC时间的 就能正确执行呢?原因是,在你串口发送完数据之后,理论上你是不会发送其他的串口数据的,这个时候等到主函数去处理时,就能正确的执行功能。</p>
<p>那么为什么 不停电烧录功能 就极少数可以,大多数不行呢?原因是,你发送命令的这个行为,对于单片机来说可以看作是一个随机事件,如果当程序正好运行到 你的有限状态机 这里,正好串口接收完一包命令,随后立马执行 状态机程序,那么就可以触发不断电下载。。。但是,如果当前的程序运行在 延时函数中(实际上你单片机绝大部分时间都在运行你的延时函数),串口接收了 不断电下载的命令,但是ISP软件很快就会接着发送7F通讯命令。显而易见的是还没有轮到你主函数处理串口数据,,这一包的数据就被破坏了。这样就是失败的情况。</p>
<p><img src="data/attachment/forum/202412/30/110556x3103kkz0u7k06x7.png" alt="image.png" title="image.png" /></p>
<p>那么如何解决呢?请广大坛友们群策群力了<img alt="wunai" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/wunai.gif" title="wunai" /></p>

Anred 发表于 2024-12-30 11:46:13

_奶咖君_ 发表于 2024-12-30 11:11
那么问题应该是这样的,,在你的串口中断中,判断了一包的数据结尾,并清除了计数值 RF,将标志位置1,并在 ...

好强的分析流,大佬真棒,叩谢大佬

Anred 发表于 2024-12-30 11:51:38

_奶咖君_ 发表于 2024-12-30 11:11
那么问题应该是这样的,,在你的串口中断中,判断了一包的数据结尾,并清除了计数值 RF,将标志位置1,并在 ...

串口中断中,判断了一包的数据结尾,并清除了计数值 RF,将标志位置1,并在主函数中处理接收的数据包。。虽然写的不算太好,但是就目前的这些功能上来说也是能用的,从你测试修改RTC时间的功能上就能看的出来。

我还想问一下大佬,这个地方中断怎么写是比较高效靠谱的呢
页: 1 2 [3]
查看完整版本: 关于串口进有限状态机不掉电烧录的问题(已解决,解决方式:删除所有Delay_ms();)