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;
我贴出源程序。
注意一点是: 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;
相关文章推荐
- STM32串口中断接收方式详细比较
- STM8S003F使用IO口模拟串口(三)使用中断方式发送和接收数据
- 数据报的接收过程详解---从网卡到L3层(非NAPI,即接收数据采用中断方式)
- 数据报的接收过程详解---从网卡到L3层(非NAPI,即接收数据采用中断方式)
- STM32串口中断接收方式详细比较
- C51 队列 方式 中断接收 查询发送
- STM32 I2C从机发送数据_中断方式
- STM32串口中断方式接收
- stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
- STM32的USART1用DMA方式发送与接收
- Stm32RS232串口通信——中断接收发送数据
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- STM32串口中断接收方式详细比较
- STM32串口中断接收和中断发送
- 采用API方式发送,接收短信(嘉信)
- STM32 USART DMA发送 中断接收
- 采用中断方式的数据接收
- STM32使用串口IDLE中断的两种接收不定长数据的方式
- STM32串口中断方式接收
- STM32串口中断接收方式详细比较