Задача
Собрать простой пакет: преамбула, длина, данные и контрольная сумма CRC-8.
Компоненты на форме
Edit (EditData), Button (ButtonBuild), Memo (MemoOut).
Как работает
- Ввести данные как hex-байты через пробел.
- Добавить преамбулу 0xAA и байт длины.
- Посчитать 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.