本帖最后由 SD10A 于 2015-1-7 21:29 编辑
MEGA16 手册第152页
说出现校验错误的时候,UPE将会置位,这一位一直有效直到接受缓冲器(UDR)被读取。
那是等被读取就好了?错误就没有了?
对于楼下的回答我做了一些修改,就是红色字体部分,就是请求重新发送不知道怎么操作了?
请各位大侠帮忙补充完整的工业程序
对于侦错误 和 数据溢出错误是不是也和校验错误一样处理?
#include "iom16v.h"
#include "macros.h"
//波特率,晶振
#define BAUD 19200
#define FXTAL 12000000
//串口接收完毕中断触发声明
#pragma interrupt_handler USART_Received_Ir:12
//变量定义:接收缓冲变量,接收标志位
unsigned char RX_Buffer=0x00,RX_Flag=0;
//函数声明
void USART_Send(unsigned char);
//串口IO初始化函数
void USART_IO_Init()
{
DDRD|=BIT(PD1); //PD1:TX为输出状态
}
//串口初始化函数
void USART_Init()
{
unsigned int Temp;
USART_IO_Init(); //串口IO初始化函数调用
UCSRA=0x00; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0)|BIT(UPM1); //选择USCRC,异步操作,一个奇偶检验位,1个停止位,八位数据
Temp=(FXTAL/BAUD/16)-1; //求出9600波特率的赋值
UBRRH=((Temp>>8)&0x00ff); //波特率寄存器高八位赋值
UBRRL=(Temp&0x00ff); //波特率寄存器低八位赋值
//UBRR=71; //从手册中直接取得赋值,9600kbps
UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE); //发送使能,接收使能,接收完毕中断使能
SREG|=BIT(7); //全局中断使能
}
//主函数
void main()
{
USART_Init();
while(1)
{
if(RX_Flag)
{
RX_Flag=0;
USART_Send(RX_Buffer);
}
}
}
//串口发送函数
void USART_Send(unsigned char Data)
{
while(!(UCSRA&(BIT(UDRE)))); //数据寄存器UDR是否为空?
UDR=Data; //UDR赋值
while(!(UCSRA&(BIT(TXC)))); //数据是否已经发送完毕?
UCSRA|=BIT(TXC); //清除发送完毕标志位
}
//串口接收完毕中断函数
void USART_Received_Ir()
{
UCSRB&=~BIT(RXCIE); //接收完毕中断不使能
if(UCSRA|BIT(PE))//如果有奇偶校验错误出现(PE置位) 这里UCSRA之前全部设置为0,所以用或的关系
{
UCSRA|=BIT(UDRE);//清空数据寄存器
//请求重新发送?这怎么操作?
}
RX_Buffer=UDR; //读取UDR的数据
RX_Flag=1; //接收标志位置一
UCSRB|=BIT(RXCIE); //接收完毕中断使能
}
|