Так как передаваемые значения - это цифры от 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'];
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++;
 }
}
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х платах
ОтветитьУдалить