完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
求助帖~~~~~~~~
我的需求是这样的,一直不停的往串口丢数据,然后可以全部回显,丢的数据是很长很长的字符串(其实无限长,这里可以以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 fullrn"); } 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; } |
|
相关推荐
7个回答
|
|
自顶一下
|
|
|
|
|
|
|
|
这么长,那就用分段,用协议处理
|
|
|
|
不要在中断中发数据。写入缓冲区,外部发送。
|
|
|
|
|
|
|
|
把数据放入到缓冲区,在中断外部进行发送。比如在main里面发送。
|
|
|
|
把数据放入到缓冲区,在中断外部进行发送。比如在main里面发送。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1786 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1657 浏览 3 评论
4216 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1805 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2291 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 09:07 , Processed in 0.823923 second(s), Total 84, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号