您的位置:首页 > 其它

STM32串行通讯采用中断方式发送,接收

2013-12-10 20:08 357 查看
近期发现很多人都不愿意用中断方式,来使用STM32的串口。说是问题多。但自己测试了,中断没有任何问题。无论接收和发送。

我贴出源程序。

注意一点是: USART_ITConfig(USART3, USART_IT_TXE, ENABLE);

这个函数一旦执行,就会启动一次中断,正是这个原因,许多人想尽方法去避免空发送,但实际上这是设计者的智慧所在。用空中断启动发送!无需在执行:SART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!

一旦启动了中断,就在中断程序里继续发送。

发送初始化程序:将要发送的数据准备好,放在一个BUF里:

COM3_EN(SEND_EN);//485的EN脚

UART3_Buf.sPoint=0;

UART3_Buf.sOK=SEND_NOW; //状态机

UART3_Buf.sLong=Long; //数据长度

memcpy(UART3_Buf.SendBuf,p,Long); //数据转移!

USART_ITConfig(USART3, USART_IT_TXE, ENABLE);

中断程序:

void Uart3_Do(void){

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){

//*********************************************************

UART3_Buf.rOK=RECE_NOW; //接收....

//*********************************************************

UART3_Buf.RsDelay=3; //RS_DELAYK; //复位计时器!

//*********************************************************

UART3_Buf.ReceBuf[UART3_Buf.rPoint++]=(unsigned char)USART_ReceiveData(USART3);

//*********************************************************

if(UART3_Buf.rPoint >= sizeof(UART3_Buf.ReceBuf)){

UART3_Buf.rPoint=0;

UART3_Buf.rOK=RECE_OVER; //接收完毕

//USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);

}

}

//*******************************************************************

if ( USART_GetITStatus(USART3, USART_IT_TXE ) != RESET){

if (UART3_Buf.sPoint >= UART3_Buf.sLong){ //采用1个字节一个页发送!

USART_ITConfig(USART3, USART_IT_TXE, DISABLE);

UART3_Buf.sOK=SEND_OVER; //发送完毕

UART_ReceStart(COM3_PC,sizeof(UART3_Buf.ReceBuf)); //停止发送,允许接收中断!

}else{

USART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!

}

}

}

。。。。

数据结构:

typedef struct{

volatile unsigned short rPoint; //接收指针个数

volatile unsigned short sPoint; //发送指针个数

volatile unsigned short rLong; //接收长度

volatile unsigned short sLong; //发送长度

volatile unsigned short RsDelay; //通讯采用延时接收!

unsigned char SendBuf[250];

unsigned char ReceBuf[250];

volatile unsigned char rOK; //接收标志!

volatile unsigned char sOK; //发送标志!

}UART_DATA;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: