请问串口的echo很长的字符串有什么好办法吗?

2019-07-14 16:51发布

求助帖~~~~~~~~

我的需求是这样的,一直不停的往串口丢数据,然后可以全部回显,丢的数据是很长很长的字符串(其实无限长,这里可以以1K为目标先)(是为了蓝牙通信,不过现在串口这边就掉数据了,丢到蓝牙就更会掉数据了)

我现在就是用freeRTOS,串口中断使用RXNE的方式接收,然后接收到的东西发送到一个队列里,如果队列满300个或者不发了就echo出来

现在碰到的问题就是,
打印一两百个有时候会丢一两个包

打印三个 四百个有时候多丢几次数据到串口之后,串口就死了,
代码如下

/****************************************************************************/
/* UART interrupt        ,发送字符到队列中        ,主要是为了同时收发,不然buff再大也会被填满                */
/****************************************************************************/
void USART1_IRQHandler(void)
{
  portBASE_TYPE TaskWoken = pdFALSE;
  if (USART_GetiTStatus(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;
                                }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。