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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5749|回復: 2
收起左側

STC8G單片機串口通訊疑問,每次只能發送一個字節正確數據問題

[復制鏈接]
ID:782831 發表于 2020-7-16 10:02 | 顯示全部樓層 |閱讀模式
STC8G單片機使用printf()函數發送數據,出現錯亂現象:
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,后面的字節收不到;切換到HEX模式,則還是有錯誤:
22.png

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


現在把發送分成3次,程序如下,但發現還是有錯誤:
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

非常奇怪,只能發送一個字節出去;


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


#define  CKSEL  (*(unsigned char volatile xdata *)0xfe00)           //時鐘相關寄存器地址
#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;//管腳配置寄存器地址 與通訊無關
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()//串口初始化函數
{
PCON=0x00;                   //PCON=0X00 波特率不加倍         SMOD=0
SCON = 0x50;        //SM0=0 SM1=1 串口1模式1可變波特率  8位數據模式
TMOD = 0x20;          //定時器1模式2  8位自動重裝載模式
TL1 =0xDC;          //1T模式  22.1184MHZ晶振下  19200波特率
TH1 =0xDC;
IE=0x90;// 等同于EA=1;ES=1;
TCON=0x40;//等同于  TR1=1;
TI=1;
AUXR = 0x40;   //串口1模式0的波特率不加倍        選擇定時器1作為波特率發射器
}


void main()
{
P_SW2 = 0x80;//首先選擇內部時鐘
CKSEL = 0x00;  // 選擇內部 IRC (  默認 )   22.1184MHZ
//CLKDIV = 0x02;  // 時鐘 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


回復

使用道具 舉報

ID:804115 發表于 2020-7-16 13:23 | 顯示全部樓層
兩個問題:
1. 你的串口發送如果選擇hex的話,就不能填1了吧,應該填31吧!這個你再核對下。可以下載sscom試試。
2. 這個很重要:中斷中不能執行耗時太長的任務,否則會對整個系統造成影響。
你在串口中斷中調用printf就不行,因為printf太耗時了,如果你要做回環測試的話,將中斷收到的數據先放到一個全局變量的數組中暫時存起來,等退出中斷后,在大循環中判斷是否收到數據,如果收到數據,則將收到的數據用printf打印出來。這樣就不會出現只能收到1字節的問題了。如果你已經這樣改了,還不能收到,那么就是你的中斷響應太慢了,這時候就要降低波特率來降低中斷觸發的速度。

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表