使用 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
被浏览
358
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

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览