реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Протокол обмена данными между устройствами, Протокол обмена данными
renni
сообщение Mar 5 2007, 17:14
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 16-02-07
Из: г.Киев, Украина
Пользователь №: 25 417



Доброго дня.
Работаю над обменом данных между ПК и МК по СОМ порту, интересует организация протокола обменна данными. А именно пробовал ли кто реализовать при этом определенный протокол общения при котором гарантировалосьбы достоверность отправленных и принятых команд.
Если не составит сложности дайте ссыли или примеры реализации подобных протоколов общения между устройствами.
Спасибо.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 5 2007, 17:19
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(renni @ Mar 5 2007, 17:14) *
Доброго дня.
Работаю над обменом данных между ПК и МК по СОМ порту, интересует организация протокола обменна данными. А именно пробовал ли кто реализовать при этом определенный протокол общения при котором гарантировалосьбы достоверность отправленных и принятых команд.
Если не составит сложности дайте ссыли или примеры реализации подобных протоколов общения между устройствами.
Спасибо.

Ищите "wake" или "LIN"


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
muravei
сообщение Mar 5 2007, 17:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



http://www.caxapa.ru/faq/wake/
Go to the top of the page
 
+Quote Post
Kolia
сообщение Mar 14 2007, 15:36
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Для надежного приема данных используй циклическую сумму (CRC) по передаваемым данным

Код
Пример процедуры генерации CRC-суммы:

const char r1[16] = {
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D
};

const char r2[16] = {
0x00, 0x70, 0xE0, 0x90, 0xC7, 0xB7, 0x27, 0x57,
0x89, 0xF9, 0x69, 0x19, 0x4E, 0x3E, 0xAE, 0xDE
};
//входные данные: d –символ в сообщении, crc – предыдущее значение CRC-суммы
//выходные данные: CRC-сумма
char do_crc(char d,char crc){
int i;
      i = ((unsigned char)d^(unsigned char)crc) & 0xff;
      crc=r1[i&0xf] ^ r2[i>>4];
return crc;}
При загрузке первого байта из пакета поле crc инициализируется 0.

crc=0;
crc= do_crc(0x55,crc);

Пример генерации пакета данных для передачи и расчет CRC-суммы:

// Пакет данных 0x55, 0x1F, 0x21
char Tbuf[4];//буфер передатчика

        Tbuf[0]=85;
        Tbuf[1]=0x21;
        Tbuf[2]=0xAA;

        crc=0x00;
        for(char i=0;i<3;i++)
                crc=do_crc(Tbuf[i],crc);
В итоге crc=0x97

Пример расчета CRC-суммы в принятом пакете данных:

// Пакет данных 0x55, 0x1F, 0x21, 0x00, 0x64, 0xB1
char Rbuf[4];//буфер приемника

        crc=0x00;
        for(char i=0;i<6;i++)
                crc=do_crc(Rbuf[i],crc);
        if(crc==0) return 0; //Пакет принят без искажений
        else return -1; //Пакет принят c искажениями


Сообщение отредактировал Kolia - Mar 14 2007, 15:39
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 14:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016