1. アルゴリズムの紹介
チェックサムは、データの送信または保存におけるエラーを検出または検証するために使用される単純なエラー修正アルゴリズムです。データのチェックサムを計算して生成し、そのチェックサムをデータに追加し、受信側で再度チェックサムを計算して比較し、データが完全で正しいかどうかを判断します。
チェックサム アルゴリズムは通常、ビット単位の演算を使用してチェックサムを計算します。
一般的なサムチェックアルゴリズムは次のとおりです。
(1) 単純合計チェックサム: データ内のすべてのバイトを加算し、結果を事前定義されたチェックサムと比較します。2 つが等しい場合、データにエラーはありません。
(2) CRC (Cyclic Redundancy Check): 除算を使用してチェックサムを計算するため、より高いエラー検出能力があります。CRC アルゴリズムは、固定生成多項式を使用してデータを分割し、その余りをチェックサムとして生成します。
サム チェック アルゴリズムは、さまざまなアプリケーション シナリオで使用できます。
(1) データ伝送: ネットワーク伝送、シリアル ポート通信、またはその他の通信チャネルを通じてデータが伝送される場合、サム チェックは伝送プロセス中に発生するビット エラーや伝送エラーを検出し、データの完全性と正確性を保証します。
(2) ストレージ検証: データ ストレージ メディアにデータを書き込むとき、またはデータ ストレージ メディアからデータを読み取るときに、サム検証はメディアの障害やデータ破損の検出に役立ちます。
(3) ファイル検証: ファイルのダウンロード、ファイルのバックアップ、またはファイルの転送などのシナリオでは、サム検証を使用してファイルの整合性を検証し、ファイルが改ざんまたは破損していないことを確認できます。
(4) データベース検証: データベース システムでは、合計検証を使用してデータの完全性を検出し、保存中または送信中のデータの誤りや破損を防ぐことができます。
サム チェック アルゴリズムは、データの送信または保存におけるエラーを検出するためのシンプルだが実用的なエラー修正アルゴリズムであり、データの整合性と精度を保証するために多くのアプリケーションで広く使用されています。
2. コードの実装
シナリオ: シングルチップ通信では、シングルチップはホスト コンピューターにデータを送信する必要があります。たとえば、この配列は char buff[1024] に格納されます。カプセル化する必要がある関数は 2 つあり、MCU はこのデータに対してサムチェックを行う関数を呼び出し、チェック値をカプセル化し、ホストコンピュータはデータ受信後にチェックサムを検証し、データが正しく送信されたかどうかを確認します。
2.1 MCU側カプセル化機能(データ送信と計算・検証)
// 计算校验和
unsigned char calculateChecksum(const char* data, int length) {
unsigned char checksum = 0;
for (int i = 0; i < length; i++) {
checksum += data[i];
}
return checksum;
}
// 发送数据并附加校验和
void sendDataWithChecksum(const char* data, int length) {
// 发送数据...
unsigned char checksum = calculateChecksum(data, length);
// 发送校验和
// 若使用UART通信,可以使用以下代码发送校验和,并确保上位机端能够解析它
// sendByte(checksum); // 发送校验和
}
上記のコードでは、このcalculateChecksum
関数を使用してデータのチェックサムを計算し、各データ バイトを加算してチェックサム値を返します。sendDataWithChecksum
この関数は、データを送信する前にチェックサムを計算し、ホスト コンピュータにチェックサムを送信するために使用されます。
2.2 ホストコンピュータのカプセル化機能(データ受信とチェックサム検証)
e// 验证校验和
bool verifyChecksum(const char* data, int length, unsigned char receivedChecksum) {
unsigned char calculatedChecksum = calculateChecksum(data, length);
return calculatedChecksum == receivedChecksum;
}
// 接收数据并验证校验和
void receiveDataWithChecksum(const char* data, int length) {
// 接收数据...
unsigned char receivedChecksum = receiveChecksum(); // 假设从上位机接收到校验和的值
if (verifyChecksum(data, length, receivedChecksum)) {
// 校验通过,数据传输正确
// 处理数据...
} else {
// 校验失败,数据传输错误
// 进行相应的处理...
}
}
ホスト側では、verifyChecksum
この関数はチェックサムが受信したチェックサムと一致することを確認するために使用されます。receiveDataWithChecksum
この関数は、データとチェックサムを受信し、verifyChecksum
関数を呼び出して検証するために使用されます。検証に合格した場合、データ送信は正しいことになりますが、そうでない場合、データ送信は間違っています。