欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC8A8K64S4A12單片機串口2程序問題 求幫助 [打印本頁]

作者: mlz159357    時間: 2021-10-17 20:17
標題: STC8A8K64S4A12單片機串口2程序問題 求幫助
程序:void uart_init()
{        
        /* ----------------------------------------------------串口2初始化------------------------------*/
        S2CON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        if(com2_baud == 1)
        {
                T2L = 0xE0;                //設定定時初值 9600
                T2H = 0xFE;                //設定定時初值
        }
        AUXR |= 0x10;                //啟動定時器2
        /*引腳選擇*/

                      P_SW2 |= 0x81;        //RXD2_2/P4.0, TXD2_2/P4.2
                          P_SW2 &= ~0x80;//關閉訪問擴展特殊寄存器        
        }
        IE2 |= 0x01;         //使能串口2中斷
}

/******************************************
函數名:putbuf
功能:輸出一個字符
*******************************************/
void putbuf(char dat)
{
        S2BUF = dat;
        while(S2CON&S2TI==0);
}

/******************************************
函數名:Delay1000ms()
功能:延遲1s
*******************************************/
void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 57;
        j = 27;
        k = 112;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/******************************************
函數名:sendstring(char * dat)
功能:輸出字符串
*******************************************/
void sendstring(char * dat)
{
        while(*dat != '\0')
        {
                putbuf(*dat++);
        }
}

/******************************************
函數名:com2_isr() interrupt 8
功能:串口2中斷服務函數
*******************************************/
void com2_isr() interrupt 8
{
        unsigned char res; //串口2接收數據臨時存放區
    if (S2CON & S2RI)
    {        
        S2CON &= ~S2RI;                         //清中斷標志      
    }
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;                         //清中斷標志        
    }
}

void main(void)
{
        uart_init();
        EA =1;
        while(1)
        {
                sendstring("TEST ! \r\n");
                Delay1000ms();
        }
}


////接到串口助手,一直顯示數據:0A(HEX格式),怎么回事???哪里出錯了??


作者: mlz159357    時間: 2021-10-17 21:49
最新發現:連續發送字符串,比如“ABC”,只會輸出最后一個字符。同樣我上面程序里輸出“TEST ! \r\n”,只會輸出‘\n’,為什么會這樣啊
作者: 188610329    時間: 2021-10-17 23:40
       while(S2CON&S2TI==0);

這個不能偷懶,要這樣寫:    while((S2CON&S2TI)==0);
作者: aking991    時間: 2021-10-18 08:26
你要測試輸出,先把接收中斷關閉試試就知道什么原因了,按你這個發送也進入中斷,肯定會和你發送字符這個函數沖突的
作者: devcang    時間: 2021-10-18 10:03

發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。
作者: mlz159357    時間: 2021-10-18 19:06
188610329 發表于 2021-10-17 23:40
while(S2CON&S2TI==0);

這個不能偷懶,要這樣寫:    while((S2CON&S2TI)==0);

不是這個原因,試了不行。。
作者: mlz159357    時間: 2021-10-18 19:39
aking991 發表于 2021-10-18 08:26
你要測試輸出,先把接收中斷關閉試試就知道什么原因了,按你這個發送也進入中斷,肯定會和你發送字符這個函 ...

后面試了,不開中斷也這樣
作者: mlz159357    時間: 2021-10-18 19:44
devcang 發表于 2021-10-18 10:03
發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。

這個方法確實是可行的,但是我就不懂為什么串口1可以用中斷標志位來設置等待,串口2就不可以了。。
作者: mlz159357    時間: 2021-10-18 20:01
devcang 發表于 2021-10-18 10:03
發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。

大神,可不可以幫我解答這個問題
作者: 188610329    時間: 2021-10-18 20:31
mlz159357 發表于 2021-10-18 19:06
不是這個原因,試了不行。。

你整個程序, 除了 while(S2CON&S2TI==0); 寫錯之外,其他地方看下來都沒有問題.

要么,你換引腳看看?  用標準引腳試試看?
作者: Y_G_G    時間: 2021-10-18 20:36
以下是我用STC8A4K照著官方寫的,已經在開發板上驗證成功了
手頭上沒有現成的8A8K電路板,但實際都是8A系列的,是一樣的
你對比一下
/*================================
Stc8a4k串口2測試程序
單片機型號:STC8A4K
波特率:9600
==================================*/
#include "Stc8a.h"
bit busy;
char wptr;
char rptr;
char buffer[16];
//===========================================================
//函數名:Delay1000ms()
//功能:延遲1s
void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 57;
        j = 27;
        k = 112;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//===========================================================
void Uart2Isr() interrupt 8
{
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;
        busy = 0;
    }
    if (S2CON & S2RI)
    {
        S2CON &= ~S2RI;
    }
}
//===========================================================
void Uart2Init()
{
    S2CON = 0x50;                //8位數據,可變波特率:9600
        AUXR &= 0xFB;                //定時器時鐘12T模式
        T2L = 0xE8;                //設置定時初始值
        T2H = 0xFF;                //設置定時初始值
        AUXR |= 0x10;                //定時器2開始計時
}
//===========================================================
void Uart2Send(char dat)
{
    while (busy);
    busy = 1;
    S2BUF = dat;
}
//===========================================================
void Uart2SendStr(char *p)
{
    while (*p!= '\0')
    {
        Uart2Send(*p++);
    }
}
//===========================================================
void main()
{
    Uart2Init();
    IE2 = 0x01;
    EA = 1;
    while (1)
    {      
            Uart2SendStr("Uart Test !\r\n");
            Delay1000ms();
    }
}
//===========================================================
作者: mlz159357    時間: 2021-10-20 14:47
Y_G_G 發表于 2021-10-18 20:36
以下是我用STC8A4K照著官方寫的,已經在開發板上驗證成功了
手頭上沒有現成的8A8K電路板,但實際都是8A系列 ...

嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發送完畢,官方手冊是用一個全局變量“busy”來設置等待發送完畢。可我就是想不通為什么用中斷標志位設置等待不可行呢?
作者: mlz159357    時間: 2021-10-20 14:47
188610329 發表于 2021-10-18 20:31
你整個程序, 除了 while(S2CON&S2TI==0); 寫錯之外,其他地方看下來都沒有問題.

要么,你換引腳看看?   ...

引腳換了也不行。。。。
作者: Y_G_G    時間: 2021-10-20 15:13
mlz159357 發表于 2021-10-20 14:47
嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發 ...

這個串口2的中斷標志位位于9AH寄存器
這個寄存器不支持位尋址
&是按位與
所以,結果是怎么不重要,肯定不會是正確的
作者: Y_G_G    時間: 2021-10-20 15:17
mlz159357 發表于 2021-10-20 14:47
嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發 ...

串口1的TI和RI支持位尋址,你可以試一下就知道我說的了
作者: mlz159357    時間: 2021-10-20 15:39
Y_G_G 發表于 2021-10-20 15:17
串口1的TI和RI支持位尋址,你可以試一下就知道我說的了

明白了,感覺有道理




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1