找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4890|回复: 13
收起左侧

单片机串口程序只发送不接收的问题

[复制链接]
ID:367937 发表于 2019-1-11 17:57 | 显示全部楼层 |阅读模式
如果我只是要往上位机发送一串字符,而不需要从上位机往单片机发送内容,为什么我这个程序就不能运行。

单片机源码:
  1. #include<reg52.h>

  2. #define uchar        unsigned char
  3. #define uint        unsigned int

  4. void Init_uart();
  5. void Send_byte(uchar dat);
  6. void Send_string(uchar *p);

  7. void main(void)
  8. {
  9.         Init_uart();
  10.         while(1)
  11.         {
  12.                 Send_string("uart_test");
  13.         }
  14. }

  15. void Init_uart()
  16. {
  17.         SCON = 0x50;
  18.         TMOD = 0x20;
  19.         TH1 = 0xfd;
  20.         TL1 = 0xfd;
  21.         TR1 = 1;
  22. }

  23. void Send_byte(uchar dat)
  24. {
  25.         while(!TI);
  26.         TI = 0;
  27.         SBUF = dat;
  28. }

  29. void Send_string(uchar *p)
  30. {
  31.         while(*p)
  32.         {
  33.                 Send_byte(*p++);
  34.         }
  35. }
复制代码



回复

使用道具 举报

ID:94031 发表于 2019-1-12 11:09 | 显示全部楼层
你根据什么说不行
回复

使用道具 举报

ID:466908 发表于 2019-1-12 12:49 | 显示全部楼层
打开串口中断ES=1;
回复

使用道具 举报

ID:466908 发表于 2019-1-12 12:51 | 显示全部楼层
51寄存器表(重要).doc (91.5 KB, 下载次数: 12)
回复

使用道具 举报

ID:432823 发表于 2019-1-12 13:09 | 显示全部楼层
28.void Send_byte(uchar dat)

29.{

30.    SBUF = dat;
  
  
31.       while(!TI);


32.         TI = 0;
33.}
回复

使用道具 举报

ID:213173 发表于 2019-1-12 14:31 | 显示全部楼层
无标题.jpg

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

void Init_uart();
void Send_byte(uchar dat);
void Send_string(uchar *p);

void main(void)
{
        uint i;
        Init_uart();
        while(1)
        {
                Send_string("uart_test\n");//加换行符是为了在串口助手可以看清楚
                i=0xffff;
                while(i--);//延时,串口助手可以看清楚一帧一帧的接收
        }
}

void Init_uart()
{
        SCON = 0x50;
        TMOD = 0x20;
        TH1 = 0xfd;
        TL1 = 0xfd;
        TR1 = 1;
}

void Send_byte(uchar dat)
{
        SBUF = dat;
        while(!TI);
        TI = 0;
}

void Send_string(uchar *p)
{
        while(*p)
        {
                Send_byte(*p++);
        }
}


回复

使用道具 举报

ID:367937 发表于 2019-1-16 13:21 | 显示全部楼层
yaoji123 发表于 2019-1-12 13:09
28.void Send_byte(uchar dat)

29.{

我感觉这么改和之前的逻辑上没什么区别啊,为什么这么一改就能发送了
回复

使用道具 举报

ID:367937 发表于 2019-1-16 13:23 | 显示全部楼层

额,我并没有需要单片机接收,所以我也不需要打开这个中断。我不需要中断程序
回复

使用道具 举报

ID:367937 发表于 2019-1-16 13:26 | 显示全部楼层
wulin 发表于 2019-1-12 14:31
#include

#define uchar unsigned char

谢谢指点,但我还有一个问题,就是我send_byte这个函数,你和楼上都是将 SBUF = dat 这一句往前写了,我有点不明白的是,这跟我写的逻辑上感觉并没有什么区别啊。一个是发送完软件清0,而我是在发送前确保TI为0.
回复

使用道具 举报

ID:213173 发表于 2019-1-16 20:57 | 显示全部楼层
code_404 发表于 2019-1-16 13:26
谢谢指点,但我还有一个问题,就是我send_byte这个函数,你和楼上都是将 SBUF = dat 这一句往前写了,我 ...

void Send_byte(uchar dat)
{
        SBUF = dat;//发送数据
        while(!TI);//等待发送中断请求标志位为1(已发送完成)
        TI = 0;//必须软件清0,为下次发送数据做准备
}
回复

使用道具 举报

ID:404797 发表于 2019-1-17 18:35 | 显示全部楼层
    你这程序我简单仿真试了一下,发现确实不行,主要问题有二:
      一是发送程序有错:应改为:
void Send_byte(uchar dat)
{SBUF = dat;
while(!TI);
TI = 0;
//SBUF = dat;
}

    二是主程序不合理,不是错,也可以发送,但用于测试发送成功与否的程序,不要一直发字符串,把终端都堵死啦,改成如下比较好:
void main(void)
{ Init_uart();
  Send_string("uart_test");
  while(1);
}

    另外,你的单片机晶振一定要是11.0592M的,否则也不行。


下面是我把你的程序改后的清单:
#include<reg52.h>
#define uchar  unsigned char
#define uint  unsigned int
void Init_uart();
void Send_byte(uchar dat);
void Send_string(uchar *p);
void main(void)
{ Init_uart();
  Send_string("uart_test");
  while(1);
}

void Init_uart()
{SCON = 0x50;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
void Send_byte(uchar dat)
{SBUF = dat;
while(!TI);
TI = 0;
//SBUF = dat;
}
void Send_string(uchar *p)
{while(*p)
   {Send_byte(*p++);
   }
}

下面是程序改后仿真截图:
ask2.JPG



回复

使用道具 举报

ID:975054 发表于 2021-12-16 11:06 | 显示全部楼层
有所体会;我的stc8g1k08,掉电唤醒后,只需获取I2C传感器数据并发送到上位机电脑监控一次就好(不需要接收上位机什么命令 或数据)。如果上位机不小心发送了什么数据,我的MCU好多数据会混乱(有空看看怎么优化一下),所以串口暂时得只发不收才稳定。
回复

使用道具 举报

ID:975054 发表于 2021-12-16 11:43 | 显示全部楼层
ax6808 发表于 2021-12-16 11:06
有所体会;我的stc8g1k08,掉电唤醒后,只需获取I2C传感器数据并发送到上位机电脑监控一次就好(不需要接收上 ...

临时处理办法,电脑监控时,断开串口TXD线,只留RXD、GND两根线。
另外:我MCU3.3V供电的,发现USB ISP下载器的TXD线电压为5V,连上MCU后为3.76V,感觉不太好,有空再研究,倒不会烧坏什么东西。
回复

使用道具 举报

ID:975054 发表于 2021-12-23 01:21 | 显示全部楼层
ax6808 发表于 2021-12-16 11:43
临时处理办法,电脑监控时,断开串口TXD线,只留RXD、GND两根线。
另外:我MCU3.3V供电的,发现USB ISP下 ...

最终解决好办法:掉电前ES=0,唤醒后ES=1;完美解决.
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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