Снова по сборке сетевого пакета.

rene
Offline
Зарегистрирован: 21.01.2014

Доброго времени суток, снова я к вам за советом!

Необходимо скомпоновать сетевой пакет, где первый байт - ID устройства, следующие 4 байте - номер события.

Пробовал так:


byte ID = 1
unsigned long SequenceId = 0;
;
void loop()
{
  Udp.beginPacket("192.168.1.100", 8888);
  Udp.write(ID);
  Udp.write(SequenceId, 4);
  Udp.endPacket();
  SequenceId ++;
  delay(10000);
}

Ругается на Udp.write(SequenceId, 4); - Call of overloaded 'write(long unsigned int&, int)' is ambiguous

Если записать так Udp.write(SequenceId);, то используется только 1 байт из 4. Как это исправить?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

1. Разбейте SequenceId на байты и отправляйте по очереди, через Udp.write(byte);.

2. Преобразуйте SequenceId в массив символов и отправьте через Udp.write(buffer, size);

rene
Offline
Зарегистрирован: 21.01.2014

Сделал так:

byte ID = 0;
unsigned long SequenceId = 0;
byte* ptr = (byte*)&SequenceId;
void loop()
{
  delay(1000);

  Udp.beginPacket("192.168.1.100", 8888);
  Udp.write(ID);
  for (byte i = 0; i < 4; i ++){
    Udp.write(ptr[i]);
  }

Udp.endPacket();
SequenceId ++;

Работает, но как то громоздко выглядит с этими указателями, может можно упростит?.

А как можно преобразовать long в массив?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

rene пишет:

Сделал так:

byte ID = 0;
unsigned long SequenceId = 0;
byte* ptr = (byte*)&SequenceId;
void loop()
{
  delay(1000);

  Udp.beginPacket("192.168.1.100", 8888);
  Udp.write(ID);
  for (byte i = 0; i < 4; i ++){
    Udp.write(ptr[i]);
  }

Udp.endPacket();
SequenceId ++;

Работает, но как то громоздко выглядит с этими указателями, может можно упростит?.

А как можно преобразовать long в массив?

будет хуже

http://arduino.stackexchange.com/questions/5416/convert-long-to-char-arr...

rene
Offline
Зарегистрирован: 21.01.2014

ок, спасибо!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А не проще Udp.write(&SequenceId, sizeof(SequenceId));
?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

kisoft пишет:
А не проще Udp.write(&SequenceId, sizeof(SequenceId)); ?

ну вот зачем?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Gippopotam пишет:

kisoft пишет:
А не проще Udp.write(&SequenceId, sizeof(SequenceId)); ?

ну вот зачем?


TC поблагодарил, значит решение нашёл. Я предложил вариант. Какие проблемы?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

kisoft пишет:
Gippopotam пишет:

kisoft пишет:
А не проще Udp.write(&SequenceId, sizeof(SequenceId)); ?

ну вот зачем?

TC поблагодарил, значит решение нашёл. Я предложил вариант. Какие проблемы?

Никаких. Шутка юмора.

rene
Offline
Зарегистрирован: 21.01.2014

kisoft пишет:
А не проще Udp.write(&SequenceId, sizeof(SequenceId)); ?

Получаю ошибку: no matching function for call to 'EthernetUDP::write(long unsigned int*, unsigned int)'

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

rene пишет:

kisoft пишет:
А не проще Udp.write(&SequenceId, sizeof(SequenceId)); ?

Получаю ошибку: no matching function for call to 'EthernetUDP::write(long unsigned int*, unsigned int)'

попробуйте приведение типа