도와주세요!!
글 수 15,339
2013.11.06 15:58:11 (*.103.3.9)
19469
시리얼로 데이터를 보내다가 처음 부분만 이상하게 문제가 생겨서
루프백 프로그래밍을 해봤습니다.
구성은 아래와 같습니다.
1. 하이퍼터미널에서 값을 입력합니다.
2. 이때 UART IRQ handler를 동작하여 Queue(이하 Q)를 보내줍니다. QsndFromISR
3. 실시간으로 계속 돌고있는 태스크가 Q 메세지가 있는지 확인합니다.
4.Q가 들어오면 Q rcv로 받습니다.
5. Q 데이터를 바로 다시 시리얼 Tx로 보내줍니다.
이렇게 했는데
아래와 같은 결과가 나옵니다.
@하이퍼 터미널 타이핑 순서 : 1~9 까지 차례대로
123456789
#결과
12132435465768798
하아.. 이래서 처음에 이상하게 된거군요... 맨 처음을 먹네요...
제가 바라는건
112233445566778899
이런식으로 나오는건데 처음 한번을 먹어 버리고 한글자씩 밀려버리네요.
어떻게 해결해야 하나요? 이걸 해결해서 그대로 로직에 다시 적용하면 될거 같은데... 조금만 도와주시면 감사하겠습니다.
아래는 추가로 제가 적용시켜본 소스입니다.
void UART2_IRQHandler( void )
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
signed char cChar;
while( UART2->RIS & mainRXRIS )
{
/* The interrupt was caused by a character being received. Grab the
character from the DR and place it in the queue of received
characters. */
cChar = UART2->DR;
xQueueSendFromISR( xRxUART2Chars, &cChar, &xHigherPriorityTaskWoken );
}
/* If a task was woken by either a character being received or a character
being transmitted then we may need to switch to another task. */
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
signed portBASE_TYPE xRxU2Char( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
{
/* The port handle is not required as this driver only supports one port. */
/* Get the next character from the buffer. Return false if no characters
are available, or arrive before xBlockTime expires. */
if( xQueueReceive( xRxUART2Chars, pcRxedChar, xBlockTime ) )
{
return pdTRUE;
}
else
{
return pdFALSE;
}
}
/*-----------------------------------------------------------*/
void xTxU2Char( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
{
(void) pxPort;
while(1)if(!((UART2->FR)&0x20))break; UART2->DR = cOutChar;
}
/* The receive task as described at the top of the file. */
static portTASK_FUNCTION_PROTO( vComLBTask, pvParameters );
/*-----------------------------------------------------------*/
void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority)
{
xTaskCreate( vComLBTask, ( signed char * ) "COMLoopBack", comSTACK_SIZE, NULL, uxPriority, ( xTaskHandle * ) NULL );
}
/*-----------------------------------------------------------*/
static portTASK_FUNCTION( vComLBTask, pvParameters )
{
signed char svString;
/* Just to stop compiler warnings. */
( void ) pvParameters;
for( ;; )
{
while (uxQueueMessagesWaiting(xRxUART2Chars) )
{
xRxU2Char(xPort,&svString, 0);
xTxU2Char(xPort,svString, 0);
}
vTaskDelay(10);
}
}