2016-01-10 4 views
2

Я пытаюсь создать мессенджер, используя чип arduino, NRF24L01 и библиотеку RF24 от TMRH20. Он предназначен для 2-х плат arduino.мессенджер, arduino и NRF24L01

вот проблема с моим посыльным: большую часть времени, приемник не получает сообщение, и когда-нибудь он получит его, но все смешалось, как плохая ошибка кодирования ...

здесь код: http://pastebin.com/TP53VyeH

Чтобы попробовать его, вам необходимо 2 платы arduino, подключенную к 2 различным USB-портам. Для одной из плат вам нужно изменить номер в строке 10.

ps: на моей станции, если я попробую «GettingStarted_HandlingData», все будет работать нормально, поэтому проблема не в моих ардуинах ...

ответ

2

Вы захватываете данные непосредственно в объект String, а не в его буфер.

radio.read(&message, sizeof(message)); 

Это плохо, так как не только класс Строка длиной около 6 байт, вы перезаписаны байты, которые хранят указатель на свой буфер. Поэтому, когда вы читаете String, его указатель теперь находится в каком-то произвольном месте. Вы будете читать все, что есть, и это могут быть другие переменные, регистры и даже контакты GPIO. (на данный момент ваше приложение может быть очень поврежденным).

Вам необходимо использовать буфер символов.

EDIT:

, кажется, что сообщение режутся после 32 символа, а не 50 ... Не знаю, почему. Я попытался заменить 50 на 200, и сообщение по-прежнему сокращается после 32 символов.

Вы должны использовать radio.getPayloadSize(), чтобы обеспечить доставку ваших данных самым большим пакетом. Кроме того, если вам нужно отправить большие объемы данных или хотите отправить более мелкие пакеты, вы можете использовать radio.setPayloadSize(). Тем не менее, существует максимум байт.

radio.startListening(); 
char buffer[ radio.getPayloadSize() ]; //Note: an array like this is a GCC extension, not standard C++ 

if(radio.available()) {  
    radio.read(&buffer, radio.getPayloadSize()); 
} 

message = buffer; //Not really needed, you can just use the buffer. 

Использование цикла не кажется правильным, то radio.available(), если весь пакет получен. Цикл здесь будет только отбрасывать все, кроме последнего пакета. Вы должны, может быть петля все получить сторону (после radio.startListening();), так что вы можете распечатать/процесс каждый пакет, как они приходят в.


Вы не можете использовать объект String, поскольку он не распознает новые данные (его длина не будет обновляться, если вы используете свой внутренний буфер напрямую). У меня есть a patch I'm trying to get merged в ядро ​​на данный момент, что позволило бы что-то вроде этого:

message.buffer(radio.getPayloadSize()); 
radio.read(message.c_str(), radio.getPayloadSize()); 
message.validate(); //Allow String to detect new contents (Not in the core yet). 

Я однако размещать этот вопрос как еще одна причина, почему это было бы хорошим дополнением.

+0

благодарит вас за предложение, я пробовал ваше решение, но получатель получит пустое сообщение. Я, наконец, получил его, чтобы wotk работал с char вместо String. (см. мое другое сообщение). Я надеюсь, что ваш патч будет объединен;) – n0tis

+0

@ n0tis, обновите или добавьте редактирование до конца своего сообщения. Вы, скорее всего, делаете что-то неправильно. Ваш оригинальный код, как я уже упоминал, не будет работать вообще! –

+0

@ n0tis Массив, который я разместил, является локальным, а не статическим, вы не можете использовать sizeof на нем, если это то, что вы сделали. Вместо этого я использовал 'radio.getPayloadSize()'. –

1

Я, наконец, получил его на работу. Во время передачи я использовал char вместо String, которые решают все выпуски.

Это подразумевает установку максимального предела длины сообщения (я установил 50 символов, что более чем достаточно).

вот рабочий код: http://pastebin.com/5Ryjr8sD

(пс: для последовательной связи, выход по-прежнему является строкой, поэтому я преобразовать его в полукокса с помощью: message.toCharArray(messagechar,50);

редактирования: кажется, что сообщение вырезать после 32 символа, а не 50 ... Не знаю, почему. Я попытался заменить 50 на 200, и сообщение все равно получилось отрезать после 32 символов

edit2: вот окончательный код, препятствующий пользователю, если он напишет более 32 символов. http://pastebin.com/TVgu16zx

+0

Я добавил изменение, чтобы решить следующую проблему. Если вы используете массив символов, а другая информация помогла вам или поможет вам решить вашу проблему, можете ли вы рассмотреть вопрос о принятии ответа. Cheers –

+0

да, конечно, спасибо за вашу помощь;) – n0tis

Смежные вопросы