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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口的自定義數據協議發送程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:923440 發表于 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);
   }  
}
}

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

使用道具 舉報

沙發
ID:123289 發表于 2021-7-10 08:54 | 只看該作者
1、電腦上的串口助手是不會聽你的協議的,它不受你的協議束縛,所以它能收發。
2、單片機的串口,硬件上也不受你的協議控制,它是來一個收一個,根本不會聽你協議。
3、你能做的就是,CPU收到數據后,組裝一下,再用軟件與你的協議進行比對,不符合協議的就放棄這組數據,符合的就解析這組數據(執行協議內容、指令)。
回復

使用道具 舉報

板凳
ID:939710 發表于 2021-7-10 09:20 | 只看該作者
你定了協議 你軟件要按照協議寫軟件功能啊。。不然協議是用來干啥的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜成人免费视频 | 国产黄色大片 | 欧美日本韩国一区二区三区 | 欧美网址在线观看 | 一区二区免费 | 黄色一级大片在线免费看产 | 日本午夜精品一区二区三区 | 二区久久 | 国产精品精品久久久 | 日韩欧美在线一区 | 午夜爽爽爽男女免费观看影院 | 国产一区二区在线播放 | 中文字幕一区二区三区不卡 | 国产成人午夜高潮毛片 | 男人天堂国产 | 国产美女精品 | 久久综合久久自在自线精品自 | 亚洲欧美一区二区三区国产精品 | 亚洲瑟瑟 | 精品国产一区二区三区四区在线 | av激情在线 | 国产美女精品视频 | 一区二区三区在线观看免费视频 | 97精品超碰一区二区三区 | 精品国产伦一区二区三区观看方式 | 日韩电影在线 | 亚洲成人二区 | 韩国精品在线 | 久久久久久国产精品久久 | 91国内精品久久 | 国内精品久久久久 | 午夜视频在线免费观看 | 亚洲va欧美va天堂v国产综合 | 97caoporn国产免费人人 | 国产乱码高清区二区三区在线 | 午夜视频免费网站 | 日韩视频在线免费观看 | 中文字幕 欧美 日韩 | 中文字幕国产一区 | 神马久久久久久久久久 | 亚洲在线一区二区 |