[51单片机]

关于串口通讯数据移位的问题

[复制链接]
3420|20
手机看帖
扫描二维码
随时随地手机跟帖
ayb_ice| | 2021-6-28 08:35 | 显示全部楼层
移出的位丢掉了,不知道是1还是0

使用特权

评论回复
henangongda123| | 2021-6-28 09:46 | 显示全部楼层
51单片机串口通讯一次接收、发送的都是一个字节,8位,你这个操作应该是后面其他算法需要这样处理这个数据,正常是不需要,直接读串口数据就可以

使用特权

评论回复
happytong|  楼主 | 2021-6-28 09:54 | 显示全部楼层
henangongda123 发表于 2021-6-28 09:46
51单片机串口通讯一次接收、发送的都是一个字节,8位,你这个操作应该是后面其他算法需要这样处理这个数据 ...

是不是直接移位就可以按位发送数据了(不考虑后期处理数据)

使用特权

评论回复
happytong|  楼主 | 2021-6-28 09:57 | 显示全部楼层
ayb_ice 发表于 2021-6-28 08:35
移出的位丢掉了,不知道是1还是0

这位数据发送完了数据就不要了,不需要知道它是1还是0吧

使用特权

评论回复
ayb_ice| | 2021-6-28 10:24 | 显示全部楼层
happytong 发表于 2021-6-28 09:57
这位数据发送完了数据就不要了,不需要知道它是1还是0吧

你不与怎么知道是1还是0,C的基础而已

使用特权

评论回复
henangongda123| | 2021-6-28 10:34 | 显示全部楼层
串口通信很简单,就是写一个字节的数据到串口发送寄存器就行了,你这个与操作,是为了得到这个要发送的串口数据,跟串口通信没多大关系

使用特权

评论回复
happytong|  楼主 | 2021-6-28 10:37 | 显示全部楼层
ayb_ice 发表于 2021-6-28 10:24
你不与怎么知道是1还是0,C的基础而已

例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这个数字就行,操作员没有必要知道吧?

使用特权

评论回复
happytong|  楼主 | 2021-6-28 10:39 | 显示全部楼层
henangongda123 发表于 2021-6-28 10:34
串口通信很简单,就是写一个字节的数据到串口发送寄存器就行了,你这个与操作,是为了得到这个要发送的串口 ...

那么我为什么要得到这个发送的串口数据,如果不考虑后期的操作,是不是不要与,直接发送

使用特权

评论回复
ayb_ice| | 2021-6-28 10:41 | 显示全部楼层
happytong 发表于 2021-6-28 10:37
例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这 ...

硬件的是不需要,模拟的需要

使用特权

评论回复
henangongda123| | 2021-6-28 10:44 | 显示全部楼层
happytong 发表于 2021-6-28 10:37
例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这 ...

刚才那个网友说的对,要看你是用什么串口通信,单片机自己硬件UART,是不需要这些位操作的,软件模拟UART的话,发送、接收都需要

使用特权

评论回复
happytong|  楼主 | 2021-6-28 10:54 | 显示全部楼层
henangongda123 发表于 2021-6-28 10:44
刚才那个网友说的对,要看你是用什么串口通信,单片机自己硬件UART,是不需要这些位操作的,软件模拟UART ...

大神 我这么理解不知对不对: 例如我要发送数据到满足RS232的设备 我可以不用位与,发送到不满足RS232的设备,需要位与,如果对的话,发送到不满足RS232的设备时的位与操作起什么作用?

使用特权

评论回复
henangongda123| | 2021-6-28 10:58 | 显示全部楼层
happytong 发表于 2021-6-28 10:54
大神 我这么理解不知对不对: 例如我要发送数据到满足RS232的设备 我可以不用位与,发送到不满足RS232的 ...

无语!位操作跟RS232有啥关系?不是说了,跟你单片机用硬件自带的UART还是软件模拟UART有关系,你这样问的话,真的比小白还要白了。。。

使用特权

评论回复
henangongda123| | 2021-6-28 10:59 | 显示全部楼层
我找一段串口通信的程序给你看,单片机自带硬件UART,现在的单片机基本上都带硬件UART,有的单片机还带好几个

使用特权

评论回复
happytong|  楼主 | 2021-6-28 11:03 | 显示全部楼层
henangongda123 发表于 2021-6-28 10:59
我找一段串口通信的程序给你看,单片机自带硬件UART,现在的单片机基本上都带硬件UART,有的单片机还带好几 ...

既然单片机基本上都带硬件UART,那就是说可以不用位与操作了

使用特权

评论回复
henangongda123| | 2021-6-28 11:04 | 显示全部楼层
            /********* UART1串口操作 **********/
/***********************************************************
函数名:UART1_Init()
功  能:串口1初始化
参  数:无
返回值:无
/**********************************************************/
void UART1_Init(void)
{
        IP |= 0x10;                 //PS=1
        IPH |= 0x10;                //PSH=1
        //设置串口中断优先级为最高3级
        P_SW1 |= 0x40;              //串口1引脚切换到P3.6,P3.7
        SCON |= 0x50;               //串口1选择模式1(8位数据位,可变波特率),使能UART1接收
        T2L = BRT;
        T2H = BRT>>8;               //设置T2定时器波特率为9600(主频12MHz)
        AUXR = 0x15;                //选择T2定时器作为波特率发射器,并开启T2定时器(1T模式)
        ES = 1;                     //使能UART1接收/发送中断
        EA = 1;                     //使能全局中断
}
/***********************************************************
函数名:UART1_Send_Byte()
功  能:串口1发送一字节数据
参  数:byte --- 串口1欲发送的一字节数据内容
返回值:无
/**********************************************************/
void UART1_Send_Byte(uchar byte)
{
        while(Uart1_Send_Busy);     //等待前面的数据发送完成
        Uart1_Send_Busy = 1;        //置位串口1发送数据忙标志位,准备发送数据
        SBUF = byte;                //加载一字节数据内容
}
看下这端代码,先初始化硬件UART,就是设置好串口通信的波特率、数据位、停止位、中断优先级等等参数,然后就是发送一个字节的数据,SBUF寄存器是硬件UART的发送/接收寄存器,你往这个寄存器写入一字节数据,它自动就把这个字节的数据按照设定的波特率、停止位发送出去了,发送完了产生一个标志位,你再读取或者响应中断就行了。

使用特权

评论回复
henangongda123| | 2021-6-28 11:04 | 显示全部楼层
happytong 发表于 2021-6-28 11:03
既然单片机基本上都带硬件UART,那就是说可以不用位与操作了

是的,硬件UART不用位操作,看我贴的代码

使用特权

评论回复
happytong|  楼主 | 2021-6-28 11:07 | 显示全部楼层
henangongda123 发表于 2021-6-28 11:04
是的,硬件UART不用位操作,看我贴的代码

已看,程序中没用位与,我在学习过程中发现很多网上交的要位与,位与后也没有其他操作,我就好奇为什么要位与

使用特权

评论回复
henangongda123| | 2021-6-28 11:10 | 显示全部楼层
happytong 发表于 2021-6-28 11:07
已看,程序中没用位与,我在学习过程中发现很多网上交的要位与,位与后也没有其他操作,我就好奇为什么要 ...

这哪个教程教的?误人子弟?你先要搞清楚是硬件UART还是软件模拟UART

使用特权

评论回复
LcwSwust| | 2021-6-28 11:13 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-6-28 11:15 编辑

51单片机串口,波特率等参数配置好,然后对SBUF赋值即可。
如:
SBUF=x;//发送
while(TI==0);//等待发送标志
TI=0;//清发送标志

使用特权

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

本版积分规则

17

主题

40

帖子

0

粉丝