From 745934ec8319fb5d5d4faaaae663f32714158b61 Mon Sep 17 00:00:00 2001 From: zhangsan Date: Tue, 15 Dec 2020 23:35:33 +0800 Subject: [PATCH] =?UTF-8?q?dw20,asga03,show=E6=B5=8B=E8=AF=95=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_gsm_main.uvproj | 25 ++ .../soft_gsm_main.sip_sym | Bin 563192 -> 563192 bytes .../soft_gsm_main.sip_xc | Bin 152312 -> 164456 bytes .../soft_gsm_main.sip_xf | Bin 152312 -> 164456 bytes .../soft_gsm_main.sip_xm | Bin 300 -> 324 bytes .../soft_gsm_main.sip_xr | Bin 152312 -> 164456 bytes .../soft_gsm_main.siproj | Bin 25112 -> 27080 bytes .../soft_gsm_main.siwork | Bin 91029 -> 112151 bytes source/app/app_common.c | 228 +++++++++--------- source/app/app_common.h | 53 +++- source/app/app_drv.c | 29 +-- source/app/app_drv.h | 2 +- source/app/app_task_485.c | 34 ++- source/app/app_task_485_control.c | 20 +- source/app/app_task_gm35.c | 54 +---- source/app/app_task_gm35.h | 2 +- source/app/app_task_tcp.c | 93 +++++++ source/app/app_task_tcp.h | 26 ++ source/app/app_task_tcp_control.c | 56 +++++ source/app/app_task_tcp_control.h | 20 ++ source/app/main.c | 18 +- source/app/main.h | 3 +- source/bsp/bsp_config.c | 2 +- source/bsp/bsp_config.h | 3 +- source/tpc/tpc_ccmodbus.c | 168 +++++++++++++ source/tpc/tpc_ccmodbus.h | 113 +++++++++ source/tpc/tpc_uart.c | 28 +-- source/tpc/tpc_uart.h | 12 +- 28 files changed, 759 insertions(+), 230 deletions(-) create mode 100644 source/app/app_task_tcp.c create mode 100644 source/app/app_task_tcp.h create mode 100644 source/app/app_task_tcp_control.c create mode 100644 source/app/app_task_tcp_control.h create mode 100644 source/tpc/tpc_ccmodbus.c create mode 100644 source/tpc/tpc_ccmodbus.h 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 5498516687ad03302fb816f22e267c4e597d77c9..bcc9a996c08fa71a5abee98f9f0290468aa7aaf5 100644 GIT binary patch delta 19422 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%0A@wPm>&F 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 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 98ff891848f804d8bc4cf8041e7d458396f22a0c..6e46b1c287a83ae0c3ff08473818c1ebaa36f347 100644 GIT binary patch delta 4642 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 H(I5ObJ_rF^ delta 3189 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 TK38q4lA2e`R$1!n6szIi@FIGS diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.siproj b/si4/soft_gsm_main.si4project/soft_gsm_main.siproj index 50061f1329afcc86eb9135118c33d6ce9765dd78..6eecf8afed107dafc19de7fb3f4a6afde2e0488d 100644 GIT binary patch delta 1175 zcmZvbTSyd97{||<*k>h%uc}AJQg=s{1wJ)O<0fY2SM&E+|b12^^=M5K*x#HmP^C;Z$lCi|nJ&`VgKE zL{6oKRSNR!63u(|HYTx+eMYDbV1HgF0}0V81Di~$C!kD_zb$G@`~WQ)8)*Ul&=}1L zgv?^^>Nb5em3F2}4iB`AP2IqGmYuGb$&|h{q3o3p>F=z?7hVVR2jLEmZWc6Yg zDp@+t-F*Yi2o0Z-L~$DYS*5?>UE=I#V@EH)gW^FKGa90R54ATUo=PLToJo(_UU2HY z2nQp~7>HvPA|ltDo+PqoGnAW2o1 zJZGQ`K#4(k8K+UB*ye<)DcNO$ZopVuc*d=sw+)H%?}mfHXW@6l`vKB9k&%R8hU9?S zo?j!#FItA3x1bGUZ4}GvI0mzCkd5ks!sC9kw-+b(y~Y>mz&%i)tl)&H4@=^yPU=28 z;T}?j(sVj6q@ny5Q?0mz8MuI}pfUzieRIztYSq?-RLbks&86(j zJ!RokcY8AXWrtgNRi3KMEeaCscBQ9y+%k55(Sczk#v!o_30a&|p@anC-2tXQS#7e3 z<@?+1j+)AfJ@rbz^^5c=b4l)7RJj4Q7G!g@Gtr)Avz+c3Msc@&mr@?}#ZuaNFP2@; zb~I&!%;B8CIB*roS}^^|nO=bPD={<&vwoc@Ai=b8UQ*W2#`Qq-+iI`bxx22W8hyvi zH#3utd`8+8q$ML|1Lpy*BL0VQCc5E&sr}Y5DQ)xA)JLScFf(?+b2+Wvj=4zt2Sth~ AKL7v# delta 826 zcmXYvZAep57{|}KcWT1rhTg=yj+N2gG6HSqdrWIl!xN;M+P{9uo2pQprC!88*}!IW#9(j zyaZh5WD0@~3mec_snYXnb}9>nAv^#iL7NHh>f&xQi)*da=A*-J+Y>4J80j(~3pzEt z(pr63wq>g~_kTyFpGb88onR zNjJ!iO*yRoe4Fkp`@{bg2l{GIE8H5?xMDpwrFM+=~isFAL;c-ajrRe z1^dSRic&h19{&Pm0^x1ICD3d5{07U+Y}A9{#6uO{H<;fL7Sf{9c4(Z7c3!Es4kvLs zaOWXchN19wcL*-vo8~G-_h463-KSz)n?YEG;uh5B&UCpx-)J*sSMGD=DU?k}W4Jl$ zWcB(M3#)1JOFG>`OX6^X-8}e8cIdygSANDG?yezZ32uYnqq2HBC)wqeKFKj3x!3g- z+8nerltw|T(9W{*BbW5W&-!lv<`;Av7l1cdEiki$&qZ~eu8H7}B$JLc(2{peyROba zbsGuUi<{?x%IU3J9cBY%T^$wFHd?;#!xMN(cq*n>1BVlF^XWbETdA(EJDHhFs_z4} F{{hQ}*WLgC diff --git a/si4/soft_gsm_main.si4project/soft_gsm_main.siwork b/si4/soft_gsm_main.si4project/soft_gsm_main.siwork index 591c26d845cdd2a5d0a3f0d2de27e06aada1b209..f7701435909e132a21b3b870e94cbfe562f7e986 100644 GIT binary patch literal 112151 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 L$1-q@o0$GT4a}XK literal 91029 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 JKS~5v{u^ba9RmOW 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->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>