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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5757|回復(fù): 2
收起左側(cè)

STC8G單片機(jī)串口通訊疑問(wèn),每次只能發(fā)送一個(gè)字節(jié)正確數(shù)據(jù)問(wèn)題

[復(fù)制鏈接]
ID:782831 發(fā)表于 2020-7-16 10:02 | 顯示全部樓層 |閱讀模式
STC8G單片機(jī)使用printf()函數(shù)發(fā)送數(shù)據(jù),出現(xiàn)錯(cuò)亂現(xiàn)象:
void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d%d%d",e,f,g); //接收中斷后 回傳1 2 3
                          ES=1;
                }
}

111.png

只能收到e=1,后面的字節(jié)收不到;切換到HEX模式,則還是有錯(cuò)誤:
22.png

31的asc碼是1,A6和FE明顯是錯(cuò)誤顯示;


現(xiàn)在把發(fā)送分成3次,程序如下,但發(fā)現(xiàn)還是有錯(cuò)誤:
void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d",e);
                        printf("%d",f);
                        printf("%d",g);
                          ES=1;
                }
}

33.png

非常奇怪,只能發(fā)送一個(gè)字節(jié)出去;


單片機(jī)選用型號(hào)是STC8G2K64S4,屬于1T單片機(jī),晶振設(shè)置的是22.1184MHZ,波特率是19200,完整程序如下,跪求各路大神解惑,謝謝!
#include "reg51.h"
#include"stdio.h"
#include "intrins.h"


#define  CKSEL  (*(unsigned char volatile xdata *)0xfe00)           //時(shí)鐘相關(guān)寄存器地址
#define  CLKDIV  (*(unsigned char volatile xdata *)0xfe01)
#define  HIRCCR  (*(unsigned char volatile xdata *)0xfe02)
#define  XOSCCR  (*(unsigned char volatile xdata *)0xfe03)
#define  IRC32KCR  (*(unsigned char volatile xdata *)0xfe04)


sfr  P_SW2  =  0xba;   //特殊寄存器
sfr  AUXR  =  0x8e;
sfr  P0M1  =  0x93;//管腳配置寄存器地址 與通訊無(wú)關(guān)
sfr  P0M0  =  0x94;
sfr  P1M1  =  0x91;
sfr  P1M0  =  0x92;
sfr  P2M1  =  0x95;
sfr  P2M0  =  0x96;
sfr  P3M1  =  0xb1;
sfr  P3M0  =  0xb2;
sfr  P4M1  =  0xb3;
sfr  P4M0  =  0xb4;
sfr  P5M1  =  0xc9;
sfr  P5M0  =  0xca;


int K=0;


void UartInit()//串口初始化函數(shù)
{
PCON=0x00;                   //PCON=0X00 波特率不加倍         SMOD=0
SCON = 0x50;        //SM0=0 SM1=1 串口1模式1可變波特率  8位數(shù)據(jù)模式
TMOD = 0x20;          //定時(shí)器1模式2  8位自動(dòng)重裝載模式
TL1 =0xDC;          //1T模式  22.1184MHZ晶振下  19200波特率
TH1 =0xDC;
IE=0x90;// 等同于EA=1;ES=1;
TCON=0x40;//等同于  TR1=1;
TI=1;
AUXR = 0x40;   //串口1模式0的波特率不加倍        選擇定時(shí)器1作為波特率發(fā)射器
}


void main()
{
P_SW2 = 0x80;//首先選擇內(nèi)部時(shí)鐘
CKSEL = 0x00;  // 選擇內(nèi)部 IRC (  默認(rèn) )   22.1184MHZ
//CLKDIV = 0x02;  // 時(shí)鐘 2 分頻
P_SW2 = 0x00;


UartInit();


while (1)
        {
                if(K==1)
                ;
                if(K==2)
                 ;
        }
}


void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d",e);
                        printf("%d",f);
                        printf("%d",g);
                          ES=1;
                }
}
33.png


回復(fù)

使用道具 舉報(bào)

ID:804115 發(fā)表于 2020-7-16 13:23 | 顯示全部樓層
兩個(gè)問(wèn)題:
1. 你的串口發(fā)送如果選擇hex的話,就不能填1了吧,應(yīng)該填31吧!這個(gè)你再核對(duì)下。可以下載sscom試試。
2. 這個(gè)很重要:中斷中不能執(zhí)行耗時(shí)太長(zhǎng)的任務(wù),否則會(huì)對(duì)整個(gè)系統(tǒng)造成影響。
你在串口中斷中調(diào)用printf就不行,因?yàn)閜rintf太耗時(shí)了,如果你要做回環(huán)測(cè)試的話,將中斷收到的數(shù)據(jù)先放到一個(gè)全局變量的數(shù)組中暫時(shí)存起來(lái),等退出中斷后,在大循環(huán)中判斷是否收到數(shù)據(jù),如果收到數(shù)據(jù),則將收到的數(shù)據(jù)用printf打印出來(lái)。這樣就不會(huì)出現(xiàn)只能收到1字節(jié)的問(wèn)題了。如果你已經(jīng)這樣改了,還不能收到,那么就是你的中斷響應(yīng)太慢了,這時(shí)候就要降低波特率來(lái)降低中斷觸發(fā)的速度。

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:800866 發(fā)表于 2020-7-18 15:44 | 顯示全部樓層
重定義 printf函數(shù)功能 ,即fputc函數(shù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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