Отправить int16_t через COM port

vladislav131
Offline
Зарегистрирован: 17.05.2014

Добрый день. Сразу оговорюсь, что под COM портом подразумевается блютуз. Не думаю, что это как-то повлияет, но все-таки.

Дело вот в чем. Я с датчика получаю данные ускорения и угловой скорости по трем осям. Итого у меня выходит 6 значений(если еще температуру добавить, то 7). На компьютере работает принимающая программа, которая рисует трехмерную картинку(Авиа горизонт, температуру за бортом.) Дело в том, что все это работает, только отдельно друг от друга. Программа показывает авиа горизонт по искусственным данным, а нужно получать их от arduno. Принимаемые от GY-521 данные хранятся в шести переменных типа int16_t. Я не думал, то это окажется самой сложной проблемой, но я не могу их нормально отправить через Serial.write(). А косяк вот в чем: если написать:

void setup()
{
  Serial.begin(9600);
}
//char * buf1[6] = (char) buf;

void loop()
{
  int buf =  0xFFFFFFFF;
  for (long int i=0;i<=0xFFFFFFFF;i++)
  {
  Serial.write((long int) i);
  delay(50);
  }
}

Он отправляет раз в 50 миллисекунд один байт. Именно байт. Не лонг инт. Соответственно в мониторе порта я вижу всю последовательность ASCII символов.

Вопрос такой, как отправить на компьютер 7 переменных типа int16_t? Само собой, все должно дойти в сохранности.

vladislav131
Offline
Зарегистрирован: 17.05.2014
void sendInt16(int buf)
{
  byte * bf = (byte *) &buf;
  Serial.write(bf[0]);
  Serial.write(bf[1]);
}

 

toly
Offline
Зарегистрирован: 17.05.2014

Преобразовать все int16_t в массив байтов и последовательно побайтно передать их в сериал, на приемной стороне обратное преобразование.

Seth
Offline
Зарегистрирован: 01.02.2014

vladislav131, подскажите пожалуйста, как потом на компе собрать этот int обратно из байт. Желательно на С++

mixail844
Offline
Зарегистрирован: 30.04.2012

Seth пишет:

vladislav131, подскажите пожалуйста, как потом на компе собрать этот int обратно из байт. Желательно на С++

думаю как вариант : 

byte buffer[2]; //допустим если есть некий буфер принявший ваши данные
int intBuff[1] ;
intBuff = (int)buffer;

и требуемое вам значение будет находиться в intBuffer[0];

или как вариант : 

​
byte buffer[2]; 
void *temp;
int intBuff[1] ;
temp = (void*)buffer;
intBuff = (int)temp;

и требуемое вам значение будет находиться в intBuffer[0];

еще вариант,как мне кажеться самый правдоподобный : 

byte buffer[2];
int Data = 0 ;

Data = Data | buffer[0];//побитовая операция OR
Data = Data * 256; //побитовый сдвиг влево 8 раз 8-ми нижних бит числа
и затем : 
 Data = Data | buffer[1];

 

ourlive
Offline
Зарегистрирован: 26.05.2012

Правилом хорошего тона является разделение передаваемых слов каким либо ключемым символом маркером(если не заморачиваться на CRC). На компе буфер большой, его переполнение редкость, а вот со стороны контроллера такое случается, причём в самый неожиданный момент. Потому передача данных должна включать в себя формирование строки с ключами, а со стороны компа разбивать её по ключам. Обычно ключём является символ новой строки.

Radjah
Offline
Зарегистрирован: 06.08.2014

Я бы лучше передавал число строкой, тогда и ключи будет легче найти и гарантия от случая, когда байт с куском числа совпадет с кодом ключа.

ourlive
Offline
Зарегистрирован: 26.05.2012

Пример NMEA. Идею и требования описывает полность. Годится для любых низкоскоростных данных.