Передача дынных ардуине с C#

Мининова
Offline
Зарегистрирован: 08.06.2012

Добрый день, коллеги.

Поясните пожалуйста как правильно сделать..

на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#, С в ардуине выносит мозг ) Но, все что нас не убивает делает нас сильнее.

Мининова
Offline
Зарегистрирован: 08.06.2012

Упс, темку хорошо назвал.. а поправить нет возможности. Простите

leshak
Offline
Зарегистрирован: 29.09.2011

 >Как я понимаю - они занимают по 2 байта в памяти.

С какого испугу? FF это и есть один байт

Мининова
Offline
Зарегистрирован: 08.06.2012

Да, если верно все передавать... то один. а так получается что два по тому что один символ в строке это F а другой еще один F и получается что 1 байт занимает 2..

Нужно покопать в UDP передачи пакетов в С# и упаковке их в 1 символ а не в 2.

Но вопрос не снимается... как преобразовать строку из 2 байт уже в ардуине в 1 байт

        for(int i=0; i < rcvd_data.length(); i=i+2)
        {
          String _str = "0x" + rcvd_data.substring(i, i+2);
          char str[_str.length()];
          _str.toCharArray(str, _str.length());
          Serial.println( str );
        }

Вот потихоньку к чему прихожу..

leshak
Offline
Зарегистрирован: 29.09.2011

 ух... помоему вы сами создали себе трудности и теперь героически с ними сражаетесь.

Вы, ко всему прочему, еще и комманду отправляете в виде текстовой строки? Да еще, наверное в UTF8 :)

Зачем? сишарпный UDP-клиент умеет же спокойно передавать массив байтов. public int Send(byte[] dgram,int bytes)

Где каждый байт есть байтом. Зачем делать конвертации числа->строка->числа?  Да и, в любом случае, на стороне C# любые конвертации проще делать. Тогда на ардуине останется только тупо прочитать нужное количество байт в буффер. И все.

Мининова
Offline
Зарегистрирован: 08.06.2012

Да действительно. вы правы.
В итоге получилось так:
послал набор байт на клиенте 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. Но тоже не вариант.

С# и подобные конечно изабловали програмистов. Читал матчасть. понял много нового.

Мининова
Offline
Зарегистрирован: 08.06.2012

А еще в книге по ардуинке нашел про тип String как объект. Написано что его хорошо использоватть в скейтче Hello World и еще для Ликвид Кристалл библиотеки он пригодится.

Так что изначально мой путь с ним был не очень правильным. Зато свой HW я написал )

leshak
Offline
Зарегистрирован: 29.09.2011

 >С# и подобные конечно изабловали програмистов. Читал матчасть. понял много нового.

А что в этом плохого? :) Компьютер должен работать, а человек думать ;)

Кстати C# и на микроконтроллерах бывает (но из-за своей не Real-Time-мовости как-то не пошел сильно в массы).

Вы станте не на место программиста, а на место того кто "оплачивает музыку". Того кто платит зарплату ему. Посмотрите стоимость часа работы программиста и прикинте во что может обойтись традииционная C-шная ловля "утечки памяти". Которую в C# сборщик мусора поймает автоматом.

Да и требования к квалификации С-шного программиста - выше. Больше свобода, но и способов "выстрелить себе в ногу" - на порядок больше. Причем так что "фиг догадаешься". В обычной жизни пилоты формула один требуются гораздо реже чем водитель молоковозки.

Так что тенденция повышения "уровневости" языков - сохранится. Просто потому что они позволяет дешевле решать задачу с _приемлимым_ качеством.

>не не UTF8 ))) ASCII as byte. Но тоже не вариант.

Могу конечно ошибатся,  "внутре" C# все-таки хранит строки, по моему, в UTF8 (или UTF16, точно не помню). Это уже когда вы в байты превращали, то видимо использовали System.Text.Encoding.ASCII, и "глупый" сишарп успел сделать, нечувствительно для вас, нужное перекодирование в acsii, а уж его в байты.

>Так что изначально мой путь с ним был не очень правильным.

Зато думаю, попутно, кучу нового узнали-прочитали. В любом случае навык поиска решения отточили ;)