как читать несколько строк из серийного C, заканчивающегося возвратом каретки И переводом строки? - PullRequest
1 голос
/ 07 мая 2020

Я работаю над проектом, в котором мне нужно связаться с микроконтроллером 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-буферный массив не заполняется правильно. Я получаю строки, которые начинаются с двух переводов строки, затем некоторые, которые работают идеально и заканчиваются переводом строки возврата каретки, только чтобы обнаружить, что следующая строка начинается с двух символов возврата каретки или перевода строки? Любые предложения помогут

...