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