3521|9

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

这个单片机程序 要怎么修改 [复制链接]

#include
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;

最新回复

我是做控制用的  详情 回复 发表于 2009-12-21 10:00
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没得改,直接从写
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那要怎么写     帮个忙
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

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



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

回复

69

帖子

0

TA的资源

一粒金砂(初级)

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

回复

85

帖子

0

TA的资源

一粒金砂(初级)

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

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习下、
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
我是硬搬的      因为不知道怎么写       能不能帮个忙啊

发送 贞头0x55,数据0xfd,0xde,贞尾是0xaa,      要判断是否正确,如果正确让P1^0=0.

这要怎么写
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

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

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
我是做控制用的
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
中星联华&ADI直播报名最后一周!
直播主题:大咖面对面,轻松玩转高速ADC性能测试
直播时间:3月25日(周二)14:00
活动奖励:京东卡、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 2

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表