Я работаю над проектом, в котором мне нужно связаться с микроконтроллером AVR с устройством RS232 через UART и преобразователь уровня TTL. Я использую последовательный обратный вызов для получения символов из последовательного порта и проверяю наличие возврата каретки / новой строки, а затем также проверяю самый последний символ в буфере для возврата каретки / новой строки. Данные от устройства rs232 поступают в формате 26 строк, разделенных символом возврата каретки и перевода строки, состоящего из символов ASCII. Все 26 строк отправляются примерно каждые 0,7 секунды. Я пытаюсь заполнить 2D-массив 26 строками. Однако теперь я получаю то, что должен, в приемном буфере. Вот мой код:
volatile uint8_t rxrs_buffer[26][12] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
static void serialrs_rx_cb(const struct usart_async_descriptor *const io_descriptor)
{
//counters
uint8_t ch, count;
//read a character
count = io_read(&SERIALRS232.io, &ch, 1);
//check if we are receiving
if (serialrs_receiving == 0)
{
//check for new line or carriage return
if (ch != 10 && ch != 13)
{
if (rxrs_buffer[row-1][column-1] != 10 && rxrs_buffer[row-1][column-1] != 13)
{ //set receiving flag
serialrs_receiving = 1;
//reset byte counter
serialrs_bytes_received_counter = 0;
//start filling the rx buffer
rxrs_buffer[row][column] = ch;
//increment the byte counter and column
serialrs_bytes_received_counter += count;
column++;
}
}
}
else
{
//continue filling the buffer
rxrs_buffer[row][column] = ch;
//increment the byte counter and column
serialrs_bytes_received_counter += count;
column++;
//check for new line or carriage return
if (ch == 10 || ch == 13)
{
if (rxrs_buffer[row-1][column-1] != 10 && rxrs_buffer[row-1][column-1] != 13)
{
//continue filling the buffer
rxrs_buffer[row][column] = ch;
//increment the byte counter
serialrs_bytes_received_counter += count;
//increment the line counter and reset column
row++;
column = 0;
if (row == 26)
{
//set the completion flag
serialrs_complete = 1;
//total bytes
totalrs_bytes = serialrs_bytes_received_counter - 2;
row = 0;
}
}
}
//check for buffer overflow
if (serialrs_bytes_received_counter >= SERIALRS_BUFFER_SIZE)
{
//reset buffer counter
serialrs_bytes_received_counter = 0;
}
}
}
Проблема в том, что мой 2D-буферный массив не заполняется правильно. Я получаю строки, которые начинаются с двух переводов строки, затем некоторые, которые работают идеально и заканчиваются переводом строки возврата каретки, только чтобы обнаружить, что следующая строка начинается с двух символов возврата каретки или перевода строки? Любые предложения помогут