Linux のシリアル ポートからデータを読み取るプログラムを作成しています。データは、次のフレーム形式で別のデバイスから送信されます。
|start | Command | Data | CRC | End |
|0x02 | 0x41 | (0-127 octets) | | 0x03|
----------------------------------------------------
Data フィールドには、示されているように 127 オクテットが含まれており、オクテット 1,2 には 1 つのタイプのデータが含まれています。オクテット 3,4 には別のデータが含まれています。これらのデータを取得する必要があります
Linux でシリアル ポートとの間でデータを読み書きする方法は知っていますが、単純な文字列 (「ABD」など) を読み書きするだけです。
私の問題は、上記のようにフォーマットされたデータフレームを解析する方法がわからないため、次のことができることです。
- データ フィールドのオクテット 1,2 のデータを取得する
- データ フィールドのオクテット 3,4 のデータを取得する
- データの一貫性をチェックするために CRC フィールドの値を取得します
Linux のシリアル ポートとの間で単純な文字列を読み書きするサンプル コードは次のとおりです。
int writeport(int fd, char *chars) {
int len = strlen(chars);
chars[len] = 0x0d; // stick a <CR> after the command
chars[len+1] = 0x00; // terminate the string properly
int n = write(fd, chars, strlen(chars));
if (n < 0) {
fputs("write failed!\n", stderr);
return 0;
}
return 1;
}
int readport(int fd, char *result) {
int iIn = read(fd, result, 254);
result[iIn-1] = 0x00;
if (iIn < 0) {
if (errno == EAGAIN) {
printf("SERIAL EAGAIN ERROR\n");
return 0;
} else {
printf("SERIAL read error %d %s\n", errno, strerror(errno));
return 0;
}
}
return 1;
}
誰かアイデアを教えてください。