Спойлер
Код: Выделить всё
struct Serv485u8// данные выдаются в формате char
{
unsigned char Addr; //1 1
unsigned char contr; //1 2//0x5A
unsigned short len; //2 4
unsigned char pak[2];//2 6
unsigned char c[1024];//передаваемые данные
};
struct
{
unsigned char pac;
unsigned char read;
}uk;//указатель на точки чтения и записи
unsigned char uart_rx[1024]; // кольцевой буфер приёма
unsigned char adr = 0x50;
void InPac();
bool СheckCRC485(unsigned char *Buff, unsigned short len);
void ReadPac(unsigned char * pcBlock, unsigned short len);
//----------
void __ISR(_UART_2_VECTOR, IPL1AUTO) UART2Interrupt(void)//
{
unsigned short i0=10;//блокировка зацикливания
if(IFS1bits.U2EIF)//проверить на наличие ошибок
{
CheckError(); //читаем биты ошибок
}
else
{ // ошибок нет, читаем
do
{
uart_rx[uk.pak] = U2RXREG;
if(uk.pak<sizeof(uart_rx)-1)//индекс сдвинули на байт
uk.pak++;
else uk.pak=0;
i0--;
} while(U2STAbits.URXDA && i0);
}
IFS1bits.U2RXIF=0; //сброс флага прерывания
}
//======
void main()
{
while(1)
{
if((uk.pac - uk.read) >4)
InPac();
// тут ещё много всяких if'ов которые по флагам от таймеров и иных прерываний выполняют различные задания
}
}
//----------
void InPac()
{
struct Serv485u8 *serv;
while(uk.read!=uk.pac)// пока всё не прочитаем
// помню что буфер кольцевой, но этот вопрос буду решать позже, главное с выравниванием разобраться
{
if(uart_rx[uk.read]==adr && uart_rx[uk.read+1]==0x5A)//;
{//собираем пакет
serv=(void*)&uart_rx[uk.read];// можно было и так serv=(struct Serv485u8*)&uart_rx[uk.read]; но ничего особо не меняет
//если uk.read не чётное число, адрес получается тоже нечётный
//если обратиться к структуре(например serv->len) то тут вылетаем в ошибку
if(serv->len < (uk.pac - uk.read))//если пришёл весь пакет
{
if(СheckCRC485(uart_rx[uk.read], serv485->len-2))
{
ReadPac(uart_rx[uk.read], serv485->len-2);//передаём пакет на разборку
uk.read+=serv485->len; // данные считали, двинули указатель чтения
if(uk.read>=sizeof(uart_rx))//если вышли за пределы кольцевого массива, вернутся к началу
uk.read-=sizeof(uart_rx);
}
else uk.read++;
}
else break; // выходим, зайдём в следующий раз, возможно к тому моменту успеет всё собраться
}
else// не нашли нужных байт, двигаем указатель чтения
uk.read++;
}
}// Ну как то так
А выровнять структуру при объявлении?
Код: Выделить всё
#pragma pack(push, 1)
struct Serv485u8// данные выдаются в формате char
{
unsigned char Addr; //1 1
unsigned char contr; //1 2//0x5A
unsigned short len; //2 4
unsigned char pak[2];//2 6
unsigned char c[1024];//передаваемые данные
};
struct
{
unsigned char pac;
unsigned char read;
}uk;//указатель на точки чтения и записи
#pragma pack()


