stm32的代碼復雜些,而且某寶賣家給的代碼寫得有點亂而且注釋有問題啊。。
吐槽完畢,還是要腦子清醒思路清晰才能高效完成工作發現問題分析問題解決問題
總結下睡覺。
1.地址、接收通道、通信頻道什么的,反正收發模式設置要相同
2.數據寬度、地址寬度
3.關鍵一點:數值和字符!
ASCII碼表在線查詢(1.0 beta 1)
由於stm32上的與24l01有關的代碼現在還是用的某寶賣家的,還沒完全吃透。就這么說吧,其中的函數的參數是數字(不知道是不是這樣表達的即表里的代碼,另外c語言的變量不允許數字開頭),而我發送的數據是字符串,發現問題花了一會兒,想辦法解決又花了好一會兒。兩邊代碼都不好改,參數如果是數組(指針)那真是傳來傳去如果要改都不知道改哪了,stm32的代碼更是,想想其他的解決辦法吧。
一個解決方法:step1.數值,字符嘛,查ascⅡ碼表唄
step2.見下面的4,用 if ,只把數組的第一個元素拿出來,轉換成數字或者把數字變回去。
4.再來一個關鍵一點24l01發數據的時候不知道為什么,在把數據寬度設定為8字節后,接收方還是收到32字節的數據,而且前8位后那些會混雜好多數據。當傳輸數據為字符串數組時,如果只有一組數據,那后面的會混雜亂碼,只要傳輸過程不丟幀什么的,每一次的亂碼都一樣;如果有多組數組,則會包含這一數組和下一數組的數據,也是每一次都一樣。這是用串口看到的,即收到數據后存入rx_buf[],然后通過串口在電腦上顯示。顯示的應該就是收到的數據。
一個解決方法是用 if 來個判斷,
if(!strcmp(RX_Buffer,"Forward ")) { ES = 0; for(i=0;i<8;i++) { SBUF = RX_Buffer[i]; RX_Buffer[i]=0; while(!TI); TI = 0; } ES = 1; }
因為前面8字節在不丟幀的情況下是正確的,那就在 if 里面用 strcmp 比較一下,如果和預期的相同再進行下一步處理。這樣就能控制在串口助手上顯示8字節的數據,也就可以作為舍棄多余數據的條件。
另外當把數據寬度調整到32字節時,串口助手就能一次收到252字節的數據(可能是丟包了,看着應該像256=32*8 字節)。
這個問題先撂下了,如果有朋友知道請多指教:)
就到這吧,感覺有點亂。。以后再整理吧,這里只做個備忘。
現在只是驗證性的完成了,即51和stm32之間能通過24l01通信了(控制點亮led),還要做好多事情呢。只是這么簡單的整理完又花了不下40分鍾,表達能力捉急。。睡覺
附:
nrf24l01發送數據的步驟:
0.CE清0,進入待機狀態
1.寫本機身份地址到TX_ADDR
2.寫0通道接收地址到RX_ADDR_P0(與TX_ADDR一樣)
3.設置自動應答允許,EN_AA
4.設置0通道允許接收,EN_RXADDR
5.配置自動重發次數SETUP_RETR
6.選擇通信頻道RF_CH
7.配置發射參數(如發射功率,數據傳輸速率)RF_SETUP
8.設置0通道有效數據寬度RX_PW_P0(就是要傳送數據包的長度)
9.設置模塊配置寄存器CONFIG到發送模式
10.將要傳送的數據寫入發送緩沖寄存器TX_FIFO
11.將CE置1,進入發送狀態,CE高電平至少維持10us
設置接收數據的步驟:
0.CE=0,進入待機狀態
1.寫發送機身份地址到0
2.設置自動應答允許EN_AA
3.設置允許0通道接收數據EN_RXADDR
4.選擇通信頻道RF_CH
5.選擇0通道有效數據寬度RX_PW_P0
6.配置發射參數(發射功率、傳輸速率等)RF_SETUP
7.設置模塊的配置寄存器CONFIG在接收模式
9.CE=1,進入接收狀態,高電平至少維持10us