找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1791|回复: 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 单片机教程网

快速回复 返回顶部 返回列表