关于串口进有限状态机不掉电烧录的问题(已解决,解决方式:删除所有Delay_ms();)
如题,使用串口对有限状态机对settime的命令执行正常,但对UPDATE解读有问题,极少数情况下,才会烧录进去,多数是不响应的看您的变量命名疑似使用了我的串口收发程序
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
任何逻辑错误都会导致各种奇怪的异常,超时判断、错误处理、状态机重置、指针、缓冲区溢出,这些都是需要注意的
libc任何对于字符串的处理函数遇0x00都会退出,不能处理'\0'
ISP软件有RTC对时功能
建议使用AI单片机内置的RTC
以下是通过ISP软件的RTC对时功能串口对时程序(命令头FF 0B)
你的这个代码存在很大问题。
虽然你称其为“状态机”,但是它并没有储存有意义的状态
状态只有两个:
- 上一个字节是\n
- 上一个字节不是\n
而且存在内存溢出的致命缺陷。
假如串口收到了足够长的不含\n的字节流,将会导致你的R_Buf缓冲区数组溢出。
-----------------------
出于好奇,测试了一下STC-ISP软件的自定义下载命令是否支持转义字符
是支持的。
-----------------------
strncmp用于匹配n个字符是否相当,如果相等,返回值是0。
而你在代码中的判断是 if(!strncmp(str1,str2,num)),即字符串的前num个字符完全相同时,才会满足条件
那么会是什么原因呢?
建议详细调试哦~
或者把最简工程发出来让坛友们帮忙调试
VCC 发表于 2024-12-27 16:18
你的这个代码存在很大问题。
虽然你称其为“状态机”,但是它并没有储存有意义的状态
目前是只作为一个命令控制,一般超不了自己设置的64字节,但就是普通的控制能执行,复位的0x60不能执行,好奇怪, VCC 发表于 2024-12-27 16:18
你的这个代码存在很大问题。
虽然你称其为“状态机”,但是它并没有储存有意义的状态
调试的结果就是,UPDATE\r\n不能执行复位烧录,极少情况下能成功,settime:一直可以 Anred 发表于 2024-12-27 16:26
目前是只作为一个命令控制,一般超不了自己设置的64字节,但就是普通的控制能执行,复位的0x60不能执行, ...
又发现了一个问题
你在第147行判断,上一个值是\n时,就把上上个值修改为\0
例如收到UPDATE\r\n后
将其修改为UPDATE\0\n
虽然看起来没什么用,但是确实也没什么副作用。
我建议可以尝试调试一下,将R_Buf里的数据通过串口打印出来。
检查一下它在收到STC-ISP发送的UPDATE\r\n的时候,是否确实正确无误地收到了,开头一定不能有多余的字节,否则首字节不是'U',就无法成功匹配了
这个目前跑了一段时间了,settime:的命令依旧可以使用,但烧录仍监测不到,如果我把IAP_CONTR=0x60;的判断加到中断中,两个都不影响,都能正确执行,但我的leader更希望我放到后续写状态机中,中断只负责接收,所以,我有点满头包不晓得怎么处理这个情况
VCC 发表于 2024-12-27 16:33
又发现了一个问题
好的,我打印检查一下 VCC 发表于 2024-12-27 16:33
又发现了一个问题
settime可以正确返回,UPDATE无返回
DebugLab 发表于 2024-12-27 16:16
看您的变量命名疑似使用了我的串口收发程序
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
...
额,目前用是stc8a8k64d4,支持如上功能吗