Я пишу программу, которая считывает данные с последовательного порта в Linux.
Данные отправляются другим устройством в следующем формате:
|start | Command | Data | CRC | End |
|0x02 | 0x41 | (0-127 octets) | | 0x03|
----------------------------------------------------
Поле данных содержит 127 октетов, как показано, а октет 1,2 содержит данные одного типа; Октет 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;
}
У кого-нибудь есть идеи?