当前位置:首页 > 单片机 > 单片机
[导读]1.介绍的串口部分会有如下优缺点:优点:简单,适合很少量数据传输。(只要求这个优点,其实本可以不用串口中断,但是为了知道来龙去脉,避免串口故弄玄虚,故加入中断进行串口发送的分析。)缺点:无缓存区,并且对

1.介绍的串口部分会有如下优缺点:

优点:简单,适合很少量数据传输。(只要求这个优点,其实本可以不用串口中断,但是为了知道来龙去脉,避免串口故弄玄虚,故加入中断进行串口发送的分析。)

缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失。

2.了解一些基础知识:

TXE=1代表发送数据寄存器空。

TC=1代表移位寄存器传输完成。

TXEIE允许在TXE标志为'1'时产生中断

TCIE允许在TC标志为'1'时产生中断

画个图介绍数据传输:

串口发送数据

3.采用判断TC的方式进行串口中断发送字符串.a.首先按照官网上的配置进行(这么晚了,码字太难了,直接上手写版)

?官网配置

配置完了就得使能TC:

USART_ITCongfig(USART1,USART_IT_TC,ENABLE);

注意:此时使能了TC,在上述第6步里面会有 发送空闲帧的步骤。发送完毕,要是不加个清除TC标志的程序,可能会丢失第1个字节的数据,所以我们加上。

DelayMs(10);

USART_ClearFlag(USART1,USART_FLAG_TC);

注意:加完了还是会出现错误,空闲帧没发完,就清零发送完成标志,导致使能TC之后就开始进入中断,故中间还加个延时,如上。

2.发送数据函数

voidUSART_SendDataString(u8*pData)

{ pDataByte=pData;

USART_ClearFlag(USART1,USART_FLAG_TC);//作用和上面一样,清除传输完成标志位,否则可能会丢失第1个字节的数据.

USART_SendData(USART1,*(pDataByte++));//必须要++,不然会把第一个字符t发送两次}

3.中断处理函数

voidUSART1_IRQHandler(void){

if(USART_GetITStatus(USART1,USART_IT_TC)==SET)

{if(*pDataByte=='')//待发送的字节发到末尾NULL了

USART_ClearFlag(USART1,USART_FLAG_TC);//不然TC一直是set,TCIE也是打开的,导致会不停进入中断.clear掉即可,不用关掉TCIE

else

USART_SendData(USART1,*pDataByte++)//我觉得此句为多余

}}

发送完字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC==SET导致反复进入中断了。

最后一定得注意,无论在哪里配置:

USART_ITCongfig(USART1,USART_IT_TC,ENABLE);

都不能立即跟上一个清除TC标志位函数。。。。否者,结果如上。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭