0 奇偶校验错误的解决方法(2) - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印
[AVR单片机]

奇偶校验错误的解决方法(2)

[复制链接]
1708|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SD10A|  楼主 | 2015-1-1 21:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);                //接收完毕中断使能
        }



QQ图片20150101211228.png (113.57 KB )

QQ图片20150101211228.png

相关帖子

沙发
ningling_21| | 2015-1-2 09:15 | 只看该作者
既然出现错误,读取不会使错误消失,程序肯定要处理这样的错误...

使用特权

评论回复
板凳
SD10A|  楼主 | 2015-1-2 12:21 | 只看该作者
ningling_21 发表于 2015-1-2 09:15
既然出现错误,读取不会使错误消失,程序肯定要处理这样的错误...

怎么处理呢?

使用特权

评论回复
地板
JY-DX-JY| | 2015-1-2 12:26 | 只看该作者
请求重发。

使用特权

评论回复
5
ningling_21| | 2015-1-2 13:26 | 只看该作者
SD10A 发表于 2015-1-2 12:21
怎么处理呢?

清除接收缓存区并请求重发数据...

使用特权

评论回复
6
SD10A|  楼主 | 2015-1-7 21:44 | 只看该作者
ningling_21 发表于 2015-1-2 13:26
清除接收缓存区并请求重发数据...

if(UCSRA|BIT(PE))//如果有奇偶校验错误出现(PE置位)  这里UCSRA之前全部设置为0,所以用或的关系
            {
            UCSRA|=BIT(UDRE);//清空数据寄存器
            //请求重新发送?这怎么操作?
            }

使用特权

评论回复
7
ningling_21| | 2015-1-7 22:01 | 只看该作者
SD10A 发表于 2015-1-7 21:44
if(UCSRA|BIT(PE))//如果有奇偶校验错误出现(PE置位)  这里UCSRA之前全部设置为0,所以用或的关系
    ...

这个不是固定的,与你使用的通信协议有关,如果协议需要重发时通过应答告诉对方需重发数据,不需重发时直接继续等待对方重发,等等

使用特权

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

本版积分规则

29

主题

169

帖子

4

粉丝