51串口发送接收求解
时间:10-02
整理:3721RD
点击:
我想问一下关于51的串口SBUF寄存器,在读走SBUF寄存器后接收寄存器SBUF中的内容是否变化?在向SBUF写完一次数据后,直至单片机将SBUF中的数据完全传输出去令TI等于1时,发送寄存器SBUF内容是否会变化?
因为我在调试51串口发送数据到电脑时,发现将串口及定时器1初始化完成后,只要将SBUF设置了初值,电脑端就能一直接收该数据。
我原本是想使用串口调试助手发送0xaa时,单片机将0x12发送回来,但是只要我向单片机发送0xaa后,单片机就一直发送0x12,但是只要我发送0xfe或0xfd单片机就停止发送了,这是怎么回事呢?
以下是源程序及debug截图
因为我在调试51串口发送数据到电脑时,发现将串口及定时器1初始化完成后,只要将SBUF设置了初值,电脑端就能一直接收该数据。
我原本是想使用串口调试助手发送0xaa时,单片机将0x12发送回来,但是只要我向单片机发送0xaa后,单片机就一直发送0x12,但是只要我发送0xfe或0xfd单片机就停止发送了,这是怎么回事呢?
以下是源程序及debug截图
- void main()
- {
- UartInit(1); //串口和定时器1初始化
- EA = 1;
- while(1)
- {
- switch(Rdata){
- case 0xfd: P1 = 0x55;
- break;
- case 0xfe: P1 = 0xaa;
- break;
- case 0xaa: SBUF = 0x12;
- }
- }
- }
- void ser() interrupt 4
- {
- if(!TI){ //接收中断
- Rdata = SBUF; //将接收缓冲区中的数据读走并保留在Rdata变量中
- RI = 0; //将RI置0,允许接收
- }
- else{
- Rdata = 0xff;
- TI = 0;
- }
- }
没人帮忙吗?
- void ser() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- Rdata = SBUF;
- }
- if(TI)
- {
- TI = 0;
- }
- }
串口发送数据后没有清零发送标志TI
在 case 0xaa: SBUF = 0x12;
后再加TI=0;
即: case 0xaa: SBUF = 0x12;
TI=0;
还有你编写程序代码一定要规范
你 那个if(!TI)并不能代表if(RI)
不一定就是 没有发送就是接收 所以if(!TI)得改成if(RI)
还有swich语句 不全面 程序可能出错 或者跑飞
咱也新手
讲的不对的 可以指点