AFON//Радиотехник
C++Builder · проект 45/50

Пакет с CRC-8

Преамбула, длина, данные, CRC-8.

Задача

Собрать простой пакет: преамбула, длина, данные и контрольная сумма CRC-8.

Компоненты на форме

Edit (EditData), Button (ButtonBuild), Memo (MemoOut).

Как работает

  1. Ввести данные как hex-байты через пробел.
  2. Добавить преамбулу 0xAA и байт длины.
  3. Посчитать CRC-8 по длине и данным.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 45. Пакет с преамбулой и CRC-8
// Формат: преамбула, длина, данные, CRC-8.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Простой протокол поверх любого канала: преамбула 0xAA, длина, данные и
// CRC-8 (полином 0x07). crc8 — ядро, проверяется тестом.
unsigned char crc8(const unsigned char *p, int len)
{
    unsigned char crc=0;
    for (int i=0;i<len;i++){
        crc ^= p[i];
        for (int k=0;k<8;k++)
            crc = (crc & 0x80) ? (crc<<1)^0x07 : (crc<<1);
    }
    return crc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonBuildClick(TObject *Sender)
{
    // данные вводятся как hex-байты через пробел
    unsigned char data[64]; int n=0;
    TStringList *parts=new TStringList();
    try {
        parts->Delimiter=' '; parts->DelimitedText=EditData->Text;
        for (int i=0;i<parts->Count && n<64;i++){
            AnsiString t=parts->Strings[i].Trim();
            if (!t.IsEmpty()) data[n++]=(unsigned char)StrToIntDef("0x"+t,0);
        }
    } __finally { delete parts; }

    unsigned char pkt[70]; int k=0;
    pkt[k++]=0xAA;                    // преамбула
    pkt[k++]=(unsigned char)n;        // длина
    for (int i=0;i<n;i++) pkt[k++]=data[i];
    pkt[k++]=crc8(pkt+1, n+1);        // CRC по длине и данным

    AnsiString hex;
    for (int i=0;i<k;i++) hex+=IntToHex((int)pkt[i],2)+" ";
    MemoOut->Text="Пакет ("+IntToStr(k)+" байт): "+hex;
}
//---------------------------------------------------------------------------

Пояснения

  • CRC-8 с полиномом 0x07 — распространённый выбор для коротких пакетов.
  • Для «123456789» CRC-8 равен 0xF4 — проверено тестом.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.