OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4145|回复: 1

关于UART接收位数判断

[复制链接]

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-7-16
在线时间
10 小时
发表于 2019-2-14 22:22:46 | 显示全部楼层 |阅读模式
5金钱
程序如下,在中断服务函数中定义变量记录接收的数据位数,该变量为什么只能定义为char型,定义为int型数据接收错误
#include <reg52.h>

sbit PIN_RXD = P3^0;                                //接收           空闲为高电平
sbit PIN_TXD = P3^1;                                //发送           空闲为高电平

bit RxdEnd = 0;                                                //接收完成标志位        1:接收完成
bit TxdEnd = 0;                                                //发送完成标志位        1:发送完成
bit RxdOrTxd = 0;                                        //1:发送模式  0:接收模式

unsigned char RxdBuf = 0;                        //接收缓冲区
unsigned char TxdBuf = 0;                        //发送缓冲区

void UARTConfig(unsigned int baud);
void StartRxd(void);
void StartTxd(unsigned char Data);

int main()
{
        EA = 1;                                                          //开总中断
        UARTConfig(9600);
        while(1)
        {
                while(PIN_RXD);
                StartRxd();
                while(!RxdEnd);
                StartTxd(RxdBuf+1);
                while(!TxdEnd);
        }
        return 0;
}
void UARTConfig(unsigned int baud)
{
        TMOD &= 0xF0;                                        //清除T0配置
        TMOD |= 0x02;                                        //T0模式2:自动重装载模式
        TH0 = 256 - 11059200/12/baud;        //自动重装载的值为TH0中的数值
}

void StartRxd(void)
{
        TL0 = 256- (256 - TH0)/2;                       
        ET0 = 1;                                                //T0溢出中断允许
        TR0 = 1;                                                //启动定时器0
        RxdEnd = 0;
        RxdOrTxd = 0;
}

void  StartTXD(unsigned char dat)
{
        TxdBuf = dat;
        TL0 = TH0;
        ET0 = 1;
        TR0 = 1;
        PIN_TXD = 0;
        TxdEnd = 0;
        RxdOrTxd = 1;
}

void InterruptTimer0() interrupt 1
{
        static unsigned char cnt = 0;                //该处只能用字符型数据,不能使用整形数据,否则接收数据错误
//      static unsigned int   cnt = 0;
        if(RxdOrTxd)                                                //发送8位数据
        {

                cnt++;
                if(cnt<=8)
                {
                        PIN_TXD = TxdBuf & 0x01;
                        TxdBuf >>=1;
                }
                else if(cnt == 9)                                //发送停止位
                {
                        PIN_TXD = 1;
                }
                else                                                        //一帧数据发送完成
                {
                        cnt = 0;
                        TR0 = 0;
                        TxdEnd = 1;
                }
        }
        else
        {
                if(cnt == 0)
                {
                        if(!PIN_RXD)                                //接收到开始位
                        {
                                RxdBuf = 0;
                                cnt++;
                        }
                        else
                        {
                                TR0 = 0;                                //错误中断或干扰
                        }
                }
                else if(cnt<=8)                                 //接收8位数据
                {
                        RxdBuf >>=1;
                        if(PIN_RXD)
                        {
                                RxdBuf |= 0x80;
                        }
                        cnt++;
                }


                else
                {
                        cnt = 0;
                        TR0 = 0;
                        if(PIN_RXD)                                        //第九位:停止位确认接收完成
                        {
                                RxdEnd = 1;
                        }
                }
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-7-16
在线时间
10 小时
 楼主| 发表于 2019-2-14 22:28:31 | 显示全部楼层
如果我把cnt定义成int型变量,用串口助手调试,发送0x03,接收到的是0x81,如果定义成char型的,这种情况就不会发生
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 15:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表