使用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
被浏覽
359
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

撰寫答案

請登錄後再發布答案,點擊登錄

發布
問題

分享
好友

手機
浏覽

掃碼手機浏覽