#include #include "gpio.h" #include "uart.h" #include "tick.h" #include "tele.h" enum class RecvModeEnum : unsigned char { Begin, Head, Titles, Data, Auto, SetPID, GetPID, Done }; struct RecvHead { RecvHead(){}; RecvHead(RecvModeEnum mode, unsigned char size, unsigned char crc) { Mode = mode; DataSize = size; DataCRC8 = crc; CRC8 = (unsigned char)((unsigned char)Mode ^ DataSize ^ DataCRC8); } RecvModeEnum Mode; unsigned char DataSize; unsigned char DataCRC8; unsigned char CRC8; bool Check() { return CRC8 == (unsigned char)((unsigned char)Mode ^ DataSize ^ DataCRC8); } }; unsigned char GetCRC8(const void* arr, int size) { unsigned char crc = 0; for (int a = 0; a < size; a++) crc ^= ((unsigned char*)arr)[a]; return crc; } static RecvHead Tele_Mode(RecvModeEnum::Begin,0,0); void TELE_Init() { UART3_Init(57600); } static unsigned long TELE_LastTime=0; static unsigned long TELE_WaitTimer=0; static unsigned long TELE_Count=0; static bool DataAuto=true; void TELE_Update(const void* info, unsigned long size, unsigned long update) { switch(Tele_Mode.Mode) { case RecvModeEnum::Begin: { unsigned char begin; int len=UART3_Recv(&begin, 1); TELE_WaitTimer=TICK_GetCount(); if(len && begin==0xAA) Tele_Mode.Mode=RecvModeEnum::Head; break; } case RecvModeEnum::Head: { int len=UART3_Recv(0, 0); if(len100) Tele_Mode.Mode=RecvModeEnum::Begin; if(DataAuto && (TICK_GetCount()-TELE_LastTime>update)) { TELE_LastTime=TICK_GetCount(); unsigned char h=0xAA; UART3_Send(&h, 1); RecvHead head(RecvModeEnum::Data, size, GetCRC8(info, size)); UART3_Send(&head, sizeof(head)); UART3_Send(info, size); } }