題:
nRF24L01管道問題
Alex H
2014-06-15 23:25:51 UTC
view on stackexchange narkive permalink

我正在查看在此處找到的示例代碼。我知道nRF24L01模塊可以使用6條管道,但是我一直在互聯網上搜索地址名稱,卻一無所獲。更具體地說,在第37行上,有關於作者在哪裡獲得0xF0F0F0F0E1LL,0xF0F0F0F0D2LL的參考嗎?

謝謝。

您是否看過無線電IC的數據表?那當然有關於管道地址的更多信息。
在此處檢查RF24 API文檔中的“ openReadingPipe()”是否正確:http://maniacbug.github.io/RF24/classRF24.html#aa7e8523f86f9f8f20c274e0c89a5fd45,其中提到您可以將任何值用於最後一個地址字節。
因此,我瀏覽了文檔,但沒有提及如何選擇管道地址。它只是說他們應該共享前32位。例如0xF0F0F0F0(XX),0x是否計為字節?還是F0F0F0F0這32位重要?另外,只要管道共享這32位,是否不是F0F0F0F0也有關係嗎?最後兩個有效字節(XX)怎麼樣?這些也是任意的嗎?
“ 0x ...”前綴只是用來告訴該值以十六進製表示。這是因為即使它們看起來相同,十進制的99與十六進制的99也有所不同。因此,我們改用0x99。
您使用的代碼僅支持1個管道。 nRF24L01具有2個唯一的管道(0和1)。它還具有4個其他管道(2、3、4和5),您只能在其中設置最低有效字節。其他字節將與第二個管道(1)相同。
感謝您的答复,我想我還是不知道是否有設置最低有效字節的過程。例如上面所列管道中的E1或D2等...
三 答案:
PhillyNJ
2014-07-15 16:38:22 UTC
view on stackexchange narkive permalink

正如大多數人所張貼的那樣,管道的值是任意的,但必須遵循API的規則:

管道1-5應該共享前32位。只有最低有效字節應該是唯一的,例如

在回答您的問題之前,我認為需要對十六進制和十進制值進行解釋。

40位十六進制是以16為底的數字表示。十進制以10為底。因此,您可以將十六進制值轉換為十進制。由於這超出了該問題的範圍,因此您可以搜索如何從一種轉換為另一種。有一些在線轉換器:

十六進製到十進制轉換器

當您將十六進制值轉換為十進制時,您會看到它只是一個數字表示形式。轉換時,您將放置 0x LL 。如前所述, 0x 表示該值是十六進制值,而 LL 表示鍵入Long Long

所以要回答您的問題問題,使用轉換器找到一個十六進制數字,例如: >

  Pipe 1-5應該共享前32位。僅最低有效字節應該是唯一的,例如openReadingPipe(1,0xF0F0F0F0AA); openReadingPipe(2,0xF0F0F0F066);  

添加 0x LL

  0xF0F0F0F0A1LL0xF0F0F0F0F0A2LL0xF0F0F0B0LL4代碼> 

所有方法都可以正常工作。

在我學習時,我不是十六進制專家,所以如果我不正確,請有人糾正我。

最後,nRF24L01數據表指出以下幾點,即地址的選擇並非完全任意:

注:通常僅在噪聲中檢測到電平僅移動一次(即000FFFFFFF)的地址,並且會給出錯誤的檢測結果,這可能會提高包錯誤率。作為前同步碼(高低切換)的延續的地址也提高了分組錯誤率。

您能否也請提一下,這些管道僅指“ 6個數據多接收器”功能(參見Nordic數據表p39-40)。默認情況下,僅啟用數據管道0和1。
@bersch-相關嗎? OP正在詢問如何選擇管道值,例如“作者在哪裡得到0xF0F0F0F0E1LL,0xF0F0F0F0D2LL?”,而不是管道的使用方式。
為了選擇值,您需要知道默認情況下有一個寫入管道和一個讀取管道。在多接收器模式下,有一個寫入和多達5個讀取管道。您僅描述了閱讀管道。到目前為止,我還沒有檢查過,但是我相信,如果選擇共享前32位的讀寫管道,它將失敗。
根據我的測試,只要您的管道0和1在發送器和接收器上相同,這些值是任意的
我懂了。對於我自己,我沒有檢查多接收器功能。我使用每個芯片進行發送和接收。
我在做我的。我將有1個發射器和4個接收器
聽起來很有趣
user3028
2014-07-09 20:55:31 UTC
view on stackexchange narkive permalink

0xF0F0F0F0F0E1LL,0xF0F0F0F0D2LL 是任意值,並定義要與之交談的發送者和接收者的地址。

如果您使用Mirf庫

> Mirf.setRADDR((byte *)“ serv1”);

它們也可以是諸如 serv1 之類的字符串。

RF24 使用

  write_register(RX_ADDR_P0,&value,5); write_register(TX_ADDR,&value,5);  
Faig
2017-12-18 21:49:10 UTC
view on stackexchange narkive permalink

有些事情每個人都會忘記告訴你:

在第一個接收器之後,接收器上的管道應該縮短

  const uint64_t pipe01 = 0xE8E8F0F0A1LL; const uint64_t pipe02 = 0xA2LL; const uint64_t pipe03 = 0xA3LL; const uint64_t pipe04 = 0xA4LL; const uint64_t pipe05 = 0xA5LL; const uint64_t pipe06 = 0xA6LL; radio.openReadingPipe(1,pipe01); radio.openReadingPipe(2,pipe02); radio.openReadingPipe(3,pipe03); radio.openReadingPipe(4,pipe04); radio.openReadingPipe(5,pipe05);  

發射器應為

  const uint64_t pipe01 = 0xE8E8F0F0A1LL; const uint64_t pipe02 = 0xE8E8F0F0A2LL; const uint64_t pipe03 = 0xE8E8F0F0A3LL; const uint64_t pipe04 = 0xE8E8F0F0A4LL; const uint64_t pipe05 = 0xE8E8F0F0A5LL; const uint64_t pipe06 = 0xE8E8F0F0A6L; uint64_t //或pipe02或pipe03或pipe04或pipe05radio.openWritingPipe(setPipeToSend);  

如果您想知道哪個管道消息來了,請使用

  uint8_t一些變量;如果(radio.available(&someVariable)){Serial.print(“管道號”); Serial.printLn(someVariable); }  

管道編號6 也用於接收確認消息。

此外,初始化代碼必須具有 radio.enableDynamicPayloads(); 這個對我來說效果很好:

  radio.begin() ; //radio.setChannel(0x57); //如果雙方的設置都相同radio.setPALevel(RF24_PA_LOW); //“ LOW”是更穩定的模式radio.enableAckPayload(); //對於自動應答radio.openWritingPipe(pipe01); //用於將鏈接管道號發送到管道地址//radio.openReadingPipe(1,pipe01); //我使用pipe01發送radio.openReadingPipe(2,pipe02); radio.openReadingPipe(3,pipe03); radio.openReadingPipe(4,pipe04); radio.openReadingPipe(5,pipe05);
radio.enableDynamicPayloads(); //多管道接收必須具有radio.startListening(); //開始收聽 

祝你好運...

在您的示例中定義了什麼“管道”?
我已經編輯了代碼。您可以使用這些“管道”中的任何一個進行發送,但不要忘記(像我一樣)將其從讀取中排除。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...