請(qǐng)教print和uart1_recvstring不能同時(shí)用得問題

?len = UART1_RecvString(RxBuff);

? ? ? ? if(len)

? ? ? ? {

? ? ? ? ? ?PRINT("RECV_OK");

? ? ? ? ? ? UART1_SendString(RxBuff, len);

? ? ? ? }

這個(gè)代碼 下載后,可以每次都轉(zhuǎn)發(fā)收到得數(shù)據(jù),但是print不會(huì)執(zhí)行輸出,并且在反復(fù)轉(zhuǎn)發(fā)十幾遍后會(huì)連續(xù)打印出來幾十個(gè)print得字符串就是“recv_ok”,請(qǐng)問是不是庫(kù)函數(shù)得問題,要如何解決

使用默認(rèn)的工程配置,需要在PRINT字符串后面加一個(gè)‘\n’才顯示,比如這樣寫PRINT("RECV_OK\n");

也可以不用加這個(gè)'\n',見下方博客中的勾選配置。

關(guān)于MounRiver編譯器配置的若干問題 - JayWell - 博客園 (cnblogs.com)


非常感謝工程師恢復(fù),以上問題解決了,又有一個(gè)新問題,麻煩工程師抽時(shí)間幫忙看一下,

還是這段代碼,我往單片機(jī)發(fā)送ABCD

? ? ? ? if(len)

? ? ? ? {

? ? ? ? ? ? PRINT("recv-ok");

? ? ? ? ? ? UART1_SendString(RxBuff, len);

? ? ? ? }

打印出來的信息是這樣的

recv-okA

recv_okBCD

打印出來了兩行,而且把收到的字符串給拆分了,請(qǐng)問這個(gè)是哪里操作的不對(duì),謝謝


您好,R8_UART1_RFC在收到第一個(gè)字節(jié)數(shù)據(jù)的時(shí)已經(jīng)置為了1,在沒有占用串口PRINT的情況下,在下一個(gè)字節(jié)收到之前就已經(jīng)處理完了這1個(gè)字節(jié)數(shù)據(jù),等待下個(gè)字節(jié),也就是說會(huì)逐個(gè)字節(jié)處理。PRINT打印“recv-ok”需要一段時(shí)間,這段時(shí)間剛好夠接收接下來的3個(gè)字節(jié),故出現(xiàn)以上現(xiàn)象。

建議使用串口中斷,F(xiàn)IFO設(shè)置字節(jié)觸發(fā)可以避免逐個(gè)字節(jié)處理。非要用查詢的話也可以自行添加邏輯,比如說R8_UART1_RFC小于n時(shí)就不接收BRB中的數(shù)據(jù),若一直小于n超過自定義時(shí)長(zhǎng)后,就判斷為超時(shí),全部接收。


感謝工程師回復(fù),以上問題已經(jīng)明白了,現(xiàn)在又遇到一個(gè)問題要麻煩工程師,

? len = UART1_RecvString(RxBuff);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(len)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? endp = ThisUsb2Dev.GpVar[2]; // send端點(diǎn)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PRINT(" ---len= %02x\n",len);

用這個(gè)函數(shù)去讀取串口接收得數(shù)據(jù),只能收8個(gè)字節(jié),8個(gè)以下正常,超過8個(gè)就只顯示8個(gè),長(zhǎng)度也是8個(gè),如果強(qiáng)制給len+1,多打印出來得那個(gè)字節(jié)就是00,不是正常發(fā)送的數(shù)據(jù)。

uint16_t UART1_RecvString(uint8_t *buf)

{

? ? uint16_t len = 0;


? ? while(R8_UART1_RFC)

? ? {? ? PRINT(" -len- %02x\n",len);

? ? ? ? *buf++ = R8_UART1_RBR;

? ? ? ? len++;

? ? }


? ? return (len);

}

我在庫(kù)函數(shù)里面加了一個(gè)print,打印出來也是0到7,只要發(fā)送超過8個(gè)字節(jié)就只能收到8個(gè),麻煩工程師不忙的時(shí)候給指點(diǎn)以下,是哪里沒弄明白,感謝感謝


您好,串口接收fifo最多緩存8個(gè)字節(jié)的數(shù)據(jù),調(diào)用一次UART1_RecvString也就只能接收緩存中的數(shù)據(jù),超過不了8個(gè)。接收更多的數(shù)據(jù)需要多次調(diào)用UART1_RecvString,如果沒有及時(shí)接收數(shù)據(jù),會(huì)出現(xiàn)丟包問題。


謝謝謝謝,明白了,原來是這個(gè)問題,請(qǐng)問老師,我要使用藍(lán)牙,是不是就沒辦法使用串口中斷了?麻煩請(qǐng)老師您給個(gè)思路,要怎么做才能避免丟包,感謝感謝


使用藍(lán)牙功能,可以繼續(xù)使用串口中斷進(jìn)行收發(fā)數(shù)據(jù)。但是如果開啟睡眠功能會(huì)遇到一個(gè)問題:睡眠只有通過GPIO或者TMOS的任務(wù)進(jìn)行喚醒,此時(shí)如果串口來數(shù)據(jù),藍(lán)牙正在睡眠會(huì)出現(xiàn)收不到數(shù)據(jù)的情況。因此在進(jìn)行串口接收數(shù)據(jù)時(shí)一定要先將串口的功能切換為通用GPIO作為喚醒。

具體操作:串口在數(shù)據(jù)到來時(shí)會(huì)出現(xiàn)高電平到低電平的信號(hào),利用這個(gè)下降沿或者低電平信號(hào)作為GPIO的喚醒源,在信號(hào)到來時(shí)芯片被喚醒進(jìn)入到中斷接收數(shù)據(jù)。此時(shí)需要在中斷中置一個(gè)標(biāo)志,這個(gè)標(biāo)志是為了等待串口的數(shù)據(jù)接收完成,在數(shù)據(jù)接收未完成的情況下,藍(lán)牙由于協(xié)議棧管理會(huì)自動(dòng)進(jìn)入睡眠,這時(shí)需要根據(jù)這個(gè)標(biāo)志手動(dòng)的去退出睡眠(return)。等待數(shù)據(jù)接收完成后再將標(biāo)志置位重新恢復(fù)睡眠功能。

可以參考一下這篇博客:

CH579 CH573 CH582 串口切換GPIO睡眠喚醒操作 - debugdabiaoge - 博客園 (cnblogs.com)


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频