Nhập dữ liệu dạng byte hex hoặc chuỗi ký tự, công cụ tính cùng lúc CRC-8, CRC-16 (Modbus, CCITT, XMODEM), CRC-32 và các checksum, kèm hàm C để dùng ngay trên vi điều khiển.

CRC là gì?

CRC (Cyclic Redundancy Check) là một con số tính từ khung dữ liệu và gửi kèm theo khung. Bên nhận tính lại CRC; nếu không khớp thì biết dữ liệu bị lỗi trên đường truyền. CRC phát hiện lỗi tốt hơn nhiều so với checksum cộng dồn, nhất là lỗi nhiều bit liền nhau do nhiễu.

Vì sao cùng là CRC-16 mà ra kết quả khác nhau?

Một thuật toán CRC được xác định bởi 6 tham số: width (độ rộng), poly (đa thức), init (giá trị khởi tạo), refin / refout (có đảo thứ tự bit không) và xorout. Chỉ cần khác một tham số là kết quả khác hẳn. Vì vậy CRC-16/MODBUS và CRC-16/CCITT-FALSE cho hai số khác nhau dù cùng 16 bit. Bảng kết quả ở trên tính mọi biến thể phổ biến cùng lúc để bạn dò xem thiết bị đang dùng loại nào.

Ví dụ: khung Modbus RTU

Lệnh đọc 10 thanh ghi từ địa chỉ 0 của slave 1 là 01 03 00 00 00 0A. CRC-16/MODBUS của 6 byte này là 0xCDC5, và Modbus gửi byte thấp trước, nên khung hoàn chỉnh là:

01 03 00 00 00 0A C5 CD

Kiểm tra code CRC của bạn

Mỗi thuật toán có một “giá trị kiểm tra” chuẩn, là CRC của chuỗi ASCII 123456789. Chuyển sang chế độ Chuỗi ký tự, nhập 123456789 rồi so kết quả với dòng “Giá trị kiểm tra”. Nếu hàm C trên vi điều khiển của bạn ra cùng số đó thì cài đặt đã đúng.

CRC trên STM32

STM32 có khối CRC phần cứng. Ở cấu hình mặc định, khối này tính CRC-32/MPEG-2 (không đảo bit, không XOR kết quả) và nạp dữ liệu theo từng word 32-bit, nên kết quả khác CRC-32 của file ZIP. Các dòng STM32 đời mới hơn (F0, F3, F7, G0, L4…) cho phép bật đảo bit vào/ra và trên nhiều dòng còn đổi được đa thức, nhờ đó tính ra đúng CRC-32 chuẩn.

Bài viết liên quan