这个单片机程序 要怎么修改

时间:2021-04-12 19:47:04
#include<reg52.h>
unsigned char flag,rcvdat,retval,sumchkm,xorchkm;
unsigned char state_machine[11];
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
if(state_machine == 0)     // 协议解析状态机
{
    if(rcvdat == 0x55)     // 接收到帧头第一个数据
        state_machine = 1;
    else
        state_machine = 0;    // 状态机复位
}
else if(state_machine == 1)
{
    if(rcvdat == 0xAA)     // 接收到帧头第二个数据
        state_machine = 2;
    else
        state_machine = 0;    // 状态机复位
}
else if(state_machine == 2)
{
    if(rcvdat == 0x7E)     // 接收到帧头第三个数据
        state_machine = 3;
     else
        state_machine = 0;    // 状态机复位
}
else if(state_machine == 3)
{
    sumchkm = rcvdat;     // 开始计算累加、异或校验和
    xorchkm = rcvdat;
    if(rcvdat == m_SrcAdr)    // 判断目的地址是否正确
        state_machine = 4;
    else
        state_machine = 0;
}
else if(state_machine == 4)
{
    sumchkm += rcvdat;
    xorchkm ^= rcvdat;
    if(rcvdat == m_DstAdr)    // 判断源地址是否正确
        state_machine = 5;
    else
        state_machine = 0;
   }
else if(state_machine == 5)
{
    lencnt = 0;        // 接收数据计数器
    rcvcount = rcvdat;      // 接收数据长度
    sumchkm += rcvdat;
    xorchkm ^= rcvdat;
    state_machine = 6;
}
else if(state _machine == 6 || state _machine == 7)
{
    m_ucData[lencnt++] = rcvdat;     // 数据保存
    sumchkm += rcvdat;
    xorchkm ^= rcvdat;
    if(lencnt == rcvcount)    // 判断数据是否接收完毕
        state_machine = 8;
    else
        state_machine = 7;
}
else if(state_machine == 8)
{
    if(sumchkm == rcvdat)     // 判断累加和是否相等
        state_machine = 9;
    else
        state_machine = 0;
}
else if(state_machine == 9)
{
    if(xorchkm == rcvdat)     // 判断异或校验和是否相等
        state_machine = 10;
    else
        state_machine = 0;
}
else if(state_machine == 10)
{
    if(0x0D == rcvdat)     // 判断是否接收到帧尾结束符
    {
        retval = 0xaa;     // 置标志,表示一个数据包接收到
    }
    state_machine = 0;     // 复位状态机

}
}
void ser() interrupt 4
{
RI=0;
P1=SBUF;
flag=1;

9 个解决方案

#1


没得改,直接从写

#2


那要怎么写     帮个忙

#3


引用 2 楼 wen87654321 的回复:
那要怎么写    帮个忙



楼主想要是实现什么,我给你个参考的例程,你看看吧
QQ:604914729联系。

#4


那真是太感谢了      我都找了 好久   想了 好久       还是不懂啊   
我是想上位机发一串数据协议  下位机判断正确后控制i、o口

#5


感觉LZ是把别人的协议硬搬来用......我看他那是相当复杂的协议,可能不合适你. 所谓协议,就是使通信对方能理解你所发送的数据的一种约定,它可以很简单的....

#6


学习下、

#7


我是硬搬的      因为不知道怎么写       能不能帮个忙啊
 
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa,      要判断是否正确,如果正确让P1^0=0.

这要怎么写

#8


比如说吧,你想做以下几个操作:向下位机特定端口写字节,从下位机特定的端口读字节,最简陋的协议可以这样: 发送一个2字节的包,第一字节为指令,如果是1为写,此时第二个字节是要写的字节;如果第一个字节为2则为读,此时第二个字节没有意义;下位机如果收到读指令则向上位机发一个字节的包,其内容就是从那个端口读取的字节.....当然实际应用中要更复杂和更完善才行.....

#9


我是做控制用的

#1


没得改,直接从写

#2


那要怎么写     帮个忙

#3


引用 2 楼 wen87654321 的回复:
那要怎么写    帮个忙



楼主想要是实现什么,我给你个参考的例程,你看看吧
QQ:604914729联系。

#4


那真是太感谢了      我都找了 好久   想了 好久       还是不懂啊   
我是想上位机发一串数据协议  下位机判断正确后控制i、o口

#5


感觉LZ是把别人的协议硬搬来用......我看他那是相当复杂的协议,可能不合适你. 所谓协议,就是使通信对方能理解你所发送的数据的一种约定,它可以很简单的....

#6


学习下、

#7


我是硬搬的      因为不知道怎么写       能不能帮个忙啊
 
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa,      要判断是否正确,如果正确让P1^0=0.

这要怎么写

#8


比如说吧,你想做以下几个操作:向下位机特定端口写字节,从下位机特定的端口读字节,最简陋的协议可以这样: 发送一个2字节的包,第一字节为指令,如果是1为写,此时第二个字节是要写的字节;如果第一个字节为2则为读,此时第二个字节没有意义;下位机如果收到读指令则向上位机发一个字节的包,其内容就是从那个端口读取的字节.....当然实际应用中要更复杂和更完善才行.....

#9


我是做控制用的