找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5837|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口程序只發(fā)送不接收的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:367937 發(fā)表于 2019-1-11 17:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
如果我只是要往上位機(jī)發(fā)送一串字符,而不需要從上位機(jī)往單片機(jī)發(fā)送內(nèi)容,為什么我這個程序就不能運行。

單片機(jī)源碼:
  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. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2019-1-12 11:09 | 只看該作者
你根據(jù)什么說不行
回復(fù)

使用道具 舉報

板凳
ID:466908 發(fā)表于 2019-1-12 12:49 | 只看該作者
打開串口中斷ES=1;
回復(fù)

使用道具 舉報

地板
ID:466908 發(fā)表于 2019-1-12 12:51 | 只看該作者
51寄存器表(重要).doc (91.5 KB, 下載次數(shù): 12)
回復(fù)

使用道具 舉報

5#
ID:432823 發(fā)表于 2019-1-12 13:09 | 只看該作者
28.void Send_byte(uchar dat)

29.{

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


32.         TI = 0;
33.}
回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 2019-1-12 14:31 | 只看該作者


#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++);
        }
}


回復(fù)

使用道具 舉報

7#
ID:367937 發(fā)表于 2019-1-16 13:21 | 只看該作者
yaoji123 發(fā)表于 2019-1-12 13:09
28.void Send_byte(uchar dat)

29.{

我感覺這么改和之前的邏輯上沒什么區(qū)別啊,為什么這么一改就能發(fā)送了
回復(fù)

使用道具 舉報

8#
ID:367937 發(fā)表于 2019-1-16 13:23 | 只看該作者

額,我并沒有需要單片機(jī)接收,所以我也不需要打開這個中斷。我不需要中斷程序
回復(fù)

使用道具 舉報

9#
ID:367937 發(fā)表于 2019-1-16 13:26 | 只看該作者
wulin 發(fā)表于 2019-1-12 14:31
#include

#define uchar unsigned char

謝謝指點,但我還有一個問題,就是我send_byte這個函數(shù),你和樓上都是將 SBUF = dat 這一句往前寫了,我有點不明白的是,這跟我寫的邏輯上感覺并沒有什么區(qū)別啊。一個是發(fā)送完軟件清0,而我是在發(fā)送前確保TI為0.
回復(fù)

使用道具 舉報

10#
ID:213173 發(fā)表于 2019-1-16 20:57 | 只看該作者
code_404 發(fā)表于 2019-1-16 13:26
謝謝指點,但我還有一個問題,就是我send_byte這個函數(shù),你和樓上都是將 SBUF = dat 這一句往前寫了,我 ...

void Send_byte(uchar dat)
{
        SBUF = dat;//發(fā)送數(shù)據(jù)
        while(!TI);//等待發(fā)送中斷請求標(biāo)志位為1(已發(fā)送完成)
        TI = 0;//必須軟件清0,為下次發(fā)送數(shù)據(jù)做準(zhǔn)備
}
回復(fù)

使用道具 舉報

11#
ID:404797 發(fā)表于 2019-1-17 18:35 | 只看該作者
    你這程序我簡單仿真試了一下,發(fā)現(xiàn)確實不行,主要問題有二:
      一是發(fā)送程序有錯:應(yīng)改為:
void Send_byte(uchar dat)
{SBUF = dat;
while(!TI);
TI = 0;
//SBUF = dat;
}

    二是主程序不合理,不是錯,也可以發(fā)送,但用于測試發(fā)送成功與否的程序,不要一直發(fā)字符串,把終端都堵死啦,改成如下比較好:
void main(void)
{ Init_uart();
  Send_string("uart_test");
  while(1);
}

    另外,你的單片機(jī)晶振一定要是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++);
   }
}

下面是程序改后仿真截圖:




回復(fù)

使用道具 舉報

12#
ID:975054 發(fā)表于 2021-12-16 11:06 | 只看該作者
有所體會;我的stc8g1k08,掉電喚醒后,只需獲取I2C傳感器數(shù)據(jù)并發(fā)送到上位機(jī)電腦監(jiān)控一次就好(不需要接收上位機(jī)什么命令 或數(shù)據(jù))。如果上位機(jī)不小心發(fā)送了什么數(shù)據(jù),我的MCU好多數(shù)據(jù)會混亂(有空看看怎么優(yōu)化一下),所以串口暫時得只發(fā)不收才穩(wěn)定。
回復(fù)

使用道具 舉報

13#
ID:975054 發(fā)表于 2021-12-16 11:43 | 只看該作者
ax6808 發(fā)表于 2021-12-16 11:06
有所體會;我的stc8g1k08,掉電喚醒后,只需獲取I2C傳感器數(shù)據(jù)并發(fā)送到上位機(jī)電腦監(jiān)控一次就好(不需要接收上 ...

臨時處理辦法,電腦監(jiān)控時,斷開串口TXD線,只留RXD、GND兩根線。
另外:我MCU3.3V供電的,發(fā)現(xiàn)USB ISP下載器的TXD線電壓為5V,連上MCU后為3.76V,感覺不太好,有空再研究,倒不會燒壞什么東西。
回復(fù)

使用道具 舉報

14#
ID:975054 發(fā)表于 2021-12-23 01:21 | 只看該作者
ax6808 發(fā)表于 2021-12-16 11:43
臨時處理辦法,電腦監(jiān)控時,斷開串口TXD線,只留RXD、GND兩根線。
另外:我MCU3.3V供電的,發(fā)現(xiàn)USB ISP下 ...

最終解決好辦法:掉電前ES=0,喚醒后ES=1;完美解決.
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表