Баг с передачей данных через 433mhz rf kit

Долго пытался понять что же за проблемы со связью, сначало грешил на помехи от моторов (они конечно есть всеравно, но антенка из подручных проволочек помогла), потом попробовал просто передатавать циферки-значения и оказалось что если в строке много повторов (у меня например это было 20002000200020002000) связь продолжает работать, но приемник не видит или не понимает сигнала, поэтому пришлось хитрить...



Так как передаваемые значения - это цифры от 1000 до 2000, постарался немного закодировать их - по 2 байта на цифру, но опять столкнулся с небольшой проблемой передачи не стандартных символов, поэтому пришлось передавать только часть возможный вариантов значений от 32 до 126 (смотрит табличку ASCII), каждое следующее значение сдвигается на 1 бит и в начале строки 2 байта рандомных символов (уже в коде передатчика), на JS код получился примерно таким (управление из браузера):
var dataorder=new Array();
 dataorder['pitch']=1;
 dataorder['yaw']=2;
 dataorder['throttle']=3;
 dataorder['roll']=0;
 dataorder['aux']=4;
...
for (var i in data) {
 var tmp=(data[i]-1000);
 var count=0;
 while (tmp>=94) {
  count++;
  tmp=tmp-94;
 }
 datasend[i]=String.fromCharCode(count+32+dataorder[i])+""+String.fromCharCode(tmp+32+dataorder[i]);
}
var senddata=datasend['roll']+""+datasend['pitch']+""+datasend['yaw']+""+datasend['throttle']+""+datasend['aux'];

Код на приемнике (модификация MultiWii, внутри loop(), до if'ов с computeRC, а сам computeRC закоменчен за ненадобностью)
chan=0;

for (ii = 2; ii < buflen; ii=ii+2) {

 if (chan<5) {

  tmpval=int(buf[ii])-32-chan;

  rcData[chan]=int(buf[(ii+1)])-chan+(94*tmpval)+968;

  if ( rcData[chan] < rcHysteresis[chan] -4) rcHysteresis[chan] = rcData[chan]+2;

  if ( rcData[chan] > rcHysteresis[chan] +4) rcHysteresis[chan] = rcData[chan]-2;

  chan++;

 }

}

2 комментария:

  1. имхо надо написать простенький пакетный протокол с проверкой целостности данных и не мучаться.

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

    ОтветитьУдалить