求助帖~~~~~~~~
我的需求是这样的,一直不停的往串口丢数据,然后可以全部回显,丢的数据是很长很长的字符串(其实无限长,这里可以以1K为目标先)(是为了蓝牙
通信,不过现在串口这边就掉数据了,丢到蓝牙就更会掉数据了)
我现在就是用freeRTOS,串口中断使用RXNE的方式接收,然后接收到的东西发送到一个队列里,如果队列满300个或者不发了就echo出来
现在碰到的问题就是,
打印一两百个有时候会丢一两个包
打印三个 四百个有时候多丢几次数据到串口之后,串口就死了,
代码如下
/****************************************************************************/
/* UART interrupt ,发送字符到队列中 ,主要是为了同时收发,不然buff再大也会被填满 */
/****************************************************************************/
void USART1_IRQHandler(void)
{
portBASE_TYPE TaskWoken = pdFALSE;
if (USART_Ge
tiTStatus(USART1, USART_IT_RXNE) == SET)
{
unsigned char RxChar;
RxChar = USART_ReceiveData(USART1);
//收到的数据发送到 task1 的一个队列中
xQueueSendFromISR(gattdQueueHandleUartRx, &RxChar, &TaskWoken);
}
portEND_SWITCHING_ISR(TaskWoken);
}
/****************************************************************************/
/* RECEIVCE TASK 这里是task1, 接收到数据以后再发到task2的另外一个队列中 */
/****************************************************************************/
while (xQueueReceive(gattdQueueHandleUartRx, &RxChar, 0) == pdPASS)
{
i++;
if(xQueueSend(myQueue, &RxChar,portTICK_RATE_MS * 1000) == errQUEUE_FULL)
{
printf("myQueue is full
");
}
if(i == 300)
{//如果满了300个就发送到另外一个队列
xQueueSend(gattdQueueHandleEvent,&Event, portTICK_RATE_MS);
vTaskResume( mySendTaskHandle );
i = 0;
}
}
{//如果从中断接收完了以后,不满300个,还是发出去
xQueueSend(gattdQueueHandleEvent,&Event, portTICK_RATE_MS);
vTaskResume( mySendTaskHandle );
i = 0;
}
/****************************************************************************/
/* MySend Task ,这里是task2,这里是另外一个队列接收,接收了以后打印 */
/****************************************************************************/
while (xQueueReceive(myQueue, &TxChar, portTICK_RATE_MS ) == pdPASS)
{
printf("%c",TxChar);
rcv[count] = TxChar;
count++;
if(count == 300)
{
MyOwnWrite(&GATTDemo,rcv,count);
memset(rcv,0,count);
count = 0;
temp = 0;
}
}
{//接收完成不满300个的话就打印出来
MyOwnWrite(&GATTDemo,rcv,count);
memset(rcv,0,count);
count = 0;
temp = 0;
}
要想数据不丢失,还是得自己定协议,像TCP一样。
一周热门 更多>