微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机串口查询方式收发出现的问题

51单片机串口查询方式收发出现的问题

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void serialportinit()
{
        TMOD=0x20;//定时计数器1,8位自动装载计数器
        SCON=0x70;//串口使用工作模式1,8位UART
        PCON|=0x00;
        TH1=0xfd;//设置串口波特率为9600bps;
        TR1=1;//定时计数器1开启
}
void main()
{
uchar ch,x=1;
serialportinit(); //串口初始化
while(1)
        {
                if(RI)
                {
                        RI=0;
                        ch=SBUF;
            
                        SBUF=ch;
                        while(!TI);
                        TI=0;
                        SBUF=x;
                        while(!TI);
                        TI=0;
                }        
        }        
}

我的问题是:
1,为什么从串口工具给MCU发送abc时,从MCU发送回串口工具的数据是 61 01 62 01  63 01; 但是从串口工具中发送的数据变成abcd,为什么从mcu发送回串口工具中的数据还是不变,依然是 61 01 62 01  63 01?
2, 就以上代码中出现的问题,即接收一个字符后连续发送两个字符问题 描述下 串口接收和发送数据的时间顺序是怎样的?即哪些时候是在同一时间操作,关于时间间隔。需不需要延时......等会出错的问题。
PS:操作起串口才发现,串口并不是教程,书本上面说得那么简单,要熟练操作、甚至精通串口,真的不简单啊感觉,所以恳请大侠们帮下忙,因为学习过程中这个问题困扰了一周,都没有人说个明白,感谢了。

首先,串口助手是否设置了16进制显示,还有就是缓存的大小

第二,串口是是一个一个的接收数据,助手发的数据先是放缓存,然后一个触发一次中断

第三,其实串口在只用TX,RX,GND这3个脚时,非常简单

基本是入门必备的

要设置输入为16进制数的

1、if(RI)这个语句是什么语句?while(RI)
2、01是这个      SBUF=x;
                        while(!TI);
                        TI=0;  语句发送的。
3、初始化中TL1呢?

if(RI)这里判断RI是否置位,这里没有出现错误哦,
还有,我只设置了TH1,,没有设置TL1,这样是否会出错?
最后,我想请问您,我发送abc 返回到串口的现象我理解,也是正确,可发送abcd就没有了d这一字节的数据在串口助手中显示,这是什么原因呢?

嗯嗯,设置了16进制显示,缓存应该也没问题,我再没有添加多发送x的语句时,发送123456789这一串数据,串口工具接收时没问题的。问题是出现在了添加:
  SBUF=x;
  while(!TI);
  TI=0;
之后,也就是多发送x这个字节的数据后产生问题的。所以,这是什么原因?麻烦您。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top