找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2060|回复: 0
打印 上一主题 下一主题
收起左侧

基于usart串口的通过信号机——通信协议设计

[复制链接]
跳转到指定楼层
楼主
本帖最后由 Andrew888 于 2020-3-18 11:54 编辑

一、本项目意义:实现通过USART通信,通过帧信息控制通过信号机状态,可以设置灯丝故障,设置区间状态,点灯信息基于Flash内的固定信息,与帧序列无直接交互,相当于实现了电子连锁,可用于教学实验。
二、通信协议定义
1、发送帧格式

2、返回帧格式


3、具体实现代码
  1. //通信协议内容识别逻辑
  2.                
  3.                 //非广播命令 及 CRC校验 及 设备类型 及 密钥检验 及 是否收到新的帧
  4.                 //CRCCHECK = CRCcheck();return true/false;
  5.                 CRCcheck();
  6.                 if( CRCCHECK && TypeFrame == TongGuoXHJ && AccessFrame == 0xAA && key)
  7.                 {
  8. if(OrderFrame == 0x01)
  9.                         {
  10.                                 //修改flash设备编号
  11.                                 //传回相应帧;void SendBackMessage(0x01);根据参数判断需要的返回信息,自动形成格式,提取flash中内容填充帧序列;
  12.                                 Write_CV(SerailFrame,QJ_Position_Addr);
  13.                                 SendBackFrame[0] = 0x10;
  14.                                 SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
  15.                                 SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);       
  16.         SendBack();                               
  17.                         }
  18.                        
  19.                         else if(SerailFrame == STMFLASH_ReadHalfWord(QJ_Position_Addr))
  20.                         {
  21.                                 switch(OrderFrame)
  22.                                 {
  23.                                         case 0x02:
  24.                                                 //读状态:命令+密钥(0xAA)+设备类型+设备编号+00+00+CRC
  25.                                           //返回格式:命令+设备类型+设备编号+灯丝状态+故障信息+00+CRC
  26.                                                 //参数:cv位置
  27.                                                 SendBackFrame[0] = 0x20;
  28.                                                 SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
  29.                                           SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
  30.                                                 SendBackFrame[3] = STMFLASH_ReadHalfWord(DS_State_Addr);
  31.                                                 SendBackFrame[4] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
  32.                                                 SendBack();
  33.                                                 break;
  34.                                         case 0x03:
  35.                                                 //写状态:命令+密钥(0xAA)+设备类型+设备编号+故障信息+00+CRC
  36.                                           //返回格式:命令+设备类型+设备编号+故障信息+00+00+CRC
  37.                                                 //参数:故障内容
  38.                                        
  39.                                                 Write_CV(Context5Frame,Fault_Setting_Addr);
  40.                                                 SendBackFrame[0] = 0x30;
  41.                                                 SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
  42.                                           SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
  43.                                                 SendBackFrame[3] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
  44.                                                 SendBack();
  45.                                                 break;
  46.                                         case 0x04:
  47.                                                 //读区间状态:命令+密钥(0xAA)+设备类型+设备编号+00+00+CRC
  48.                                           //返回格式:命令+设备类型+设备编号+最近四个分区的状况+00+00+CRC
  49.                                           //返回此区间前4个区间的状态
  50.                                                 SendBackFrame[0] = 0x40;
  51.                                                 SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
  52.                                           SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
  53.                                                 SendBackFrame[3] = QJ_Situation();
  54.                                                 SendBack();
  55.                                                 break;
  56.                                        
  57.                                         default:break;
  58.                                        
  59.                                 }
  60.                         }
  61.                        
  62.                 }
  63.                
  64.                 //区间信息广播帧;不产生返回帧
  65.                 if(OrderFrame == 0x05 && CRCCHECK && TypeFrame == TongGuoXHJ && key)
  66.                 {
  67.                         //第一组数据区间1~8;9~16;17~24
  68.                         if(AccessFrame == 0x01)
  69.                         {
  70.                                 Write_CV(rs485buf[3],FQ_State_1_8_Addr);
  71.                                 Write_CV(rs485buf[4],FQ_State_9_16_Addr);
  72.                                 Write_CV(rs485buf[5],FQ_State_17_24_Addr);
  73.                         }
  74.                         //第二组数据区间25~32;33~40;41~48
  75.                         if(AccessFrame == 0x02)
  76.                         {
  77.                                 Write_CV(rs485buf[3],FQ_State_25_32_Addr);
  78.                                 Write_CV(rs485buf[4],FQ_State_33_40_Addr);
  79.                                 Write_CV(rs485buf[5],FQ_State_41_48_Addr);
  80.                         }
  81.                         //第三组数据区间49~56;57~64
  82.                         if(AccessFrame == 0x03)
  83.                         {
  84.                                 Write_CV(rs485buf[3],FQ_State_49_56_Addr);
  85.                                 Write_CV(rs485buf[4],FQ_State_57_64_Addr);
  86.                         }
  87.                         //单帧区域广播;命令+密钥(帧类型)+设备类型+区间Sector(0~7;可扩展)+区间信息+00+CRC
  88.                         if(AccessFrame == 0x10)
  89.                         {
  90.                                 Write_CV(Context5Frame,FQ_State_1_8_Addr * 2 * (int)SerailFrame);//待测试(int)SerailFrame
  91.                         }
  92.                 }
复制代码
4,点灯部分还未调试完成,后续发帖再写


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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