Anred 发表于 2024-12-27 15:06:23

关于串口进有限状态机不掉电烧录的问题(已解决,解决方式:删除所有Delay_ms();)

如题,使用串口对有限状态机对settime的命令执行正常,但对UPDATE解读有问题,极少数情况下,才会烧录进去,多数是不响应的

DebugLab 发表于 2024-12-27 16:16:32

看您的变量命名疑似使用了我的串口收发程序
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
任何逻辑错误都会导致各种奇怪的异常,超时判断、错误处理、状态机重置、指针、缓冲区溢出,这些都是需要注意的
libc任何对于字符串的处理函数遇0x00都会退出,不能处理'\0'
ISP软件有RTC对时功能

建议使用AI单片机内置的RTC


以下是通过ISP软件的RTC对时功能串口对时程序(命令头FF 0B)


VCC 发表于 2024-12-27 16:18:15

你的这个代码存在很大问题。

虽然你称其为“状态机”,但是它并没有储存有意义的状态

状态只有两个:
- 上一个字节是\n
- 上一个字节不是\n

而且存在内存溢出的致命缺陷。
假如串口收到了足够长的不含\n的字节流,将会导致你的R_Buf缓冲区数组溢出。


-----------------------

出于好奇,测试了一下STC-ISP软件的自定义下载命令是否支持转义字符



是支持的。


-----------------------



strncmp用于匹配n个字符是否相当,如果相等,返回值是0。
而你在代码中的判断是 if(!strncmp(str1,str2,num)),即字符串的前num个字符完全相同时,才会满足条件

那么会是什么原因呢?
建议详细调试哦~

或者把最简工程发出来让坛友们帮忙调试

Anred 发表于 2024-12-27 16:26:28

VCC 发表于 2024-12-27 16:18
你的这个代码存在很大问题。

虽然你称其为“状态机”,但是它并没有储存有意义的状态


目前是只作为一个命令控制,一般超不了自己设置的64字节,但就是普通的控制能执行,复位的0x60不能执行,好奇怪,

Anred 发表于 2024-12-27 16:28:51

VCC 发表于 2024-12-27 16:18
你的这个代码存在很大问题。

虽然你称其为“状态机”,但是它并没有储存有意义的状态


调试的结果就是,UPDATE\r\n不能执行复位烧录,极少情况下能成功,settime:一直可以

VCC 发表于 2024-12-27 16:33:58

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',就无法成功匹配了

Anred 发表于 2024-12-27 16:35:24

这个目前跑了一段时间了,settime:的命令依旧可以使用,但烧录仍监测不到,如果我把IAP_CONTR=0x60;的判断加到中断中,两个都不影响,都能正确执行,但我的leader更希望我放到后续写状态机中,中断只负责接收,所以,我有点满头包不晓得怎么处理这个情况

Anred 发表于 2024-12-27 16:37:14

VCC 发表于 2024-12-27 16:33
又发现了一个问题




好的,我打印检查一下

Anred 发表于 2024-12-27 16:42:58

VCC 发表于 2024-12-27 16:33
又发现了一个问题




settime可以正确返回,UPDATE无返回

Anred 发表于 2024-12-27 16:47:50

DebugLab 发表于 2024-12-27 16:16
看您的变量命名疑似使用了我的串口收发程序
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
...

额,目前用是stc8a8k64d4,支持如上功能吗

页: [1] 2 3
查看完整版本: 关于串口进有限状态机不掉电烧录的问题(已解决,解决方式:删除所有Delay_ms();)