Я принимаю пакеты данных из очереди
Код
check_queue = FRTOS1_xQueueReceive(Global_Queue_Handle, <_rec_buff, 0);
if(check_queue)
{
memcpy(queue_buff, lt_rec_buff, 13);
}
И на основе принятых данных строю запись.
Код
qRxBuffer[0] = 0x55;
qRxBuffer[1] = queue_buff[0];
qRxBuffer[2] = queue_buff[1];
qRxBuffer[3] = time.Day;
qRxBuffer[4] = time.Month;
qRxBuffer[5] = time.Year;
qRxBuffer[6] = time.Hour;
qRxBuffer[7] = time.Minute;
qRxBuffer[8] = time.Second;
temp.all = globalSysTimer & 0xFFFFFFFF;
qRxBuffer[9] = temp.nByte[0];
qRxBuffer[10] = temp.nByte[1];
qRxBuffer[11] = temp.nByte[2];
qRxBuffer[12] = temp.nByte[3];
qRxBuffer[13] = queue_buff[4]; //DLC
qRxBuffer[14] = queue_buff[5]; //BYTE 0
qRxBuffer[15] = queue_buff[6]; //BYTE 1
qRxBuffer[16] = queue_buff[7]; //BYTE 2
qRxBuffer[17] = queue_buff[8]; //BYTE 3
qRxBuffer[18] = queue_buff[9]; //BYTE 4
qRxBuffer[19] = queue_buff[10]; //BYTE 5
qRxBuffer[20] = queue_buff[11]; //BYTE 6
qRxBuffer[21] = queue_buff[12]; //BYTE 7
calcRes.all = UTL_CRC_srvCalculate_CRC16_CCITT(qRxBuffer, 22);
qRxBuffer[22] = calcRes.nByte[0];
qRxBuffer[23] = calcRes.nByte[1];
Для проверки записи я вывожу ее на терминал
Код
for (g_idx = 0; g_idx < 24; g_idx++)
{
send_hex_num16_uart0(qRxBuffer[g_idx]);
send_msg_uart0(" ", 1);
}
send_msg_uart0("\r", 1);
Вижу правильные записи. Послал 20 получил 20 - все красиво.
Каждую запись я добавляю в массив размером 4096 байт. И когда массив полный - вывожу его на терминал
Код
//check if there is enough space for the message
if ( (4096 - data_index) >= sizeof(qRxBuffer) )
{
memcpy(&log_data[data_index], qRxBuffer, sizeof(qRxBuffer));
data_index += sizeof(qRxBuffer);
}
else //the page is full
{
data_index = 0;
for (g_idx = 0; g_idx < 4096; g_idx++)
{
if (&log_data[g_idx] == 0x55)
send_msg_uart0("\r", 1);
send_hex_num16_uart0(&log_data[g_idx]);
send_msg_uart0(" ", 1);
}
}
И что я вижу? Битые записи! Вот например
Код
55 5 0 0 0 0 0 0 0 19 7B 9 0 7 1 9F 80 2E 80 0 0 0 A6 19
55 4 0 0 0 0 0 0 0 2C 7B 9 0 3 1 B B8 0 0 1 B B8 1A 83
55 5 0 0 0 0 0 0 0 2D 7B 9 0 7 1 9F 80 2E 80 0 0 0 D7 27
55 4 0 0 0 0 0 0 0 40 7B 9 0 3 1 B B8 0 0 1 B B8
55 FA
55 5 0 0 0 0 0 0 0 41 7B 9 0 7 1 9F 80 2E 80 0 0 0 98 5E
55 4 0 0 0 0 0 0 0
55 7B 9 0 3 1 B B8 0 0 1 B B8 2F AC
55 5 0 0 0 0 0 0 0 56 7B 9 0 7 1 9F 80 2E 80 0 0 0 24 82
55 4 0 0 0 0 0 0 0 69 7B 9 0 3 1 B B8 0 0 1 B B8 4 99
55 5 0 0 0 0 0 0 0 6A 7B 9 0 7 1 9F 80 2E 80 0 0 0 F B7
55 4 0 0 0 0 0 0 0 7D 7B 9 0 3 1 B B8 0 0 1 B B8 1D 8A
Причем битые записи могут быть в разных местах при одной и той же посылке данных.
Как? Как записи могли не прописаться в массив в РАМ?
Сообщение отредактировал Jenya7 - Jul 16 2018, 06:43