~={green}Проект для тестирования стержней.=~
~={yellow}Таймеры=~
~={yellow}Остальное=~
Фиксация значений счетчиков и дискретных входов происходит с интервалом 1мс. В этот момент заполняется следующая структура данных:
typedef struct
{
uint32_t pack_counter;
uint16_t vertical;
uint16_t horizontal;
uint32_t dpl_1;
uint32_t dpl_2;
uint8_t flag;
} signals_t;
/*
pack_counter - увеличивается на 1 каждый раз при заполнении новой структуры
vertical - вертикальный детектор (значения не накапливаются)
horizontal - горизонтальный детектор (значения не накапливаются)
dpl_1 - первый инкрементальный датчик (значения накапливаются)
dpl_2 - второй инкрементальный датчик (значения накапливаются)
flag - байт дискретных датчиков
0-ой бит - датчик начала измерения (НИ)
1-ый бит - датчик конца измерения (КИ)
2-ой бит - датчик Д1000
*/
Для передачи данных используется протокол Wake. Структуры упаковываются в пакеты. Пакет может содержать одну или более целых структур. Частично структуры не передаются.
Пакет состоит из заголовка, полезных данных и контрольной суммы.
Заголовок пакета: |------ Байт 1 ------|------ Байт 2 ------|------ Байт 3 ------|------ Байт 4 ------|------ Байт 5 ------| |--- WAKE_FEND ---|------- Адрес -----|-- Номер пакета--|------Размер данных в байтах--------|
WAKE_FEND - признак начала пакета - 0x0C, Адрес - адрес устройства - 0x81 Байты 4 и 5 содержат длину только полезных данных без учета заголовка и контрольной суммы. Номер пакета увеличивается на 1 с каждым новым пакетом. Контрольная сумма располагается в конце пакета и занимает один байт. Контрольная сумма рассчитывается для всего пакета, включая заголовок и блок полезных данных.
uint8_t Wake::crc_8(uint8_t *data, int length)
{
uint8_t crc = 0x00;
uint8_t extract;
uint8_t sum;
for (int i = 0; i < length; i++) {
extract = *data;
for (uint8_t tmp = 8; tmp; tmp--) {
sum = (crc ^ extract) & 0x01;
crc >>= 1;
if (sum)
crc ^= 0x8C;
extract >>= 1;
}
data++;
}
return crc;
}
Для передачи пакетов по USB используется буфер размером 512 байт. В буфер такого размера помещается порядка 29 структур, завернутых в пакет в один протокола Wake.
Пример чтения данных из тестового скрипта:
def receiver_test(self):
while True:
msg = self.serial.read(512)
if msg:
self.recv_chank(msg)
else:
print("USB receive timeout")
Скрипт usb_receiver.py находится tools/