久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5487|回復: 2
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
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;
                }
}



只能收到e=1,后面的字節收不到;切換到HEX模式,則還是有錯誤:


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;
                }
}



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


單片機選用型號是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;
                }
}



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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性网 | 亚洲av毛片成人精品 | 免费av手机在线观看 | 久久三级av| 国产原创视频 | 黄色欧美在线 | 91大片| 蜜桃av人人夜夜澡人人爽 | 日韩中文欧美 | 日日摸日日碰夜夜爽2015电影 | 亚洲激情一级片 | 伊人网影院 | 国产精品久久久久久久久久免费看 | 久久99蜜桃综合影院免费观看 | 欧美在线视频不卡 | 欧美电影大全 | 国产成人叼嘿视频在线观看 | 欧美一级免费看 | 欧美一区二区三区一在线观看 | 91久久网站| 欧产日产国产精品国产 | 国产精品一区视频 | 久草综合在线 | 一区二区视频在线观看 | 国产乱人伦精品一区二区 | 久久99精品久久久久久 | 日韩高清一区 | 欧美aaa一级片 | 久久久久久国产精品 | 欧美极品在线观看 | 欧美成人精品一区二区男人看 | 亚洲一区二区视频在线观看 | 一区二区免费看 | 国产精品久久久爽爽爽麻豆色哟哟 | 国产精品免费一区二区 | 国产成人免费视频网站高清观看视频 | 成人免费视频久久 | 综合国产第二页 | 精品国产乱码久久久久久蜜柚 | 国产精品免费一区二区三区四区 | 亚洲成人精品国产 |