求助帖~~~~~~~~ 我的需求是这样的,一直不停的往串口丢数据,然后可以全部回显,丢的数据是很长很长的字符串(其实无限长,这里可以以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\r\n"); } 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一样。
谢谢,版主真的很热心
不过请问一下,
外部发送时什么意思?