你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[有代码]串口的echo很长的字符串有什么好办法吗?

[复制链接]
beary 提问时间:2015-11-23 17:21 /
求助帖~~~~~~~~

我的需求是这样的,一直不停的往串口丢数据,然后可以全部回显,丢的数据是很长很长的字符串(其实无限长,这里可以以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;
                                }


收藏 评论7 发布时间:2015-11-23 17:21

举报

7个回答
beary 回答时间:2015-11-23 20:05:24
自顶一下
党国特派员 回答时间:2015-11-24 15:57:17
串口通讯 本来就是不能保证数据不会丢失。
要想数据不丢失,还是得自己定协议,像TCP一样。
小小费 回答时间:2015-11-24 16:11:13
这么长,那就用分段,用协议处理
回答时间:2015-11-24 16:34:09
不要在中断中发数据。写入缓冲区,外部发送。
beary 回答时间:2015-11-24 20:45:12
安 发表于 2015-11-24 16:34
不要在中断中发数据。写入缓冲区,外部发送。

谢谢,版主真的很热心

不过请问一下,
外部发送时什么意思?
回答时间:2015-11-25 10:30:01
把数据放入到缓冲区,在中断外部进行发送。比如在main里面发送。
回答时间:2015-11-25 10:30:07
把数据放入到缓冲区,在中断外部进行发送。比如在main里面发送。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版