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

標題: 單片機串口的自定義數據協議發送程序問題 [打印本頁]

作者: 51c_yang    時間: 2021-7-9 16:39
標題: 單片機串口的自定義數據協議發送程序問題
求幫忙看看單片機代碼是不是有什么問題;描述是:發送的串口協議的 幀頭AA,長度4,數據(3個字節)異或校驗(只校驗數據位);
只有輸入正確的話會把數據發送到串口助手在電腦上顯示出來;
現在是發什么它都接受,根本給規定的不一樣;
代碼:#include <reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr IE2 = 0xaf;
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;

bit busy;
uchar xor_check;//異或校驗
  uchar recv_data;//臨時變量用來接收S2BUF中的數據
   uchar recv_cnt = 0;
uchar  recv_buf[10];//接收數據
uchar recv_flag = 0;
uchar machine_step = 0;

void delay_140us(void);
//void delay_1ms(unsigned int i);



void Uart2SEND(uint dat);
void Uart2SENDStr(char *p);

void Delay500ms()                //@11.0592MHz
{
uchar i, j, k;

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void Uart2Isr() interrupt 8
{         

if ((S2CON & 0x01) == 1)
{
        
   S2CON &= ~0x01;
         recv_data = S2BUF;

         switch(machine_step)
         {
                 case 0:
                             if(recv_data == 0xAA)//判斷是不是幀頭
                                         {
                                                 machine_step = 1;
                                
            }
                                                else
                                                {
                                                        machine_step = 0;
             }
                                                 break;
                        case 1:
            if(recv_data == 04)//判斷第二個數據
                                                 {
                                                         machine_step = 2;
                                                         recv_cnt = 0;//
                                                
            }
                                                else
                                                {
                                                        machine_step = 0;
             }
                                                 break;                                                        
                 case 2: //開始接收數據(3個字節)
                         xor_check ^= recv_data;
                  
                       recv_buf[recv_cnt] = recv_data;
                         recv_cnt++;

                              if(recv_cnt > 2)
                                                {
                                                        machine_step = 3;
             }
                                                 else
                                                  {
                machine_step = 2;
               }
                         break;
                        case 3:
                                    if(xor_check == recv_data)
                                                {
                                                        recv_flag = 1;
            }
                                                machine_step = 0;                                                
                                                recv_cnt = 0;
                                                xor_check = 0;
                                                break;
                        default: break;
                                    
                }
}
if ((S2CON & 0x02)== 1)
{
S2CON &= ~0x02;
busy = 0;
}

}

void Uart2Init()
{
S2CON = 0x10;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x14;
busy = 0;
}

void Uart2SEND(uint dat)
{
while (busy)
busy = 1;
S2BUF = dat;
//Delay500ms();
        
        
}

void Uart2SENDStr(char *p)
{
while (*p)
{
Uart2SEND(*p++);
}

}


void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
Uart2Init();
IE2 = 0x01;
EA = 1;
Uart2SENDStr("test");

while (1)
{         
         if(recv_flag == 1)
         {
                 recv_flag = 0;

                // Uart2SEND(recv_data);
         Uart2SENDStr(recv_buf);
   }  
}
}


作者: yzwzfyz    時間: 2021-7-10 08:54
1、電腦上的串口助手是不會聽你的協議的,它不受你的協議束縛,所以它能收發。
2、單片機的串口,硬件上也不受你的協議控制,它是來一個收一個,根本不會聽你協議。
3、你能做的就是,CPU收到數據后,組裝一下,再用軟件與你的協議進行比對,不符合協議的就放棄這組數據,符合的就解析這組數據(執行協議內容、指令)。
作者: lishengaha    時間: 2021-7-10 09:20
你定了協議 你軟件要按照協議寫軟件功能啊。。不然協議是用來干啥的。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩激情一区 | 欧美一区不卡 | 欧美黑人一级爽快片淫片高清 | 精品国产一区二区三区性色av | 午夜视频在线播放 | 鸳鸯谱在线观看高清 | 亚洲视频免费在线观看 | 狠狠干av | 一区二区三区在线看 | 成人在线免费 | 国产日韩亚洲欧美 | 亚洲精品一区在线 | 一区天堂 | 四虎影院在线观看免费视频 | 求毛片| 午夜精品久久久久久不卡欧美一级 | 亚洲成人播放器 | 国产精品区二区三区日本 | 国产在线一区二区 | 夜夜草视频 | 午夜激情在线视频 | av午夜电影 | 99国产精品久久久久老师 | 中文字幕在线一 | 涩涩视频在线观看免费 | 中文字幕动漫成人 | 亚洲精品成人av久久 | 国产欧美精品一区二区色综合朱莉 | 美女日皮网站 | 久久久这里都是精品 | 草久久久 | 黄色片亚洲| 最新一级毛片 | 蜜月va乱码一区二区三区 | 国产精品美女www | 精品欧美激情精品一区 | 男人天堂久久久 | 国产乱码精品一品二品 | 亚洲人成人一区二区在线观看 | 成人免费在线视频 | 亚洲免费三区 |