打印
[STM32]

请教,使用串口中断发送数据的适用场合

[复制链接]
3080|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磁轨炮|  楼主 | 2015-10-10 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我在调试串口的时候听到一个大牛说利用串口中断的方式发送数据会大大节省CPU时间,但是,我感觉在某些场合这个方法不是很好用,请大神们赐教
先说一下我的思路,我使用单片机STM32F051R8T6,为串口发送数据分配50字节的缓冲区Buffer[50],定义了三个指针分别为RR->start指向帧头,RR->stop指向帧尾,RR->point始终指向Buffer[0];根据FIFO原则,
发送函数:

void SendData(uint8_t byte)
{
        *RR->stop=byte;                         //存入缓冲区
        RR->stop++;                               //当前指针+1
        if (RR->stop>=(RR->point+50))  //已经存到Buffer[49],重新存到Buffer[0],环形嘛。。。
        {
                RR->stop=RR->point;         //循环
        }
        USART_ITConfig (USART2,USART_IT_TXE,ENABLE);    //开中断
}


中断发送函数

void USART2_IRQHandler (void)
{
        if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)   //标志位
        {
                if (RR->start!=RR->stop)                                               //缓冲区内没发送完
                {
                        USART2->TDR=*RR->start;                                  //从帧头开始发送,先出
                        RR->start++;                                                         //帧头指针+1
                        if (RR->start>=(RR->point+50))                            //循环
                        {
                                RR->start=RR->point;
                        }
                }
                else
                {
                        USART_ITConfig (USART2,USART_IT_TXE,DISABLE);       //关中断
                }
        }
}


但是这样的话,会遇到一个问题,调用SenData()的时候会一直向缓冲区内写数据(写数据几乎瞬间完成),如果来不及发送的话,缓冲区内的数据可能会被覆盖,我在9600波特率试了一下,发送一个字节差不多1ms,这样的话,如果发送50个字节在50ms内再发送别的字节,数据就可能丢了,在不能确定下次发送时间的情况,大神们有什么好的方法吗?

小弟初来咋到,分数不多,请大神们不吝赐教。

相关帖子

沙发
dirtwillfly| | 2015-10-10 10:05 | 只看该作者
加个判断,当缓冲区的数据没发送完的时候,不要继续写数据了

使用特权

评论回复
板凳
磁轨炮|  楼主 | 2015-10-10 10:06 | 只看该作者
dirtwillfly 发表于 2015-10-10 10:05
加个判断,当缓冲区的数据没发送完的时候,不要继续写数据了

那样的话就和查询发送差不多了吗?

使用特权

评论回复
地板
dirtwillfly| | 2015-10-10 10:11 | 只看该作者
磁轨** 发表于 2015-10-10 10:06
那样的话就和查询发送差不多了吗?

不会啊。看你的代码,就是写完缓冲区开串口中断发送数据,发送完数据关中断然后缓冲数据
直接设个标志位就好了

使用特权

评论回复
5
dirtwillfly| | 2015-10-10 10:22 | 只看该作者
本帖最后由 dirtwillfly 于 2015-10-10 10:24 编辑

实际上,串口没发送完一个字节,都会触发中断进入中断服务程序,从而占用cpu的时间。所以你的这个50字节的缓冲区只是形式上的缓冲区,并不是串口连续不停地发送数据的缓冲区。

使用特权

评论回复
6
磁轨炮|  楼主 | 2015-10-10 10:55 | 只看该作者
dirtwillfly 发表于 2015-10-10 10:22
实际上,串口没发送完一个字节,都会触发中断进入中断服务程序,从而占用cpu的时间。所以你的这个50字节的 ...

谢谢大神,请问您使用串口中断是怎么使用的?我感觉我的这种方式行不通

使用特权

评论回复
7
NE5532| | 2015-10-10 11:11 | 只看该作者
具体问题具体分析,不加条件说一种方法好的,绝对不是大牛,是大忽悠,或者大S&B,楼主不要上当,分析自己的应用条件才是王道。

使用特权

评论回复
8
cpu51| | 2015-10-10 12:05 | 只看该作者
在发送前,把待发送的数据准备好,存在一个数组里,然后从数组发送数据,基本上么有问题,发送时,不要做其他事情。我做过120个数据做一帧发送。

使用特权

评论回复
9
dirtwillfly| | 2015-10-10 14:10 | 只看该作者
磁轨** 发表于 2015-10-10 10:55
谢谢大神,请问您使用串口中断是怎么使用的?我感觉我的这种方式行不通 ...

用DMA

使用特权

评论回复
10
Ketose| | 2015-10-10 14:36 | 只看该作者
不占用CPU就使用DMA发送。。。

使用特权

评论回复
11
ayb_ice| | 2015-10-10 16:39 | 只看该作者
任何方法都是有利有弊的,都是有前提条件的


你可以把缓冲区设大点,波特率提到高点,但都有可能过载的,

“这样的话,如果发送50个字节在50ms内再发送别的字节,数据就可能丢了”
这个话也不对的,发完的空间又可以利用了,只是任一瞬间只是保存50字节缓冲,这样的效率是很高的

使用特权

评论回复
12
undersky| | 2015-10-11 09:44 | 只看该作者
真正想要少占用CPU时间,还是得用DMA。中断发送还是CPU将数据从内存搬移到寄存器的,而且还会打断主程序的运行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

38

帖子

0

粉丝