使用w801与4G通信,通过串口1给4G芯片发送AT指令,接收到的数据是^boot rom并且死机。

发布于 2025-02-22 14:01:45

主控:w801 4g使用的是移远的EC801
我给4G模块测试单条AT指令是能够正确返回的,但是将我以前用stm32与4G通信的项目移植过来,并且接收数据的代码时按照测试成功的代码写的,下面是测试成功的代码,实现的是:我给4G模块每间隔500tick发送AT+CSQ指令,我用面代码测试4G模块,如果接收到的数据里面有”OK”就将接收到的数据打印出来,这个测试是成功的
image.png
image.png
image.png
成功的返回数据如下
image.png
但是我修改上述代码中接收的部分,修改如下图,这个代码中的rx_flag也是和上面的代码一样在回调函数中置1,两个代码的初始化,以及回调函数都是一模一样的,这个代码实现的是如果接收到的是AT指令所对应的正确的返回,就返回1,否则就返回0,但是我代码每一次运行到这块都会死机,并且打印的结果是:RX_Cmd:^boot rom
代码截图如下
image.png
打印截图如下:其中RDY和OK是应有的返回数据
image.png

最新发现:我用串口助手模拟4G给w801回复数据,我一回复就死机。

最新最新发现:我给这个函数里套上一个死循环又好了,至少能进这个接收函数而不会死机了
image.png

image.png
这是为什么呢

查看更多

关注者
0
被浏览
360
abcd
abcd 认证专家 2025-02-24
我只是个路过的老年人~

感觉挺乱的,串口接收回调里调用sem release后,任务里就可以获取到sem了,但是sem acquire获取成功后返回值是0,你这个if(os_status)只有在超时才会执行,超时了又去读了,那这个sem的意义是什么。

2 个回答
ldldl
ldldl 2025-02-24
这家伙很懒,什么也没写!

我也感觉我写的挺乱的,老师,我这个函数的作用是接收到4G模块对应AT指令的正确的回复就会返回1;按理来说是在这个函数里面不应该一循环发送的,应该是在发送数据后只运行一次,但我按照我对您回复的理解,判断if(os_status == TLS_OS_SUCCESS) 后才对数据进行处理,然后我把这个接收函数里的循环发送给注释掉了,并且我换了个4G模块,排除了4G模块本身的问题,但还是会卡死
image.png
image.png

卡在了第二次接收到数据后
image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览