////////////////////////////////////////////////////////////////////////// /// 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 ******************************************************************************/