Для буферизации данных, которые будут асинхронно считываться в каком-либо другом контексте (между ISR и «нормальным» потоком, как в этом случае, вы должны использовать FIFO или кольцевой буфер, чтобы ISR мог продолжать запись в буферв то время как обычный поток читает и обрабатывает его. Например, с учетом:
#include <stdint.h>
#include <stdatomic.h>
#define BUFFLEN ((uint8_t)128u) // Must be a power of 2
#define BUFFMODMASK ((uint8_t)(BUFFLEN - 1)) // modulo BUFFLEN mask
typedef volatile struct
{
uint8_t write_idx ;
uint8_t read_idx ;
atomic_int count ;
uint8_t data[BUFFLEN] ;
} tRingBuf ;
void ringBufPut( tRingBuf* buffer, uint8_t ch )
{
if( buffer->count < BUFFLEN )
{
buffer->data[buffer->write_idx++] = ch ;
buffer->write_idx &= BUFFMODMASK ;
buffer->count++ ;
}
}
int ringBufGet( tRingBuf* buffer )
{
int ch = -1 ;
if( buffer->count > 0 )
{
ch = (int)buffer->data[buffer->read_idx++] ;
buffer->read_idx &= BUFFMODMASK ;
buffer->count-- ;
}
return ch ;
}
tRingBuf UART1RxBuffer = { 0, 0, 0, {0} } ;
Ваш ISR затем поместит данные в буфер таким образом:
ringBufPut( &UART1RxBuffer, LPC_UART1->RBR ) ;
Тогда ваш основной поток может прочитатьданные, таким образом:
for( int i = 0; i < size_int; i++ )
{
int ch = ringBufGet( &UART1RxBuffer ) ;
if( ch > 0 )
{
uint8_t byte = (uint8_t)ch ;
// ... do something with the data here
// For example...
UART2_Printf( "%02X", (unsigned)byte ) ;
}
}
Вы, возможно, преуспели бы, если бы реализовали UART Tx таким же образом (полностью изменяя пут / получи) для всех UART - ваш ISR в настоящее время имеет дело только с Rx. Полностью буферизованный I /O приведет к более детерминированному выбору времени.