diff --git a/keilp/cc_as_stc02_gsm_main.uvproj b/keilp/cc_as_stc02_gsm_main.uvproj
index a69e4ec..c314c7e 100644
--- a/keilp/cc_as_stc02_gsm_main.uvproj
+++ b/keilp/cc_as_stc02_gsm_main.uvproj
@@ -401,6 +401,21 @@
1
..\source\app\app_task_485_control.c
+
+ app_task_tcp.c
+ 1
+ ..\source\app\app_task_tcp.c
+
+
+ app_task_tcp_control.c
+ 1
+ ..\source\app\app_task_tcp_control.c
+
+
+ app_task_gm35.c
+ 1
+ ..\source\app\app_task_gm35.c
+
@@ -471,6 +486,11 @@
1
..\source\bsp\bsp_config.c
+
+ bsp_gm35.c
+ 1
+ ..\source\bsp\bsp_gm35.c
+
@@ -506,6 +526,11 @@
1
..\source\tpc\tpc_modbus.c
+
+ tpc_ccmodbus.c
+ 1
+ ..\source\tpc\tpc_ccmodbus.c
+
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym
index 5498516..bcc9a99 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym and b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc
index 98ff891..6e46b1c 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc and b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf
index bbd89cd..5e58743 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf and b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm
index aa2bdf7..20f8fa1 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm and b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr
index c4375ae..c35d4ea 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr and b/si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.siproj b/si4/soft_gsm_main.si4project/soft_gsm_main.siproj
index 50061f1..6eecf8a 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.siproj and b/si4/soft_gsm_main.si4project/soft_gsm_main.siproj differ
diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.siwork b/si4/soft_gsm_main.si4project/soft_gsm_main.siwork
index 591c26d..f770143 100644
Binary files a/si4/soft_gsm_main.si4project/soft_gsm_main.siwork and b/si4/soft_gsm_main.si4project/soft_gsm_main.siwork differ
diff --git a/source/app/app_common.c b/source/app/app_common.c
index 6e83d53..aacbd4e 100644
--- a/source/app/app_common.c
+++ b/source/app/app_common.c
@@ -11,7 +11,7 @@
#define LEN_GPRS_TCP_DATA_ACK 8
struct printer_maintenance_global G;
-TS_PH3_ccmodbus_ack ccmodbus_ack;
+//TS_PH3_ccmodbus_ack ccmodbus_ack;
U8 ccmodbus_len = 0;
vU8 gprsTcpPkg_Signin[LEN_GPRS_TCP_PKG_AT_SIGNIN] = {0xFF,0xFE,0x0,0x2A};
vU8 gprsdataack[LEN_GPRS_TCP_DATA_ACK] = {0xFF,0xFE,0x0,0x4,0x11,0x95,0x8F,0xCD};
@@ -19,82 +19,133 @@ vU8 gprsdataack[LEN_GPRS_TCP_DATA_ACK] = {0xFF,0xFE,0x0,0x4,0x11,0x95,0x8F,0xCD}
void Lu_register_init()
{
U8 i = 0;
- G.total_weight = 0;
+ G.p.slaverId = 0x10;
+ G.p.wisdom_car_no = 0x01;
+ G.p.thrombolytic_ratio = 9; //0.9
+ G.p.bolus_ratio = 9; //0.9
+ G.p.hold_ratio = 1; //0.1
+
+ G.total_weight = 50000;
+ G.thrombolytic_val = G.bolus_val = G.hold_val = 40000;
+ G.asga.xaxis = G.asga.yaxis = G.asga.zaxis = 22;
G.rfid = 0;
for(i=0;i无效 1:暂时有效 2->永久有效
+ G.md_slaver_info[0].slaver = SLAVER_DW20_ID;
+ G.md_slaver_info[0].oper = MODBUS_OPER_READ;
+ G.md_slaver_info[0].reg = 0x02;
+ G.md_slaver_info[0].regnum = 0x02;
+ G.md_slaver_info[0].mask = 2; //0->无效 1:暂时有效 2->永久有效
+
+ G.md_slaver_info[1].slaver = SLAVER_ASGA03_ID; //倾角XYZ
+ G.md_slaver_info[1].oper = MODBUS_OPER_READ;
+ G.md_slaver_info[1].reg = 0x04;
+ G.md_slaver_info[1].regnum = 0x03;
+ G.md_slaver_info[1].mask = 2;
- G.slaver_info[1].slaver = 0x12;
- G.slaver_info[1].oper = MODBUS_OPER_WRITE_M;
- G.slaver_info[1].reg = 0x02;
- G.slaver_info[1].regnum = 0x02;
- G.slaver_info[1].bytes = 4;
- G.slaver_info[1].buf = (U8*)&G.total_weight;
- G.slaver_info[1].mask = 0;
-
- G.slaver_info[2].slaver = 0x12;
- G.slaver_info[2].oper = MODBUS_OPER_WRITE_M;
- G.slaver_info[2].reg = 0x04;
- G.slaver_info[2].regnum = 0x01;
- G.slaver_info[2].bytes = 2;
- G.slaver_info[2].buf = (U8*)&G.rfid;
- G.slaver_info[2].mask = 0;
-
- G.slaver_info[3].slaver = 0x13;
- G.slaver_info[3].oper = MODBUS_OPER_WRITE_M;
- G.slaver_info[3].reg = 0x02;
- G.slaver_info[3].regnum = 0x02;
- G.slaver_info[3].bytes = 4;
- G.slaver_info[3].buf = (U8*)&G.total_weight;
- G.slaver_info[3].mask = 0;
-
- G.slaver_info[4].slaver = 0x13;
- G.slaver_info[4].oper = MODBUS_OPER_WRITE_M;
- G.slaver_info[4].reg = 0x04;
- G.slaver_info[4].regnum = 0x01;
- G.slaver_info[4].bytes = 2;
- G.slaver_info[4].buf = (U8*)&G.rfid;
- G.slaver_info[4].mask = 0;
+ G.md_slaver_info[2].slaver = SLAVER_SHOW01_ID; //重量2,溶栓,团注,维持
+ G.md_slaver_info[2].oper = MODBUS_OPER_WRITE_M;
+ G.md_slaver_info[2].reg = 0x02;
+ G.md_slaver_info[2].regnum = 0x05;
+ G.md_slaver_info[2].bytes = G.md_slaver_info[2].regnum * 2;
+ G.md_slaver_info[2].buf = (U8*)&G.total_weight;
+ G.md_slaver_info[2].mask = 0;
+
+ G.md_slaver_info[3].slaver = SLAVER_SHOW01_ID; //RFID
+ G.md_slaver_info[3].oper = MODBUS_OPER_WRITE_M;
+ G.md_slaver_info[3].reg = 0x07;
+ G.md_slaver_info[3].regnum = 0x01;
+ G.md_slaver_info[3].bytes = G.md_slaver_info[3].regnum * 2;
+ G.md_slaver_info[3].buf = (U8*)&G.rfid;
+ G.md_slaver_info[3].mask = 0;
+
+ for(i=0;iok )
-
- {
- U8 array[D_s_SSTR_0D0A_len+1];
- U8 num = p->buf[0];
- byte_copy_uc(array,p->buf+1,num);
- p->ok = 0;
-
- array[num] = 0;
- L3_protocol_handler_uart4_fun(array,0);
- }
-}
void L3_task_a9_rcv_handle(TS_Handle_PH3 *p)
{
@@ -61,6 +47,20 @@ void L3_task_a9_rcv_handle(TS_Handle_PH3 *p)
}
#endif
+void L3_UARTcom4_exp_protocol(TS_Handle_0d0a *p)
+{
+ if (1 == p->ok )
+ {
+ U8 array[D_s_SSTR_0D0A_len+1];
+ U8 num = p->buf[0];
+ byte_copy_uc(array,p->buf+1,num);
+ p->ok = 0;
+
+ array[num] = 0;
+ L3_protocol_handler_uart4_fun(array,0);
+ }
+}
+
void L3_UARTcom3_exp_protocol(TS_Handle_PH3 *p)
{
if (1 == p->ok)
@@ -126,3 +126,4 @@ void L3_UARTcom2_exp_protocol(TS_Handle_PH1A *p)
}
}
#endif
+
diff --git a/source/app/app_drv.h b/source/app/app_drv.h
index de200b0..c1d8ac0 100644
--- a/source/app/app_drv.h
+++ b/source/app/app_drv.h
@@ -26,7 +26,7 @@ typedef struct
extern TS_drv_ ts_drv[TS_DRV_MAX];
-extern void L3_UARTcom2_exp_protocol(TS_Handle_PH1A *p);
+//extern void L3_UARTcom2_exp_protocol(TS_Handle_PH1A *p);
extern void L3_UARTcom0_exp_protocol(TS_Handle_PH3 *p);
extern void L3_UARTcom3_exp_protocol(TS_Handle_PH3 *p);
extern void L3_UARTcom4_exp_protocol(TS_Handle_0d0a *p);
diff --git a/source/app/app_task_485.c b/source/app/app_task_485.c
index 3669af2..e30e507 100644
--- a/source/app/app_task_485.c
+++ b/source/app/app_task_485.c
@@ -3,8 +3,8 @@
#include "../msp/uart2.h"
#include "../app/app_common.h"
-#define MODBUS_SLAVER_DW20_REG_START 0x02
-#define MODBUS_SLAVER_DW20_REG_NUM 0x02
+//#define MODBUS_SLAVER_DW20_REG_START 0x02
+//#define MODBUS_SLAVER_DW20_REG_NUM 0x02
#define MODBUS_SLAVER_RETRY_MAX_TIME 3
TS_485 ts_485;
@@ -30,9 +30,27 @@ void L3_task_485_handle(TS_485 *s)
L2_task_go(D_task_485_constructor_modbus_pkg);
TTSS_Task_step(D_task_485_constructor_modbus_pkg)
- if(G.slaver_info[s->slaverIndex].mask > 0)
+ #if 0
+ if(s->slaverIndex == 1)
{
- s->pkglen = L3_pack_modbus(&s->loopPkg,G.slaver_info + s->slaverIndex);
+ L0_uart0_uc(s->slaverIndex);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].slaver);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].oper);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].reg);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].regnum);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].bytes);
+ Lc_delay_ms(100);
+ L0_uart0_uc(G.md_slaver_info[s->slaverIndex].mask);
+ }
+ #endif
+ if(G.md_slaver_info[s->slaverIndex].mask > 0)
+ {
+ s->pkglen = L3_pack_modbus(&s->loopPkg,G.md_slaver_info + s->slaverIndex);
s->ackFlag = 0;
s->retryTimes = 0;
L2_task_go(D_task_485_send_modbus_pkg);
@@ -57,10 +75,10 @@ void L3_task_485_handle(TS_485 *s)
{
s_uart2_rec.ok = 0;
s->pAckPkg = (TS_PH4_modbus*)(s_uart2_rec.buf);
- if(s->pAckPkg->salver == G.slaver_info[s->slaverIndex].slaver)
+ if(s->pAckPkg->salver == G.md_slaver_info[s->slaverIndex].slaver)
{
s->ackFlag = 1;
- if(s->pAckPkg->salver == G.slaver_info[0].slaver && s->pAckPkg->oper == MODBUS_OPER_READ)
+ if(s->pAckPkg->salver == G.md_slaver_info[0].slaver && s->pAckPkg->oper == MODBUS_OPER_READ)
{
G.total_weight =
(S32)(s->pAckPkg->buf[1]) << 24 | (S32)(s->pAckPkg->buf[2]) << 16 | (S32)(s->pAckPkg->buf[3]) << 8
@@ -71,9 +89,9 @@ void L3_task_485_handle(TS_485 *s)
s->retryTimes++;
if(s->ackFlag || s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME)
{
- if(G.slaver_info[s->slaverIndex].mask == 1)
+ if(G.md_slaver_info[s->slaverIndex].mask == 1)
{
- G.slaver_info[s->slaverIndex].mask = 0;
+ G.md_slaver_info[s->slaverIndex].mask = 0;
}
L2_task_go(D_task_485_switch_next_slaver);
}
diff --git a/source/app/app_task_485_control.c b/source/app/app_task_485_control.c
index 5566c54..c1dd4a1 100644
--- a/source/app/app_task_485_control.c
+++ b/source/app/app_task_485_control.c
@@ -2,10 +2,6 @@
#include "../msp/uart0.h"
#include "../app/app_common.h"
-#define MODBUS_SLAVER_DW20_REG_START 0x02
-#define MODBUS_SLAVER_DW20_REG_NUM 0x02
-#define MODBUS_SLAVER_RETRY_MAX_TIME 3
-
TS_485_control ts_485_control;
void L3_task_485_control_init(void)
@@ -24,23 +20,19 @@ void L3_task_485_control_handle(TS_485_control *s)
L2_task_go(D_task_485_control_01);
TTSS_Task_step(D_task_485_control_01)
- //L0_uart0_ulhex(s->total_weight_pool);
- //Lc_delay_ms(70);// 2000--7s
- //L0_uart0_uc(' ');L0_uart0_uc(' ');L0_uart0_uc(' ');
- //Lc_delay_ms(70);// 2000--7s
- //L0_uart0_0d0a();
- //L0_uart0_ulhex(G.total_weight);
if(s->total_weight_pool != G.total_weight)
{
- G.slaver_info[1].mask = 1;
- //G.slaver_info[3].mask = 1;
+ G.thrombolytic_val = G.total_weight / 100 * G.p.thrombolytic_ratio;
+ G.bolus_val = G.thrombolytic_val / 10 * G.p.bolus_ratio;
+ G.hold_val = G.thrombolytic_val / 10 * G.p.hold_ratio;
+
+ G.md_slaver_info[2].mask = 1;
s->total_weight_pool = G.total_weight;
}
if(s->rfid_pool != G.rfid)
{
- G.slaver_info[2].mask = 1;
- //G.slaver_info[4].mask = 1;
+ G.md_slaver_info[3].mask = 1;
s->rfid_pool = G.rfid;
}
L2_task_go(D_task_485_control_01);
diff --git a/source/app/app_task_gm35.c b/source/app/app_task_gm35.c
index 7a7b732..34571fc 100644
--- a/source/app/app_task_gm35.c
+++ b/source/app/app_task_gm35.c
@@ -88,21 +88,12 @@ void L3_task_gm35_flow_init(void)
g_at_send_status.heart_flag = 0;
g_at_send_status.data_flag = 0;
g_at_send_status.ack_flag = 0;
- // g_at_send_status.pending_flag = 0;
g_at_send_status.ins_flag = 0;
- // g_at_send_status.ccid[20] = 0;
- // g_at_send_status.ccid_passwd[21] = 0;
g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s; //重新上电和检测到断开时设置
g_at_send_status.ins_stmp = 0; //每次发送指令时设置
g_at_send_status.tcp_last_recv_stmp = 0; //连接成功和接收到数据时设置
-
- //缓冲区清0
- // for(i=0;i= GM35_SEND_HEART_INTERVAL) //每隔60s发送心跳
- {
- L0_uart0_uc('x');
- g_at_send_status.heart_stmp = s_nos_tick.t_1s;
- L2_gprs_send_heart_pkg();
- }
-
- else if(s_nos_tick.t_1s - g_at_send_status.data_stmp >= GM35_SEND_DATA_INTERVAL) //每隔300s发送数据
- {
- L0_uart0_uc('y');
- g_at_send_status.data_stmp = s_nos_tick.t_1s;
- L2_gprs_send_report_pkg();
- }
- L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART_SUCCESS,D_Tdelay_1s);
- }
- else
+ if(0 == g_at_send_status.conn_ok)
{
L0_uart4_uc(0x1a); //关闭send
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART,D_Tdelay_300ms); //断线重连
}
-
+
TTSS_Task_end();
}
@@ -424,14 +383,13 @@ void L3_task_gm35_core_init(void)
{
g_at_send_status.gm35_reboot_times = 0;
- L3_task_gm35_daemon_init();
+ //L3_task_gm35_daemon_init();
L3_task_gm35_flow_init();
- //L3_task_gm35_send_init();
}
void L3_task_gm35_core_handle()
{
- L2_task_gm35_daemon_handle(&s_task_gm35_daemon);
+ //L2_task_gm35_daemon_handle(&s_task_gm35_daemon);
L2_task_gm35_flow_handle(&s_task_gm35_flow);
}
diff --git a/source/app/app_task_gm35.h b/source/app/app_task_gm35.h
index 36df026..021ee01 100644
--- a/source/app/app_task_gm35.h
+++ b/source/app/app_task_gm35.h
@@ -24,7 +24,7 @@
#define AT_INS_CCID "AT+CCID\r\n" //SIM卡查询指令
#define AT_INS_CREG "AT+CREG?\r\n" //网络查询指令
#define AT_INS_GPRS "AT+CGATT=1;+CGDCONT=1,\"IP\",\"CMNET\";+CGACT=1,1\r\n" //GPRS操作指令
-#define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"wx.yinzhimeng.com.cn\",9999\r\n"
+#define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"test.tall.wiki\",8195\r\n"
//#define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"weizezhao.imwork.net\",49809\r\n" //连接服务器
// #define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"43.249.193.233\",38916\r\n" //连接服务器
#define AT_INS_CIPSEND "AT+CIPSEND\r\n" //发送数据
diff --git a/source/app/app_task_tcp.c b/source/app/app_task_tcp.c
new file mode 100644
index 0000000..629c98f
--- /dev/null
+++ b/source/app/app_task_tcp.c
@@ -0,0 +1,93 @@
+#include "app_task_tcp.h"
+#include "../msp/uart0.h"
+#include "../msp/uart4.h"
+#include "../app/app_common.h"
+
+#define MODBUS_SLAVER_DW20_REG_START 0x02
+#define MODBUS_SLAVER_DW20_REG_NUM 0x02
+#define MODBUS_SLAVER_RETRY_MAX_TIME 3
+
+TS_tcp ts_tcp;
+
+void L3_task_tcp_init(void)
+{
+ L1_task_init(&ts_tcp.task);
+ L3_task_s_go(ts_tcp,D_task_init);
+ ts_tcp.slaverIndex = 0;
+ ts_tcp.pkglen = 0;
+ ts_tcp.retryTimes = 0;
+ ts_tcp.ackFlag = 0;
+}
+
+#define D_task_tcp_constructor_modbus_pkg 0x51
+#define D_task_tcp_send_modbus_pkg 0x52
+#define D_task_tcp_wait_modbus_ack 0x53
+#define D_task_tcp_switch_next_slaver 0x54
+
+void L3_task_tcp_handle(TS_tcp *s)
+{
+ TTSS_Task_init();
+ L2_task_go(D_task_tcp_constructor_modbus_pkg);
+
+ TTSS_Task_step(D_task_tcp_constructor_modbus_pkg)
+ if(G.ccmd_slaver_info[s->slaverIndex].mask > 0)
+ {
+ s->pkglen = L3_pack_ccmodbus(&s->loopPkg,G.ccmd_slaver_info + s->slaverIndex);
+ s->ackFlag = 0;
+ s->retryTimes = 0;
+ L2_task_go(D_task_tcp_send_modbus_pkg);
+ }
+ else
+ {
+ L2_task_go(D_task_tcp_switch_next_slaver);
+ }
+
+ TTSS_Task_step(D_task_tcp_send_modbus_pkg)
+ L0_uart4_sendArray((U8*)&s->loopPkg,s->pkglen);
+ s->sendStamp = s_nos_tick.t_5ms;
+ L2_task_go(D_task_tcp_wait_modbus_ack);
+
+ TTSS_Task_step(D_task_tcp_wait_modbus_ack)
+ if(s_nos_tick.t_5ms - s->sendStamp >= 20)
+ {
+ if(s_uart4_tcp_rec.ok)
+ {
+ s_uart4_tcp_rec.ok = 0;
+ s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart4_tcp_rec.sp);
+ if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver)
+ {
+ s->ackFlag = 1;
+ if(s->pAckPkg->slaver == G.ccmd_slaver_info[0].slaver && s->pAckPkg->oper == MODBUS_OPER_READ)
+ {
+ G.total_weight =
+ (S32)(s->pAckPkg->buf[1]) << 24 | (S32)(s->pAckPkg->buf[2]) << 16 | (S32)(s->pAckPkg->buf[3]) << 8
+ | (S32)(s->pAckPkg->buf[4]);
+ }
+ }
+ }
+ s->retryTimes++;
+ if(s->ackFlag || s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME)
+ {
+ if(G.ccmd_slaver_info[s->slaverIndex].mask == 1)
+ {
+ G.ccmd_slaver_info[s->slaverIndex].mask = 0;
+ }
+ L2_task_go(D_task_tcp_switch_next_slaver);
+ }
+ else
+ {
+ L2_task_go(D_task_tcp_send_modbus_pkg);
+ }
+ }
+
+ TTSS_Task_step(D_task_tcp_switch_next_slaver)
+ if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX)
+ {
+ s->slaverIndex = 0;
+ }
+ L2_task_go(D_task_tcp_constructor_modbus_pkg);
+
+ TTSS_Task_end();
+}
+
+
diff --git a/source/app/app_task_tcp.h b/source/app/app_task_tcp.h
new file mode 100644
index 0000000..74e050d
--- /dev/null
+++ b/source/app/app_task_tcp.h
@@ -0,0 +1,26 @@
+#ifndef APP_TASK_TCP
+#define APP_TASK_TCP
+
+#include "../ctask/task.h"
+#include "../tpc/tpc_ccmodbus.h"
+#include "app_common.h"
+
+typedef struct
+{
+ TS_task task;
+ TS_PH3_ccmodbus loopPkg;
+ TS_PH3_ccmodbus *pAckPkg;
+ U8 slaverIndex;
+ U8 pkglen;
+ U32 sendStamp;
+ U8 retryTimes;
+ U8 ackFlag;
+}TS_tcp;
+
+#define U485_TIMEOUT 3 //3 x 100ms = 300ms
+extern TS_tcp ts_tcp;
+
+extern void L3_task_tcp_init();
+extern void L3_task_tcp_handle(TS_tcp *s);
+
+#endif
diff --git a/source/app/app_task_tcp_control.c b/source/app/app_task_tcp_control.c
new file mode 100644
index 0000000..c3575d7
--- /dev/null
+++ b/source/app/app_task_tcp_control.c
@@ -0,0 +1,56 @@
+#include "app_task_tcp_control.h"
+#include "../msp/uart0.h"
+#include "../app/app_common.h"
+#include "../app/app_task_gm35.h"
+
+TS_tcp_control ts_tcp_control;
+
+void L3_task_tcp_control_init(void)
+{
+ L1_task_init(&ts_tcp_control.task);
+ L3_task_s_go(ts_tcp_control,D_task_init);
+ ts_tcp_control.conn_ok_pool = 0;
+ ts_tcp_control.tcp_send_stmp = 0;
+}
+
+#define D_task_tcp_control_01 0x51
+
+void L3_task_tcp_control_handle(TS_tcp_control *s)
+{
+ TTSS_Task_init();
+ L2_task_go(D_task_tcp_control_01);
+
+ TTSS_Task_step(D_task_tcp_control_01)
+ if(s->conn_ok_pool != g_at_send_status.conn_ok)
+ {
+ if(g_at_send_status.conn_ok)
+ {
+ //发送认证包
+ G.ccmd_slaver_info[0].mask = 1;
+
+ //发送流程开始包
+ if(G.flowStart == 0)
+ {
+ G.flowStart = 1;
+ G.ccmd_slaver_info[2].mask = 1;
+ }
+ ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s;
+ }
+ s->conn_ok_pool = g_at_send_status.conn_ok;
+ }
+
+ if(s->conn_ok_pool)
+ {
+ if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 4)
+ {
+ G.ccmd_slaver_info[3].mask = 1;
+ ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s;
+ }
+ }
+
+ L2_task_go(D_task_tcp_control_01);
+
+ TTSS_Task_end();
+}
+
+
diff --git a/source/app/app_task_tcp_control.h b/source/app/app_task_tcp_control.h
new file mode 100644
index 0000000..16efb7c
--- /dev/null
+++ b/source/app/app_task_tcp_control.h
@@ -0,0 +1,20 @@
+#ifndef APP_TASK_TCP_CONTROL
+#define APP_TASK_TCP_CONTROL
+
+#include "../ctask/task.h"
+#include "../tpc/tpc_ccmodbus.h"
+#include "app_common.h"
+
+typedef struct
+{
+ TS_task task;
+ vU8 conn_ok_pool;
+ vU32 tcp_send_stmp;
+}TS_tcp_control;
+
+extern TS_tcp_control ts_tcp_control;
+
+extern void L3_task_tcp_control_init();
+extern void L3_task_tcp_control_handle(TS_tcp_control *s);
+
+#endif
diff --git a/source/app/main.c b/source/app/main.c
index ae5c2c0..2f5260a 100644
--- a/source/app/main.c
+++ b/source/app/main.c
@@ -92,6 +92,9 @@ void L0_main_init(void)
L3_task_gm35_core_init();
L3_task_wdt_init(); //看门狗任务初始化
#endif
+
+ L2_gm35_init();
+ L3_task_gm35_core_init();
L3_task_485_init(); //485轮询任务初始化
L3_task_485_control_init();
}
@@ -125,7 +128,7 @@ void main(void)
{
s_nos_tick.t1s_heatbeart = 0;
//L0_uart0_uc('.');
- L0_uart0_sendArray("abcdefg", 7);
+ //L0_uart0_sendArray("abcdefg", 7);
}
//串口3 RFID接收
L3_UARTcom3_exp_protocol(&s_uart3_rec);
@@ -135,6 +138,19 @@ void main(void)
//master->slaver发送逻辑控制
L3_task_485_control_handle(&ts_485_control);
+
+#if 0
+ //gm35维持连接
+ L3_task_gm35_core_handle();
+ L3_UARTcom4_exp_protocol(&s_uart4_at_rec);
+
+ //tcp发送
+ L3_task_tcp_handle(&ts_tcp);
+
+ //master->slaver发送逻辑控制
+ L3_task_tcp_control_handle(&ts_tcp_control);
+#endif
+
#if 0
//看门狗
L3_task_wdt_handle(&s_task_wdt);
diff --git a/source/app/main.h b/source/app/main.h
index c670872..6f11a7f 100644
--- a/source/app/main.h
+++ b/source/app/main.h
@@ -80,11 +80,12 @@
#include "../app/app_task_wdt.h"
#include "../app/app_task_485.h"
#include "../app/app_task_485_control.h"
+#include "../app/app_task_tcp.h"
+#include "../app/app_task_tcp_control.h"
#include "../app/app_task_relay.h"
#include "../app/app_common.h"
#include "../app/app_paraid.h"
-
//////////////////////////////////////////////////////////////////
diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c
index 625a1de..ca6eab6 100644
--- a/source/bsp/bsp_config.c
+++ b/source/bsp/bsp_config.c
@@ -230,7 +230,7 @@ void L1_s2b_PH3_3(unsigned char sbufreg)
void L1_s2b_gm35(unsigned char sbufreg)
{
s_uart4_tcp_rec.reg = sbufreg;
- L1_a9_PH3(&s_uart4_tcp_rec);
+ L1_s2b_PH3(&s_uart4_tcp_rec);
if(0 == s_uart4_tcp_rec.head)
{
diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h
index f92c65b..baba87e 100644
--- a/source/bsp/bsp_config.h
+++ b/source/bsp/bsp_config.h
@@ -24,7 +24,8 @@
#include "../clib/bit.h"
#include "../tpc/tpc_modbus.h"
-#include "../tpc/tpc_uart.h"
+#include "../tpc/tpc_ccmodbus.h"
+//#include "../tpc/tpc_uart.h"
#include "../tpc/tpc_0d0a.h"
//#define D_iic_inspect
diff --git a/source/tpc/tpc_ccmodbus.c b/source/tpc/tpc_ccmodbus.c
new file mode 100644
index 0000000..1b5e7d7
--- /dev/null
+++ b/source/tpc/tpc_ccmodbus.c
@@ -0,0 +1,168 @@
+
+/*****************************************************************************
+update by cc @201501101001
+针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是
+个需要平衡的事情.
+
+uartcom/uartlib.c:
+公用的函数 和硬件无关
+放置串行模式(串口等其他通讯总线类的输出)输出的函数,
+一些覆盖模式输出的(lcd等固屏输出的)的也可使用
+ void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
+-----------------------------------------------------------------------------------------
+uartcom/uartcom0
+ 和uart相关的通讯协议 com + n
+ 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关
+
+typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------
+ L3_UARTcom0_exp_protocol 解析应用协议
+-----------------------------------------------------------------------------------------
+uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度
+公用的串口通讯定义
+ struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_
+ void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中
+--------------------------------------------------------------------------------------------
+msp/uartx.c 底层代码 和cpu相关
+ L0_UART0_Init
+ UART0_IRQHandler
+ L0_Usend_uc----------s_at0
+-----------------------------------------------------------------------------------------
+********************************************************************************/
+
+#include "tpc_ccmodbus.h"
+#include "../clib/clib.h"
+
+U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num)
+{
+ U8 bufsize = 4;
+ pmodbus->slaver = slaverId;
+ pmodbus->oper = MODBUS_OPER_READ;
+ pmodbus->buf[0] = reg >> 8 & 0xFF;
+ pmodbus->buf[1] = reg >> 0 & 0xFF;
+ pmodbus->buf[2] = num >> 8 * 0xFF;
+ pmodbus->buf[3] = num >> 0 & 0xFF;
+ crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
+ pmodbus->buf[bufsize] = pmodbus->crc[0];
+ pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
+
+ return bufsize + 2 + 2;
+}
+
+U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
+{
+ U8 bufsize = 4;
+ pmodbus->slaver = slaverId;
+ pmodbus->oper = MODBUS_OPER_WRITE;
+ pmodbus->buf[0] = reg >> 8 & 0xFF;
+ pmodbus->buf[1] = reg >> 0 & 0xFF;
+ pmodbus->buf[2] = buf[0];
+ pmodbus->buf[3] = buf[1];
+ crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
+ pmodbus->buf[bufsize] = pmodbus->crc[0];
+ pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
+
+ return bufsize + 2 + 2;
+}
+
+U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf)
+{
+ U8 bufsize = 5,i = 0;
+ pmodbus->slaver = slaverId;
+ pmodbus->oper = MODBUS_OPER_WRITE_M;
+ pmodbus->buf[0] = reg >> 8 & 0xFF;
+ pmodbus->buf[1] = reg >> 0 & 0xFF;
+ pmodbus->buf[2] = num >> 8 * 0xFF;
+ pmodbus->buf[3] = num >> 0 & 0xFF;
+ pmodbus->buf[4] = bytes;
+
+ for(i=0;ibuf[5+i] = buf[i];
+ }
+ crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes);
+ pmodbus->buf[bufsize + bytes] = pmodbus->crc[0];
+ pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1];
+
+ return bufsize + bytes + 2 + 2;
+}
+
+
+U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info)
+{
+ U8 pkglen = 0;
+ pccmodbus->filter1 = D_CMD_Filter1_ff;
+ pccmodbus->filter2 = D_CMD_Filter2_fe;
+ switch(slaver_info->oper)
+ {
+ case MODBUS_OPER_READ:
+ pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum);
+ break;
+ case MODBUS_OPER_WRITE:
+ pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf);
+ break;
+ case MODBUS_OPER_WRITE_M:
+ pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf);
+ break;
+ default:
+ break;
+ }
+ pccmodbus->num = pkglen;
+ return pkglen + 3;
+}
+
+
+///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
+/// 0 1 2 3 4 5 6 7 8 9 10
+/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
+void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant
+{
+ p->cashe[1] = p->cashe[0];
+ p->cashe[0] = p->reg;//
+
+ if (0 == p->head)
+ {
+ if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1))
+ {
+ p->head = 1;
+ p->max = D_s_PH3_ccmodbus_max - 1;
+ p->sp = (unsigned char *)&(p->ts_ccmodbus);
+ p->sp[0] = p->head_0;
+ p->sp[1] = p->head_1;
+ p->num = 1;
+ //p->ok = 1;
+ }
+ }else
+ {
+ p->num ++;
+ p->sp[p->num] = p->cashe[0];
+ if(p->num == 2)//数量 第3个数据
+ {
+ p->max = p->reg + 2;//
+ if(p->max >= D_s_PH3_ccmodbus_max)
+ {
+ p->max = D_s_PH3_ccmodbus_max - 1;
+ p->sp[p->num] = p->max - 2;
+ }
+ }
+ if(p->num >= p->max)
+ {
+ crc16(p->crc,&p->ts_ccmodbus.slaver,p->ts_ccmodbus.num - 2);
+ if(/*p->crc[0] == p->ts_ccmodbus.crc[1] && p->crc[1] == p->ts_ccmodbus.crc[0]*/ 1)
+ {
+ if (p->ok != 1)
+ {
+ //byte_copy_uc((U8*)&p->ts_ccmodbus,(U8*)&p->__ts_ccmodbus,p->max + 1);
+ p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文
+ }
+ }
+ p->num = 0; //放在if (p->ok != 1) 外
+ p->head = 0; //放在if (p->ok != 1) 外
+ }
+ }
+}
+
+
+
+/******************************************************************************
+** End Of File
+******************************************************************************/
diff --git a/source/tpc/tpc_ccmodbus.h b/source/tpc/tpc_ccmodbus.h
new file mode 100644
index 0000000..117e161
--- /dev/null
+++ b/source/tpc/tpc_ccmodbus.h
@@ -0,0 +1,113 @@
+//////////////////////////////////////////////////////////////////////////
+/// 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_CCMODBUS_H_
+#define __TPC_CCMODBUS_H_
+
+#include "../clib/Type.h"
+
+#define D_CMD_Filter1_ff 0xFF
+#define D_CMD_Filter2_fe 0xFE
+
+
+//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+///协议类型: 十六进制协议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 D_s_PH3_ccmodbus_max 64
+#define D_s_PH3_ccmodbus_min 4
+
+typedef struct
+{//8byte
+ vU8 filter1;
+ vU8 filter2;
+ vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围
+ vU8 slaver; //发送方的地址或命令
+ vU8 oper; //命令
+ vU8 buf[D_s_PH3_ccmodbus_max-2];//--->_s_P_pc_dat_
+ vU8 crc[2]; //crc16
+}TS_PH3_ccmodbus;
+
+typedef struct
+{//8byte
+ vU8 cashe[2];
+ vU8 reg;
+ vU8 max; //接收到的数目的最大值
+ vU8 head_0;
+ vU8 head_1;
+ vU8 head; //接收标志头标志
+ vU8 ok; //接收协议ok标志
+ vU8 num;
+ vU8 *sp;
+ TS_PH3_ccmodbus ts_ccmodbus;
+ vU8 crc[2];
+}TS_Handle_PH3;
+
+typedef struct
+{
+ U16 slaver;
+ U16 oper;
+ U16 reg;
+ U16 regnum;
+ U16 bytes;
+ U8 *buf;
+ U16 mask;
+}CCMD_SLAVER_INFO;
+
+extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info);
+extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant;
+
+#endif /* end __TPC_CCMODBUS_H_ */
+
diff --git a/source/tpc/tpc_uart.c b/source/tpc/tpc_uart.c
index cd89671..b9deeb6 100644
--- a/source/tpc/tpc_uart.c
+++ b/source/tpc/tpc_uart.c
@@ -93,6 +93,7 @@ void L1_s2b_PH1 (struct _s_PH1_FX_ *p)// reentrant
#endif
+#if 0
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
/// 0 1 2 3 4 5 6 7 8 9 10
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
@@ -143,8 +144,10 @@ void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant
}
}
}
+#endif
+
-#if 1
+#if 0
void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
{
@@ -157,7 +160,7 @@ void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
{
p->head = 1;
p->max = D_s_PH3_ccmodbus_max - 1;
- p->sp = (unsigned char *)&(p->__ts_ccmodbus);
+ p->sp = (unsigned char *)&(p->ts_ccmodbus);
p->sp[0] = p->head_0;
p->sp[1] = p->head_1;
p->num = 1;
@@ -169,15 +172,6 @@ void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
p->sp[p->num] = p->cashe[0];
if(p->num == 2)//数量 第3个数据
{
- if(p->cashe[0] == 0)
- {
- if(p->len_retry == 0) //丢弃本字节,探测下一个字节作为长度,以兼容:长度为0E和00 0E的协议
- {
- p->len_retry = 1;
- p->num--;
- return;
- }
- }
p->max = p->cashe[0] + 2;//
if((p->max > D_s_PH3_ccmodbus_max) || (p->max < D_s_PH3_ccmodbus_min)) //无效协议
{
@@ -203,7 +197,7 @@ void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
}
}
-#else
+
void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
{
p->cashe[1] = p->cashe[0];
@@ -256,7 +250,6 @@ void L1_a9_PH3(TS_Handle_PH3 *p)// reentrant
}
}
}
-#endif
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
@@ -362,6 +355,8 @@ void L1_a9_PH3_1(TS_Handle_PH3 *p)// reentrant
}
}
+#endif
+
#if 0 //相关功能移动到 tpc_ffee.c
//NUM: 0 1 2 3 4 5 6 7
@@ -460,6 +455,7 @@ void L1_s2b_PC1(struct _s_PC1_0D0A_ *p)// reentrant
#endif
+#if 0
/// 在串口中断中调用 uart hardware to buffer 串口到缓存中
void L1_s2b_PC2(struct _s_protocol_ *p)
{
@@ -508,13 +504,14 @@ void L1_s2b_PC2(struct _s_protocol_ *p)
}
else {}
}
+#endif
-
+#if 0
int checkCRC16(TS_PH3_ccmodbus *pCcmodbus)
{
U8 crc[2],dataCrc[2],num;
num = pCcmodbus->num;
- crc16(crc,&(pCcmodbus->addr),num - 2);
+ crc16(crc,&(pCcmodbus->slaver),num - 2);
dataCrc[1] = (pCcmodbus->buf[num - 4]) & 0xFF;
dataCrc[0] = (pCcmodbus->buf[num - 3]) & 0xFF;
@@ -522,6 +519,7 @@ int checkCRC16(TS_PH3_ccmodbus *pCcmodbus)
return 1;
return 0;
}
+#endif
diff --git a/source/tpc/tpc_uart.h b/source/tpc/tpc_uart.h
index 637dd8a..918af6a 100644
--- a/source/tpc/tpc_uart.h
+++ b/source/tpc/tpc_uart.h
@@ -67,10 +67,6 @@ msp/uartx.c 底层代码 和cpu相关
#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之类的传播
@@ -220,9 +216,14 @@ extern void L1_s2b_PH2(struct _s_PH2_FFFE_ *p);// reentrant;
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
/// 校验码的范围为
-#define D_s_PH3_ccmodbus_max 32
+#if 0
+#define D_s_PH3_ccmodbus_max 64
#define D_s_PH3_ccmodbus_min 4
+#define D_CMD_Filter1_ff 0xFF
+#define D_CMD_Filter2_fe 0xFE
+
+
typedef struct
{//8byte
vU8 filter1;
@@ -272,6 +273,7 @@ typedef struct
extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant;
extern void L1_a9_PH3(TS_Handle_PH3 *p);
extern int checkCRC16(TS_PH3_ccmodbus *pCcmodbus);
+#endif
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
///协议类型: 字符型协议1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>