forked from ccsens_hardware/stc_ttss_encryption
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
13 KiB
409 lines
13 KiB
//////////////////////////////////////////////////////////////////////////
|
|
/// COPYRIGHT NOTICE
|
|
/// Copyright (c) 2018, 传控科技
|
|
/// All rights reserved.
|
|
///
|
|
/// @file tpc_fsk.c
|
|
/// @brief transaction protocol control of fsk
|
|
///
|
|
///(本文件实现的功能的详述)
|
|
///
|
|
/// @version 1.1 CCsens technology
|
|
/// @author CC
|
|
/// @date 20150102
|
|
///
|
|
///
|
|
/// @version 1.2 CCsens technology
|
|
/// @author CC
|
|
/// @date 20180308
|
|
/// @info 整理
|
|
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
/*****************************************************************************
|
|
@version 1.2
|
|
update by cc @201501101001
|
|
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是
|
|
个需要平衡的事情.
|
|
|
|
clib/uartlib.c:
|
|
公用的函数 和硬件无关
|
|
接收各类协议的处理函数
|
|
放置串行模式(串口等其他通讯总线类的输出)输出的函数,
|
|
一些覆盖模式输出的(lcd等固屏输出的)的也可使用
|
|
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
msp/uartx.c 底层代码 和cpu相关
|
|
L0_UART0_Init
|
|
UART0_IRQHandler
|
|
L0_Usend_uc----------s_at0
|
|
-----------------------------------------------------------------------------------------
|
|
********************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __TPC_UART_H_
|
|
#define __TPC_UART_H_
|
|
|
|
#include "../clib/Type.h"
|
|
#include "../bsp/bsp_config.h"
|
|
|
|
|
|
// 20170609
|
|
|
|
///-----------------------------------------------------
|
|
|
|
|
|
|
|
//L0_type_byte(ts_cmd_pro0)[]
|
|
//#define D_CMD_Filter1 0xA5
|
|
//#define D_CMD_Filter2 0x5A
|
|
#define D_CMD_Filter1 0x0a
|
|
#define D_CMD_Filter2 0x0d
|
|
|
|
#define D_CMD_Filter1_ff 0xFF
|
|
#define D_CMD_Filter2_fe 0xFE
|
|
|
|
|
|
|
|
///协议类型: 十六进制协议1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
/// 发送的数据为有fx开头的十六进制的短协议,和长协议的区别除了帧头简化为1个字节外,数据的长度也是比较精简,大部分按位操作的,适合低波特率rf433之类的传播
|
|
///定长5个 适合于传感器定时上传
|
|
/// R1
|
|
///位数 7 6 5 4 3 2 1 0
|
|
///定义 动作传感器AS1 (0---15) 动作传感器AS2 (0---15)
|
|
|
|
/// R2
|
|
///位数 7 6 5 4 3 2 1 0
|
|
///定义 气压Press (0---15) open mic
|
|
|
|
/// R3
|
|
///位数 7 6 5 4 3 2 1 0
|
|
///定义 Temp (0---15) Gsensor(0---15)
|
|
|
|
typedef struct
|
|
{//8byte
|
|
/////////
|
|
vU8 as2:4;
|
|
vU8 as1:4;
|
|
/////////
|
|
vU8 mic:3;
|
|
vU8 open:1;
|
|
vU8 press:4;
|
|
////////////////
|
|
vU8 Gsensor:4;
|
|
vU8 temp:4;
|
|
///////////
|
|
}TS_P_pc_dat;
|
|
|
|
typedef struct
|
|
{//8byte
|
|
/////////
|
|
U8 cameraBoardPower; //当前行第4个点采集的图像数据
|
|
vU16 paperNum:10; //10bit纸张数据 表示最大量程1024 实际170张
|
|
vU16 cameraIndex:4; //摄像头编号
|
|
vU16 cameraWorking:1; //是否正常工作
|
|
vU16 LowPower:1; // =1 lowPower 提醒需要充电,或者未连接电池
|
|
}TS_P_paper;
|
|
|
|
//NUM: 0 1 2 3 4
|
|
// Fx R1 R2 R3 ocr
|
|
// F+从机 R1 R2 R3 校验
|
|
typedef struct _s_P_rf_
|
|
{//8byte
|
|
vU8 slave:4;
|
|
vU8 filter1:4;
|
|
////////////////
|
|
TS_P_paper r123;
|
|
vU8 ocr;
|
|
}TS_P_rf;
|
|
|
|
typedef struct _s_P_rf433_
|
|
{//8byte
|
|
vU8 ha;
|
|
// vU8 hb;
|
|
|
|
vU8 slave:4;
|
|
vU8 filter1:4;
|
|
////////////////
|
|
TS_P_paper r123;
|
|
vU8 ocr;
|
|
/// vU8 hc;
|
|
}TS_P_rf433;
|
|
|
|
//NUM: 0 1 2 3 4
|
|
// Fx R1 R2 R3 ocr
|
|
// F+从机 R1 R2 R3 校验
|
|
|
|
typedef struct
|
|
{//8byte
|
|
vU8 slave:4;
|
|
vU8 filter1:4;
|
|
////////////////
|
|
vU8 G1;
|
|
////////////////
|
|
vU8 G2;
|
|
////////////////
|
|
vU8 Tmp:4;
|
|
vU8 Press:4;
|
|
////////////////
|
|
vU8 ocr;
|
|
}TS_P_as;
|
|
|
|
typedef struct
|
|
{//8byte
|
|
vU8 slave:4;
|
|
vU8 filter1:4;
|
|
////////////////
|
|
vU8 cmd;
|
|
////////////////
|
|
vU8 R2;
|
|
////////////////
|
|
vU8 R3;
|
|
////////////////
|
|
vU8 ocr;
|
|
}TS_P_debug;
|
|
|
|
|
|
#define D_HETU_FX_fi 0xa0 ///2018.7.7
|
|
#define D_HETU_FX_H4 0xf0 ///2018.7.7
|
|
|
|
#define D_HETU_FX_buf_max 4 //max 是是指实际的数量,num或者cnt是指当时的
|
|
/// Hex RTU Protocol 0xFx
|
|
typedef struct
|
|
{//8byte
|
|
vU8 reg;
|
|
vU8 n;
|
|
vU8 head; //接收标志头标志
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 num;
|
|
// vU8 cmd;
|
|
vU8 ocr;
|
|
// vU8 *sp;
|
|
U8 buf[D_HETU_FX_buf_max+1];
|
|
}TS_Handle_PH1;
|
|
|
|
|
|
extern void L1_s2b_PH1 (TS_Handle_PH1 *p);// reentrant;
|
|
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
///协议类型: 十六进制协议2->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
/// 发送的数据为有ff fe开头的十六进制的长协议,内有数据数量
|
|
///FF FE 52 03 98 77 88 99 地址为0x52的从机, 向PC发送了3个数据0x77,0x88,0x99
|
|
|
|
///FF FE 06 03 e5 77 88 99 命令(0x06)携带了3个数据0x77,0x88,0x99;校验为0x98(=0x06+0x03+0x77+0x88+0x99三个数据的和)
|
|
///附:校验位=0x12+0x34+0x56=0x9c;取低位字节得到OCR=0x9c
|
|
|
|
typedef struct
|
|
{//8byte
|
|
vU8 filter1;
|
|
vU8 filter2;
|
|
vU8 addr; //发送方的地址或命令
|
|
vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围
|
|
vU8 ocr;
|
|
vU8 buf[4];//--->_s_P_pc_dat_
|
|
}TS_P_pc;
|
|
|
|
// FF FE 10 02 0C 51 03
|
|
// cashe[1] cashe[0] 本机 数量 校验 数据1 从机 数据2 命令
|
|
// filter2 filter1
|
|
struct _s_PH2_FFFE_
|
|
{//8byte
|
|
vU8 cashe[2];
|
|
vU8 reg;
|
|
vU8 max; //接收到的数目的最大值
|
|
vU8 head_0;
|
|
vU8 head_1;
|
|
// vU8 sub_num; //接收到的数目注意数据长度的范围
|
|
vU8 head; //接收标志头标志
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 num;
|
|
vU8 *sp;
|
|
TS_P_pc s_FF;
|
|
// U8 pro[16]; ///解析协议用
|
|
};
|
|
|
|
extern void L1_s2b_PH2(struct _s_PH2_FFFE_ *p);// reentrant;
|
|
|
|
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议
|
|
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
|
|
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
|
|
/// 校验码的范围为
|
|
#define TS_PH3_FILTER0 0xFF
|
|
#define TS_PH3_FILTER1 0xFE
|
|
|
|
#define D_s_PH3_ccmodbus_max (16 + 8)
|
|
typedef struct
|
|
{
|
|
U8 filter0;
|
|
U8 filter1;
|
|
U8 num;
|
|
U8 src; //源设备ID
|
|
U8 dst; //目标设备ID
|
|
U8 oper;
|
|
U8 buf[D_s_PH3_ccmodbus_max - 8];
|
|
U8 crc[2];
|
|
}TS_PH3_ccmodbus;
|
|
|
|
typedef struct
|
|
{//8byte
|
|
U8 cashe[2];
|
|
U8 reg;
|
|
U8 max; //接收到的数目的最大值
|
|
U8 head_0;
|
|
U8 head_1;
|
|
// vU8 sub_num; //接收到的数目注意数据长度的范围
|
|
vU8 head; //接收标志头标志
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 num;
|
|
vU8 *sp;
|
|
U8 _buf[D_s_PH3_ccmodbus_max]; ///解析协议用
|
|
U8 buf[D_s_PH3_ccmodbus_max];
|
|
}TS_Handle_PH3;
|
|
|
|
extern void L1_s2b_PH3_init(TS_Handle_PH3 *p);
|
|
extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant;
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
///协议类型: 字符型协议1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
/// 发送的数据为以回车换行(即0x0a 0x0d)为结尾的字符型长协议,内有意义比较明确的命令字符和对应的数据,适合debug和速率要求不高,数据量
|
|
/// 不大的场合
|
|
|
|
///-----------------------------------------------------------------------------------------
|
|
#define D_s_SSTR_0D0A_len 16 //str类的协议需要长度大一些,容易bug的地方,限制为接收64bytes的数据
|
|
struct _s_PC1_0D0A_
|
|
{//8byte
|
|
vU8 reg;
|
|
// vU8 sub_num; //接收到的数目注意数据长度的范围
|
|
vU8 head; //接收标志头标志
|
|
|
|
vU8 cashe[2];
|
|
//vU8 filter1;
|
|
//vU8 filter2;
|
|
vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围
|
|
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 max; //接收到的数目的最大值
|
|
vU8 buf[D_s_SSTR_0D0A_len+1];//buffer 的第一位是 长度
|
|
// U8 pro[16]; ///解析协议用
|
|
};
|
|
extern void L1_s2b_PC1(struct _s_PC1_0D0A_ *p);// reentrant;
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
|
|
|
|
///modebus协议通讯使用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
#ifdef doc_98098908
|
|
///Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011。
|
|
////这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快 [1] 。
|
|
////ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译码和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,
|
|
///用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较慢的机器
|
|
///01 16 1000 1234 ABCD
|
|
///这段代码的意思 是 向 地址 01 的 控制器 写入 1000 1234 。 就是这么简单
|
|
////地址域 就是指 从站的地址,比如一个变频器,或者是一个仪表,这个地址就是它的通讯地址
|
|
///功能码 就是你要做的事情,通讯的目的 就是读写数据,所以 MODBUS 功能码虽然很多,但是只有两个是我们常用的,就是读和写。
|
|
///读的功能码是03 写的功能码是16,注意,这里的读写都是一次性写16个位,也就是一个WORD.
|
|
///Address Function Data Check
|
|
///8-Bits 8-Bits N x 8-Bits 16-Bits
|
|
/// 功能(Function)域
|
|
/// 功能域代码告诉了被寻址到的终端执行何种功能。下表列出了该系列仪表用到的功能码,以及它们的意义和功能。
|
|
/// 代码 意义 行为
|
|
/// 03 读数据寄存器 获得一个或多个寄存器的当前二进制值
|
|
/// 16 预置多寄存器 设定二进制值到一系列多寄存器中(不对ACRXXXE开放)
|
|
|
|
|
|
///离散量、开关量、数字量都是对同一类型信号的不同说法,
|
|
///0表示断开,1表示接通,在PLC和类似控制设备中,都是一种布尔型的变量?
|
|
///T谧远///像PLC中的Y/Q,均是这种类型的信号
|
|
|
|
|
|
|
|
|
|
///cc改进版的modebus协议,添加了一个帧头
|
|
/// ff fe num add function dat check
|
|
#endif
|
|
|
|
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
|
|
|
|
///协议通讯使用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
#define D_s_protocol_len 32
|
|
struct _s_protocol_
|
|
{//8byte
|
|
vU8 rbr;
|
|
vU8 reg;
|
|
vU8 cashe[3];
|
|
vU8 filter1;
|
|
vU8 filter2;
|
|
vU8 (*pfun_get)(void);
|
|
vU8 num; //接收到的数目注意数据长度的范围
|
|
vU8 sub_num; //接收到的数目注意数据长度的范围
|
|
vU8 head; //接收标志头标志
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 data_ok; //接收协议ok标志
|
|
vU8 ucXor;
|
|
vU8 array[D_s_protocol_len];//buffer 的第一位是 长度
|
|
vU8 buf[D_s_protocol_len];//buffer 的第一位是 长度
|
|
vU8 buf2[12];//buffer 的第一位是 长度
|
|
};
|
|
|
|
extern void L1_uart_2buf(struct _s_protocol_ *p);
|
|
|
|
|
|
|
|
//485
|
|
///协议类型: 十六进制协议2 带地址判定的 第二个是地址->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
#define D_HETU_FXA 0xaa
|
|
|
|
#define D_HETU_FXA_buf_max 8 //max 是是指实际的数量,num或者cnt是指当时的
|
|
/// Hex RTU Protocol 0xFx
|
|
typedef struct
|
|
{//8byte
|
|
vU8 reg;
|
|
vU8 n;
|
|
vU8 head; //接收标志头标志
|
|
vU8 ok; //接收协议ok标志
|
|
vU8 num;
|
|
vU8 add; ///数据地址
|
|
vU8 ocr;
|
|
// vU8 *sp;
|
|
U8 buf[D_HETU_FXA_buf_max + 1];
|
|
}TS_Handle_PH1A;
|
|
|
|
typedef struct
|
|
{
|
|
vU8 filter;
|
|
vU8 src;
|
|
vU8 dst;
|
|
vU8 dat[4];
|
|
vU8 ocr;
|
|
}TS_PH1A_DAT;
|
|
|
|
extern void L1_s2b_PH1A (TS_Handle_PH1A *p);
|
|
|
|
|
|
#endif /* end __TPC_UART_H_ */
|
|
/*****************************************************************************
|
|
** End Of File
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|