
В коде происходит так:
Код
uint8 *buf1;
.....
if(RS232_RX_BUFFER_OVERFLOW) {
buf1 = (uint8*) malloc(RS232_RX_BUFFER_SIZE * sizeof(uint8)); // Сообразили 2-й буфер
//if (buf==0) break; // Тут надо придумать обработчик если памяти на буфер не дали
buf1 = (uint8*) memcpy((uint8*)buf1,(uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE);
RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
RS232_RX_BUFFER_INDEX=0;
if(UART_Decode_Package((uint8*)buf1,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30); // Пакет битый
free(buf1);
}
.....
if(RS232_RX_BUFFER_OVERFLOW) {
buf1 = (uint8*) malloc(RS232_RX_BUFFER_SIZE * sizeof(uint8)); // Сообразили 2-й буфер
//if (buf==0) break; // Тут надо придумать обработчик если памяти на буфер не дали
buf1 = (uint8*) memcpy((uint8*)buf1,(uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE);
RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
RS232_RX_BUFFER_INDEX=0;
if(UART_Decode_Package((uint8*)buf1,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30); // Пакет битый
free(buf1);
}
если же динамический массив не использовать то проверка на валидность пакета проходит без проблем. Вот так работает:
Код
if(RS232_RX_BUFFER_OVERFLOW) {
if(UART_Decode_Package((uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30);
RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
RS232_RX_BUFFER_INDEX=0;
}
if(UART_Decode_Package((uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30);
RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
RS232_RX_BUFFER_INDEX=0;
}
Вот обработчик пакета:
Код
uint8 UART_Decode_Package(uint8 *rs232_rx_buf,uint8 Len) {
uint16 crc16;
crc16 = (uint16) CRC16((uint8*) rs232_rx_buf,Len-2);
if (crc16!=((((uint16) rs232_rx_buf[Len-2])<<8) | rs232_rx_buf[Len-1])) { // Если пришёл битый пакет
return 0; // Контрольная сумма не прошла
}
.......
return 1;
}
uint16 crc16;
crc16 = (uint16) CRC16((uint8*) rs232_rx_buf,Len-2);
if (crc16!=((((uint16) rs232_rx_buf[Len-2])<<8) | rs232_rx_buf[Len-1])) { // Если пришёл битый пакет
return 0; // Контрольная сумма не прошла
}
.......
return 1;
}
Вот считалка контрольной суммы. Функция - табличная.
Код
uint16 CRC16(uint8 *data, uint16 len) {
uint16 crc = 0xFFFF;
while (len--)
crc = (crc << 8) ^ Crc16Table[(crc >> 8) ^ *data++];
return crc;
}
В общем если кто может сказать почему у меня возникли проблемы при обработки динамич. массивов - заранее огромное спасибо!!!
P.S. Контроллер: AT90USB162, у него RAM 512 байт.