Проблема с размером байта в Arduino Ethernet - PullRequest
2 голосов
/ 07 января 2011

Я использую Arduino (duemilanove) с официальным экраном Ethernet для отправки данных на контроллер для управления светодиодной матрицей. Я пытаюсь отправить некоторые необработанные 32-разрядные значения без знака int (временные метки Unix) в контроллер, взяв 4 байта в 32-разрядном значении на рабочем столе и отправив его в arduino как 4 последовательных байта. Однако всякий раз, когда значение байта больше 127, возвращаемое значение клиентской библиотекой Ethernet составляет 63.

Ниже приведен базовый пример того, что я делаю на стороне Arduino. Некоторые вещи были убраны для аккуратности.

byte buffer[32];
memset(buffer, 0, 32);

int data;
int i=0;

data = client.read();
while(data != -1 && i < 32)
{
  buffer[i++] = (byte)data;
  data = client.read();
}

Таким образом, всякий раз, когда входной байт больше 127, переменная «data» в конечном итоге будет установлена ​​в 63! Сначала я думал, что проблема заключалась в том, что проблема заключалась в том, что в буфере раньше использовался символ вместо байта, но когда я распечатываю «данные» сразу после чтения, он все равно равен 63.

Есть идеи, что может быть причиной этого? Я знаю, что client.read () должен выводить int и внутренне считывает данные из сокета как uint8_t, который является полным байтом и без знака, поэтому я должен иметь возможность по крайней мере перейти к 255 ...

РЕДАКТИРОВАТЬ: Правильно, Ганс. Не осознавал, что Encoding.ASCII.GetBytes поддерживает только первые 7 бит, а не все 8.

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Я более склонен подозревать сторону передачи.Вы уверены, что передающая сторона работает правильно?Вы проверили с помощью захвата Wireshark или что-то подобное?

3 голосов
/ 07 января 2011

63 - это код ASCII для? Значения имеют отношение к значениям, ASCII не имеет кодов символов для значений свыше 127. Кодировщик ASCII обычно заменяет недопустимые коды, подобные этому, знаком вопроса. Поведение по умолчанию для кодера .NET Encoding.ASCII, например.

Не совсем ясно, где это может произойти. Определенно не в вашем фрагменте. Вероятно, на другом конце провода. Пишите байты, а не символы.

0 голосов
/ 06 ноября 2013

+ 1 для Ханса Пассанта и Карла Билефельда.

Можете ли вы просто отправить данные без кодирования?Как отправляются данные?TCP / UDP / IP / Ethernet определенно поддерживает отправку двоичных данных без ограничений.Если это невозможно, возможно, преобразование данных в шестнадцатеричный формат решит проблему.Base64 также будет работать (лучше), но это значительно больше работы.Для небольших объемов данных, шестнадцатеричное, вероятно, самое простое и быстрое решение.

+ 1 снова Карлу и Бену за упоминание проволочной акулы.Не подходит для отладки сетевых проблем, подобных этой.

...