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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口發送一組8個數據,偏偏第2個數據錯誤,其他數據都對,請問是怎么回事?

[復制鏈接]
跳轉到指定樓層
樓主
真的好奇怪,定時發送一組8個數據,但串口助手結果是前兩個數據均為第一個數據,后面數據都正常發送,這是怎么回事?要發送的是一組8個數據是:
uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//發送一組八個數據
然而接收到的卻是:0x01,0x01,0x00,0x00,0x00,0x01,0x84,0x0A,第一個數據發送了兩遍,然后開始發送第三,四位數據...

這是發送部分的程序:

for(i=0;i<8;i++)
   {
        SBUF=send[ i];//發送數據
        while(!TI);
        TI=0;//清除數據傳送標志
    }

然后我改了一下
for(i=0;i<8;i++)
   {
        SBUF=send[ i];//發送數據
        while(!TI);
        TI=0;//清除數據傳送標志
    }

它應該顯示第二,三位數據,也就是03 00 ,但結果卻是03 03 ,這是為啥?



以下為完整程序:我用了ds1302時鐘模塊,second就是秒,已經設置好了

#include <stc12c5a.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <intrins.h>
#include"ds1302.h"
#define uchar unsigned char
#define uint  unsigned int
        
uchar rec[9];//接收
uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//發送一組8個數據
uchar num=0;

void init();// 初始化函數
void UART_1send();
void UART_1interrupt();
int flag2;//接收標志位
int i;

void delay(uint z)//延時函數1ms
{
        uint x,y;
        for(x=z;x>0;x--);
                for(y=110;y>0;y--);
}


void init()  //系統初始化
{
TMOD |=0X20;//定時器T1,方式2,波特率由PCON寄存器的SMOD決定
SCON=0x50; //REN RI TI,RI為0,TI為0
//串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
PCON=0x00;//各工作方式波特率加倍
TH1=0xfD;//9600bps@11.0592
TL1=0xfD;
TR1=1; //定時器1中斷打開
EA=1;//cpu總中斷允許位,1為開放中斷
ES=1;// 1允許串行口中斷
}

void main()
{

          flag2=0;
          init();//初始化
          while(1)
        {               
             delay(1000);
              UART_1send();        //串口發送
        }
}

void UART_1send()  //串口發送函數
{
          uchar i;
          delay(500);
        if(flag2==0)        //如果標志位flag2=0,則發送
  {
                        for(i=0;i<8;i++)
                  {
                                SBUF=send[ i];//風向數據
                                while(!TI);
                                TI=0;//清除數據傳送標志
                        }
                   flag2=1;
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-1-12 11:54 | 只看該作者

//以下代碼在WQX-15開發板上,使用STC15W4K核心板調試串口1,晶振30M,波特率9600。
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
//串口初始化,配置定時器&波特率。STC15W,30M晶振,9600.
//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}

//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
//串口發送函數。主函數調用,或者串口發送完中斷后馬上調用
//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)                                                                                        //標志允許,發送一個字節
        {
                Uart1_Flag=0;                                                                                //標志位翻轉,只允許發送一個字節
                count++;                                                                                        //字節編號增加。
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;        //發送漢字的ASCII
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;                //發送數值 溫度
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                        
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;        //發送漢字的ASCII
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;        //發送數值 遙控
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                        
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;//發送漢字的ASCII
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;        //發送數值 超聲波
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;//發送漢字的ASCII
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;//最后一步 沒有發送字節,串口TI不會置1,所以不再發送
                }
        }
}
//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
//串口中斷,接收一個字節,馬上發送N個字節,發送數組顯示到電腦
//*********************************《人人學會單片機》視頻教程,祁緒電子2020-05
void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;                                                                //用于接收計數
        if(RI)                                                                                                        //如果接收到一個字節
        {
                RI=0;                                                                                                //標志位清除
                Uart1_Flag=1;                                                                                //串口發送允許
                if(SBUF==0x7f)//9600波特率                                                        //判斷連續多個0x7f
                {
                        Uart1_ser_n++;                                                                        //判斷連續多個0x7f
                        if(Uart1_ser_n>=10)                                                                //判斷連續多個0x7f
                        {
                                Uart1_ser_n=0;                                                                //清0
                                IAP_CONTR|=0xe0;                                                        //執行自動軟復位,可以做調試用
                        }
                }
        }
        if(TI)                                                                                                        //如果上一個字節發送完成了        
        {
                TI=0;                                                                                                //標志位清除
                Uart1_Flag=1;                                                                                //串口發送允許
                Uart1_Up_Data_Drive();                                                                //執行串口發送下一個字節
        }
}
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-1-13 16:41 | 只看該作者
這么長時間你還搞不出頭緒,今天有興致,把以前給你改寫的示例程序補充標準驗證碼程序,經實物驗證無誤。可以直接使用到實物,記得轉485。你再玩不轉就無語了。




風向儀.zip (17.26 KB, 下載次數: 10)


回復

使用道具 舉報

地板
ID:687694 發表于 2021-1-14 00:12 | 只看該作者
串口通訊注意工作頻率,非波特率整倍工作頻率會得到一定百分比固定誤碼率。
回復

使用道具 舉報

5#
ID:752974 發表于 2021-1-14 09:00 | 只看該作者
地板說的有道理,看看你用的晶振是不是11.0592M的倍數。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频线观看永久免费 | 免费黄色av | av影片在线| 6996成人影院网在线播放 | 日韩福利 | 亚洲国产精品一区二区久久 | 国产日韩视频 | 亚洲成av人片在线观看无码 | 91精品亚洲 | 久久久免费少妇高潮毛片 | 荷兰欧美一级毛片 | 欧美国产精品久久久 | 国产精品一区二区三区免费观看 | 欧美一级片a | 成年人在线视频 | 欧美成人aaa级毛片在线视频 | www.国产.com | 久久精品国产亚洲 | 国产精品日韩欧美一区二区三区 | 91视频久久 | 久久久久国产一区二区三区 | 亚洲久久| 伊人超碰 | 亚洲精品一区二区网址 | 美国黄色毛片 | 国产日韩欧美一区二区在线播放 | 精品在线播放 | 国产三级日本三级 | 国产视频一区在线 | 国产精品自产拍在线观看蜜 | 色爱区综合 | 超碰电影 | 看片网站在线 | 成人毛片一区二区三区 | 91av视频在线观看 | 自拍偷拍亚洲欧美 | 中文一区| 爱爱视频网 | 亚洲97| 欧美激情精品久久久久久 | 日韩在线免费视频 |