Перейти к содержанию
    

Помогите разобраться с протоколом WAKE.

Разрабатываю устройство для управления бесколлекторным двигателем. Для организации обмена данными и командами управления хочу использовать протокол WAKE. Есть исходники и описание протокола для РС и AVR. Вот только никак не могу въехать в исходный файл для AVR. Поделитесь опытом если кто уже сталкивался с подобной проблемой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я разбирался.

В конце концов написал свой обработчик на С, работает уже давно.

Не думаю, что он проще. Тоже надо въезжать.

Пишите на С сами, ничего военного.

Вот комменты к моей проге

 

прием синхронизируется по старт байту FEND

Следующий за стартовым байт -длина фрейма без учета байт-стаффинга и

контрольной суммы. Байт стаффинг делается на лету. Контрольная сумма

вычисляется тут же и если соответствует, то вызывается

CallBack с errorlevel=CRC_OK, иначе errorlevel=BadCRC

errorlevel выставляется также в случаях потери синхронизации и

затирании несчитанного фрейма

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WAKE, если не ошибаюсь это кастрированный SLIP от юникса?

если не изменяет память

транспорт таков:

C0-служ данные-и в конце-CRC8? со стафингом...

там вроде все просто - в чем проблема?

если это конечно он....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да все верно. Но вот уже третий день сижу над ним. Растолкуй если можешь добрый человек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исходник я дам, не проблема, но в стуктуре данных будешь сама разбираться.

CRC не считал, а использовал обычную контрольную сумму.

 

Передающую часть сама разберешь.

 

 

 

#define x_crc 1

#define x_ptr 2

#define x_use 3

#define x_cta 4

#define x_end 5

#define x_data 6

#define tx_ptr 0

 

 

#define Crc_Init FEND

 

#define MAX_Pack_sz MAX_FRAME_SIZE - 3

#define PreambulaTime 4

 

#define FESC 0xDB

#define FEND 0xC0

#define TFESC 0xDD

#define TFEND 0xDC

#define tx_end 1

//FESC=> FESC+TFESC

//FEND=> FESC+TFEND

 

typedef void (*LRead_CallBack) (signed char);

 

typedef struct {

unsigned char Pre;//Предыдущий байт

unsigned char Crc;

unsigned char Ptr;//указатель текущего байта в буфере

unsigned char Ready;//флаг готовности буфера

unsigned char CTA;//флаг синхронизации со тсартовым байтом

unsigned char End;//указатель на последний байт в буфере

//unsigned char Length;//Длина пакета

unsigned char Frame[MAX_Pack_sz];

} TFrameBuf;

 

 

//-****************************************-/

//-* interrupt handled uart reсеiver /

//-****************************************

 

 

#pragma vector=RS485_RXC_VECTOR

__interrupt void USART1_RXC_interrupt( void )

{

register char Sdata,temp;

 

Sdata=RS485_PORT;

 

if (Sdata==FEND){

//получен старт, синхронизируемся

 

 

 

RX_driver_Errorlevel=Sinc_err;

Frame_buf.CTA=1;

Frame_buf.Ptr=x_end;//=6, последний байт заголовка перед буфером

if(Frame_buf.Ready)RX_driver_Errorlevel=Buf_overrun;//Set ErrorLevel

Frame_buf.Ready=0;

Frame_buf.Crc=Crc_Init;//то есть =FEND

Frame_buf.End=MAX_Pack_sz+x_end;//потом подрихтуется?????????????????

 

 

 

} else

if (Frame_buf.CTA)//sinchronized

{

 

temp=Frame_buf.Pre;

Frame_buf.Pre=Sdata;

if (temp==FESC){

if ((Sdata!=TFESC)|(Sdata!=TFEND))

{Frame_buf.CTA=0;

RX_driver_Errorlevel=Sinc_err; //Set ErrorLevel

 

} ;

if (Sdata==TFESC) {Sdata=FESC;};

if (Sdata==TFEND) {Sdata=FEND;};

} else {// No STuffing

 

if (Sdata!=FESC){//proceed byte

if (Frame_buf.Ptr==x_end){//first simbol is length

if(Sdata> MAX_Pack_sz)Frame_buf.End=MAX_Pack_sz+x_data;

else Frame_buf.End=Sdata+x_data; };

 

Frame_buf.Frame[Frame_buf.Ptr-x_end]=Sdata; //Store Byte

//в том числе и CRC!

 

Frame_buf.Ptr++;

if (Frame_buf.Ptr >Frame_buf.End ){

//pack recd

 

if (Frame_buf.Crc==Sdata){// crc ok

 

RX_driver_Errorlevel= RX_OK;

Frame_buf.Ready=1;

Frame_buf.CTA=0;

if ( LL_ReadCallback!=NULL)LL_ReadCallback(Frame_buf.Frame[0]);

//В этом колбаке просто ставится флажок, что данные прибыли

 

} else {//bad crc

Frame_buf.Ready=0;

Frame_buf.CTA=0;

RX_driver_Errorlevel=BadCrc;

 

};

} else {Frame_buf.Crc+=Sdata;};// pack rcd

};//proceed

}; //no stuffing

}//Sinchronized

};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да все верно. Но вот уже третий день сижу над ним. Растолкуй если можешь добрый человек.

а что растолковать? что не получается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простыми словами объяснить алгоритм - как принять правильно пакет и передать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ВОТ пользуйтесь!

Какие то грамотные люди посторались

прям все по полочкам разложено

http://www.spetspribor.com/support/software/wake/wake.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...