Передача дынных ардуине с C#
- Войдите на сайт для отправки комментариев
Добрый день, коллеги.
Поясните пожалуйста как правильно сделать..
наWinForms C# приложении формируется команда
D1300000000000000000000000000
где D - тип действия
13 - количество байт после
остальное пары в HEX значениях в строке (00, FF, 80 итд)
Как я понимаю - они занимают по 2 байта в памяти.
sent UDP packet D1300000000000000000000000000 size: 29 to 192.168.1.195:7777
received: Data recieved (ответ от ардуины)
а вот кусочек кода
if(act == "D") { // read the next part os string; String pairs = buff.substring(1,3); // calculate offset of data int offset = String2Int(pairs); String rcvd_data = buff.substring(3, (offset*2)+4); byte data[offset]; for(int i=0; i < rcvd_data.length(); i=i+2) { String str = rcvd_data.substring(i, i+2); Serial.println( str ); } Udp.beginPacket(Udp.remoteIP(), 7777); Udp.write("Data recieved"); Udp.endPacket(); }
Объясните мне пожалуйста: я понимаю что подход сейчас в корне не верный - каждое значение должно занимать по 1 байту. Но переделывать сейчас нет времени.. покажу работу и сделаю верно байт к байту.
как правильно обработать массив байт FF, 80, 00, 0F .. в коде ардуины, чтобы из уже разделенного строкового значения String (как объект) сделать массив байт.
А также, посоветуйте пожалуйста хороший пример передачи таких данных.
Благодарю.
После C#, С в ардуине выносит мозг ) Но, все что нас не убивает делает нас сильнее.
Упс, темку хорошо назвал.. а поправить нет возможности. Простите
>Как я понимаю - они занимают по 2 байта в памяти.
С какого испугу? FF это и есть один байт
Да, если верно все передавать... то один. а так получается что два по тому что один символ в строке это F а другой еще один F и получается что 1 байт занимает 2..
Нужно покопать в UDP передачи пакетов в С# и упаковке их в 1 символ а не в 2.
Но вопрос не снимается... как преобразовать строку из 2 байт уже в ардуине в 1 байт
Вот потихоньку к чему прихожу..
ух... помоему вы сами создали себе трудности и теперь героически с ними сражаетесь.
Вы, ко всему прочему, еще и комманду отправляете в виде текстовой строки? Да еще, наверное в UTF8 :)
Зачем? сишарпный UDP-клиент умеет же спокойно передавать массив байтов. public int Send(byte[] dgram,int bytes)
Где каждый байт есть байтом. Зачем делать конвертации числа->строка->числа? Да и, в любом случае, на стороне C# любые конвертации проще делать. Тогда на ардуине останется только тупо прочитать нужное количество байт в буффер. И все.
Да действительно. вы правы.
В итоге получилось так:
послал набор байт на клиенте int16 + 1nt16 + byte x 13
получил через
Udp.ReadByte(char* action,4);
Udp.ReadByte(char* offset,4);
Udp.ReadByte(char* data, sizeof( int(offset) ));
*(код условный)*
Все работает. Благодарю за помошь.
UPD: не не UTF8 ))) ASCII as byte. Но тоже не вариант.
С# и подобные конечно изабловали програмистов. Читал матчасть. понял много нового.
А еще в книге по ардуинке нашел про тип String как объект. Написано что его хорошо использоватть в скейтче Hello World и еще для Ликвид Кристалл библиотеки он пригодится.
Так что изначально мой путь с ним был не очень правильным. Зато свой HW я написал )
>С# и подобные конечно изабловали програмистов. Читал матчасть. понял много нового.
А что в этом плохого? :) Компьютер должен работать, а человек думать ;)
Кстати C# и на микроконтроллерах бывает (но из-за своей не Real-Time-мовости как-то не пошел сильно в массы).
Вы станте не на место программиста, а на место того кто "оплачивает музыку". Того кто платит зарплату ему. Посмотрите стоимость часа работы программиста и прикинте во что может обойтись традииционная C-шная ловля "утечки памяти". Которую в C# сборщик мусора поймает автоматом.
Да и требования к квалификации С-шного программиста - выше. Больше свобода, но и способов "выстрелить себе в ногу" - на порядок больше. Причем так что "фиг догадаешься". В обычной жизни пилоты формула один требуются гораздо реже чем водитель молоковозки.
Так что тенденция повышения "уровневости" языков - сохранится. Просто потому что они позволяет дешевле решать задачу с _приемлимым_ качеством.
>не не UTF8 ))) ASCII as byte. Но тоже не вариант.
Могу конечно ошибатся, "внутре" C# все-таки хранит строки, по моему, в UTF8 (или UTF16, точно не помню). Это уже когда вы в байты превращали, то видимо использовали System.Text.Encoding.ASCII, и "глупый" сишарп успел сделать, нечувствительно для вас, нужное перекодирование в acsii, а уж его в байты.
>Так что изначально мой путь с ним был не очень правильным.
Зато думаю, попутно, кучу нового узнали-прочитали. В любом случае навык поиска решения отточили ;)