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
楼主想要是实现什么,我给你个参考的例程,你看看吧
QQ:604914729联系。
#4
那真是太感谢了 我都找了 好久 想了 好久 还是不懂啊
我是想上位机发一串数据协议 下位机判断正确后控制i、o口
我是想上位机发一串数据协议 下位机判断正确后控制i、o口
#5
感觉LZ是把别人的协议硬搬来用......我看他那是相当复杂的协议,可能不合适你. 所谓协议,就是使通信对方能理解你所发送的数据的一种约定,它可以很简单的....
#6
学习下、
#7
我是硬搬的 因为不知道怎么写 能不能帮个忙啊
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa, 要判断是否正确,如果正确让P1^0=0.
这要怎么写
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa, 要判断是否正确,如果正确让P1^0=0.
这要怎么写
#8
比如说吧,你想做以下几个操作:向下位机特定端口写字节,从下位机特定的端口读字节,最简陋的协议可以这样: 发送一个2字节的包,第一字节为指令,如果是1为写,此时第二个字节是要写的字节;如果第一个字节为2则为读,此时第二个字节没有意义;下位机如果收到读指令则向上位机发一个字节的包,其内容就是从那个端口读取的字节.....当然实际应用中要更复杂和更完善才行.....
#9
我是做控制用的
#1
没得改,直接从写
#2
那要怎么写 帮个忙
#3
楼主想要是实现什么,我给你个参考的例程,你看看吧
QQ:604914729联系。
#4
那真是太感谢了 我都找了 好久 想了 好久 还是不懂啊
我是想上位机发一串数据协议 下位机判断正确后控制i、o口
我是想上位机发一串数据协议 下位机判断正确后控制i、o口
#5
感觉LZ是把别人的协议硬搬来用......我看他那是相当复杂的协议,可能不合适你. 所谓协议,就是使通信对方能理解你所发送的数据的一种约定,它可以很简单的....
#6
学习下、
#7
我是硬搬的 因为不知道怎么写 能不能帮个忙啊
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa, 要判断是否正确,如果正确让P1^0=0.
这要怎么写
发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa, 要判断是否正确,如果正确让P1^0=0.
这要怎么写
#8
比如说吧,你想做以下几个操作:向下位机特定端口写字节,从下位机特定的端口读字节,最简陋的协议可以这样: 发送一个2字节的包,第一字节为指令,如果是1为写,此时第二个字节是要写的字节;如果第一个字节为2则为读,此时第二个字节没有意义;下位机如果收到读指令则向上位机发一个字节的包,其内容就是从那个端口读取的字节.....当然实际应用中要更复杂和更完善才行.....
#9
我是做控制用的