Задача: по юсарт2 идут данные с темпом 1 сек, но разного объёма, типа:
Код
$GPRMC,074038.00,A,4912.3940,N,03151.9618,E,00.00,314.7,190314,,,A*59
$GPGSV,4,1,14,01,39,183,24,04,20,314,00,11,12,181,00,13,27,237,29*7F
$GPGSV,4,2,14,17,17,275,01,20,86,111,18,23,63,242,45,25,05,022,00*7C
$GPGSV,4,3,14,31,39,059,00,32,44,102,00,33,18,235,00,37,33,193,00*7F
$GPGSV,4,4,14,39,33,189,00,40,29,150,00*7D
эти данные нужно обрабатывать и выдавать в юсарт3.
Как задумывалось решение:
Настраиваю аппаратный таймер (ТИМ2) на длительность передачи одного байта при скорости 115200. В прерывании юсарт2 принятые байты складываю в массив и обнуляю ТИМ2:
Код
if( USART_GetITStatus( USART2, USART_IT_RXNE ) == SET )
{
cChar = USART_ReceiveData( USART2 );
if ((USART2_Idx == USART2_SIZE-1) || (cChar == '$'))
{
USART2_Idx = 0;
}
USART2_Buf[USART2_Idx] = cChar;
USART2_Idx++;
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2, ENABLE);
}
В прерывании ТИМ2, если он таки досчитает до конца, значит байтов больше нет, выставляю семафор:
Код
void TIM2_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Очищаем бит обрабатываемого прерывания
TIM_Cmd(TIM2, DISABLE); //выключаю таймер
xSemaphoreGiveFromISR (xSemaphore_usart2, &xHigherPriorityTaskWoken ); //семафорим задаче
}
}
Ну и сама задача:
Код
for(;; )
{
xSemaphoreTake(xSemaphore_usart2, portMAX_DELAY );
for (i=0; i<USART2_Idx; i++)
{
cChar = USART2_Buf[i];
xQueueSend( usart3_TxQueue, &cChar, xNoBlock );
}
USART2_Idx = 0;
USART_ITConfig( USART3, USART_IT_TXE, ENABLE );
}
Вопрос, что не так делаю, но выдача в юсарт3 происходит не стабильно, может в принципе построение решения не правильное? Надеюсь на конструктивное советы и пожелания