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.

410 lines
13 KiB

5 years ago
//////////////////////////////////////////////////////////////////////////
/// 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
******************************************************************************/