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

[有代码]串口的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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版