关于串口通讯数据移位的问题
有一个疑问;51单片机串口通讯时,程序都写成位与,再移位,例如(happy=0xff&0x01,然后0Xff再移位),我的疑问是既然单片机一个脉冲只读一位数据,为什么还要先位与呢,直接移位不是一样吗? 移出的位丢掉了,不知道是1还是0 51单片机串口通讯一次接收、发送的都是一个字节,8位,你这个操作应该是后面其他算法需要这样处理这个数据,正常是不需要,直接读串口数据就可以 henangongda123 发表于 2021-6-28 09:4651单片机串口通讯一次接收、发送的都是一个字节,8位,你这个操作应该是后面其他算法需要这样处理这个数据 ...
是不是直接移位就可以按位发送数据了(不考虑后期处理数据) ayb_ice 发表于 2021-6-28 08:35
移出的位丢掉了,不知道是1还是0
这位数据发送完了数据就不要了,不需要知道它是1还是0吧 happytong 发表于 2021-6-28 09:57
这位数据发送完了数据就不要了,不需要知道它是1还是0吧
你不与怎么知道是1还是0,C的基础而已 串口通信很简单,就是写一个字节的数据到串口发送寄存器就行了,你这个与操作,是为了得到这个要发送的串口数据,跟串口通信没多大关系 ayb_ice 发表于 2021-6-28 10:24
你不与怎么知道是1还是0,C的基础而已
例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这个数字就行,操作员没有必要知道吧? henangongda123 发表于 2021-6-28 10:34
串口通信很简单,就是写一个字节的数据到串口发送寄存器就行了,你这个与操作,是为了得到这个要发送的串口 ...
那么我为什么要得到这个发送的串口数据,如果不考虑后期的操作,是不是不要与,直接发送 happytong 发表于 2021-6-28 10:37
例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这 ...
硬件的是不需要,模拟的需要 happytong 发表于 2021-6-28 10:37
例如 我发数据0XFE 二进制码11111110,我把这个字节的数字放到串口上,串口按位发送过去,只要串口收到这 ...
刚才那个网友说的对,要看你是用什么串口通信,单片机自己硬件UART,是不需要这些位操作的,软件模拟UART的话,发送、接收都需要 henangongda123 发表于 2021-6-28 10:44
刚才那个网友说的对,要看你是用什么串口通信,单片机自己硬件UART,是不需要这些位操作的,软件模拟UART ...
大神 我这么理解不知对不对: 例如我要发送数据到满足RS232的设备 我可以不用位与,发送到不满足RS232的设备,需要位与,如果对的话,发送到不满足RS232的设备时的位与操作起什么作用? happytong 发表于 2021-6-28 10:54
大神 我这么理解不知对不对: 例如我要发送数据到满足RS232的设备 我可以不用位与,发送到不满足RS232的 ...
无语!位操作跟RS232有啥关系?不是说了,跟你单片机用硬件自带的UART还是软件模拟UART有关系,你这样问的话,真的比小白还要白了。。。 我找一段串口通信的程序给你看,单片机自带硬件UART,现在的单片机基本上都带硬件UART,有的单片机还带好几个 henangongda123 发表于 2021-6-28 10:59
我找一段串口通信的程序给你看,单片机自带硬件UART,现在的单片机基本上都带硬件UART,有的单片机还带好几 ...
既然单片机基本上都带硬件UART,那就是说可以不用位与操作了 /********* 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的发送/接收寄存器,你往这个寄存器写入一字节数据,它自动就把这个字节的数据按照设定的波特率、停止位发送出去了,发送完了产生一个标志位,你再读取或者响应中断就行了。
happytong 发表于 2021-6-28 11:03
既然单片机基本上都带硬件UART,那就是说可以不用位与操作了
是的,硬件UART不用位操作,看我贴的代码 henangongda123 发表于 2021-6-28 11:04
是的,硬件UART不用位操作,看我贴的代码
已看,程序中没用位与,我在学习过程中发现很多网上交的要位与,位与后也没有其他操作,我就好奇为什么要位与 happytong 发表于 2021-6-28 11:07
已看,程序中没用位与,我在学习过程中发现很多网上交的要位与,位与后也没有其他操作,我就好奇为什么要 ...
这哪个教程教的?误人子弟?你先要搞清楚是硬件UART还是软件模拟UART 本帖最后由 LcwSwust 于 2021-6-28 11:15 编辑
51单片机串口,波特率等参数配置好,然后对SBUF赋值即可。
如:
SBUF=x;//发送
while(TI==0);//等待发送标志
TI=0;//清发送标志
页:
[1]
2