Мне нужно отправить несколько чисел с плавающей точкой между некоторыми узлами Texas Instrument CC2530. Эта архитектура может посылать только массив uint8.
То, что я уже пытался сделать, это присвоить указателю uint8 указатель float с литой. Затем я отправляю эти байты, и когда они получены, они копируются в массив uint8. В конце я создаю другой указатель float, который устанавливает листинг ранее созданного массива.
На самом деле, этот трюк работает на моем компьютере (используя символ без знака вместо uint8), но не в узлах, где полученное число всегда равно 0.TI CC2530 - конвертировать поплавок в uint8 [] для отправки, а затем конвертировать обратно в поплавок на прием
Это часть кода используется в случае передачи (там он создает msa_Data1
, что пакет передается, где номер для отправки является valMed
(глобальная переменная)):
void Data_create(){
uint8 *sends;
sends = (uint8 *) &valMed;
uint8 rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
msa_Data1[rec_index]= sends[rec_index];
}
}
в разделе приема у меня есть:
uint8 receiveds[sizeof(float)];
uint8 rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
receiveds[rec_index]= pData->dataInd.msdu.p[rec_index];
}
float *received= (float *)receiveds;
Данные от передачи принимается pData->dataInd.msdu.p[rec_index]
моделирования передачи я пытался на компьютере является:
main(){
float send= -3.14;
unsigned char *sends;
sends = (unsigned char *)&send;
printf("1:%d, 2:%d, 3:%d, 4:%d \nfloat sent:%f \n", sends[0], sends[1], sends[2], sends[3], send);
unsigned char receiveds[sizeof(float)];
int rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
receiveds[rec_index]= sends[rec_index];
}
float *received= (float *)receiveds;
printf("float received:%f\n", *received);
}
Выход:
[email protected] ~/test $ ./test
1:195, 2:245, 3:72, 4:192
float sent:-3.140000
float received:-3.140000
В этом случае я могу увидеть тест хорошо работает на ПК, но это не на узлах. Что случилось?
Заранее благодарю за помощь!
Alex
Может ли принимающая сторона получить «вне фазы», так что она принимает пакет 1 конца байтов и первый байт следующего пакета? Если это возможно, ваши пакеты должны увеличиваться в размере, чтобы включить что-то, чтобы обеспечить правильное согласование во время общения. – chux
Размер пакета должен быть достаточным для этой области, у меня есть 20-байтовый пакет, в то время как поплавок всего 4 байта. Кроме того, создается пакет, устанавливающий данные в правильном расположении массива для отправки, что устраняет даже проблему обратного переупорядочения (классическая проблема с последовательной связью). Благодаря! – Alex