From fe31a3d76d6ef59c750a2344e2f5cf82bde4183b Mon Sep 17 00:00:00 2001 From: liyating Date: Thu, 30 Dec 2021 14:32:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A4=E8=AF=81=E5=8C=85ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_ps5ws.uvprojx | 25 ++- si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 495512 -> 466352 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 143360 -> 151552 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 1728 -> 1808 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 111832 -> 128024 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 111832 -> 128024 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 220 -> 244 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 111832 -> 128024 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 61440 -> 65536 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 928 -> 968 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 18552 -> 21176 bytes source/app/app_config.c | 134 ++++++++++++---- source/app/app_config.h | 93 ++++++----- source/app/app_task_tcp.c | 128 +++++++++++++++ source/app/app_task_tcp.h | 10 +- source/app/app_task_tcp_control.c | 80 +++++++++ source/app/app_task_tcp_control.h | 22 +++ source/app/main.c | 45 ++++-- source/app/main.h | 4 + source/app/task_key | 1 + source/app/task_key.c | 126 +++++++++++++++ source/app/task_key.h | 33 ++++ source/app/task_modbus.c | 190 +--------------------- source/app/task_pen_head.c | 35 ++++ source/app/task_pen_head.h | 22 +++ source/app/task_register.c | 8 +- source/app/task_w600.c | 205 ++++++------------------ source/app/task_w600.h | 39 +---- source/bsp/bsp_config.c | 12 +- source/bsp/bsp_config.h | 8 +- source/clib/clib.c | 3 +- source/clib/clib.h | 2 +- source/ctask/tick.h | 4 + source/msp/UART0.C | 21 +-- source/msp/UART2.C | 46 ++++-- source/msp/UART2.h | 12 +- source/tpc/at0d0a.c | 7 +- source/tpc/ccmodbus.c | 151 +++++++---------- source/tpc/ccmodbus.h | 27 ++-- source/tpc/modbus.c | 178 ++++++++++++++++++++ source/tpc/modbus.h | 2 + 41 files changed, 1059 insertions(+), 614 deletions(-) create mode 100644 source/app/app_task_tcp.c create mode 100644 source/app/app_task_tcp_control.c create mode 100644 source/app/app_task_tcp_control.h create mode 100644 source/app/task_key create mode 100644 source/app/task_key.c create mode 100644 source/app/task_key.h create mode 100644 source/app/task_pen_head.c create mode 100644 source/app/task_pen_head.h diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index 6782846..b131346 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -332,11 +332,6 @@ 1 ..\source\app\task_register.c - - task_modbus.c - 1 - ..\source\app\task_modbus.c - app_config.c 1 @@ -347,6 +342,26 @@ 1 ..\source\app\task_w600.c + + task_key.c + 1 + ..\source\app\task_key.c + + + app_task_tcp_control.c + 1 + ..\source\app\app_task_tcp_control.c + + + task_pen_head.c + 1 + ..\source\app\task_pen_head.c + + + app_task_tcp.c + 1 + ..\source\app\app_task_tcp.c + diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index f5b3cb8f467e8c5b30fd9cd87444deabc544615d..b5284a5ab6d4687101235d1e6c2c7a28b9a208d1 100644 GIT binary patch delta 45518 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�DB!Dm3Z0x0}*ppYFv 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 E0!+LqQ~&?~ delta 40205 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 36c17d995aa1ddfb464bd45379b0202ade5f097c..7f04d0bea1c741a080b57b1dbaeabb6d870c2498 100644 GIT binary patch literal 151552 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 Po&)t9sOP|6IS2j(i^aQ& literal 143360 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 Tum`OLCtqb;oBNN5Q>Fh8|E_tu delta 3944 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 delta 3589 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr index 3db5d74b814c5166d45872561c7776043dc673fc..fecb06fa6b8d0f1977558678d8387c2369b58e83 100644 GIT binary patch delta 8430 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 delta 5213 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 Lt((zWsyF=~9lGKO diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb index c1ff671038594dc3f0ed9adccfb1789392b7870d..e7394d4753ed3c4f20da45b6953fdf28a6641cc0 100644 GIT binary patch literal 65536 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 literal 61440 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd index db7bf5fc2912a46102b2859d02706f68512877ec..bef1f5c8dc68f4c3a170008078a1c81a0fbd1a13 100644 GIT binary patch literal 968 zcmc(dF-yZh7>2(#Njr#`!C8t^$5!dkt&u1c6c1Wy9VFGsMJ?DLaEP>mP>O>T1nKP5 zMG$m|gL~Z^`v=qt4uXr{n=`%S7xaaD@6Go;z0@+g%nXea@wvZ3h3Ox1aksGsYd!c zT(7l{>NTvvTmwOA*&-{2vvjzn#11=S1Kkhvj((yu-bS#itTs6NAd=6nRD zVp_k?t2z}_18&6J=pW)~DXF>Yu2@Is12$%Ej1U(t8SY&6t84ZrT|5#^0*_h9NwaPG HJkb0DNBc>R literal 928 zcmc(eJxjw-7=_=av2_tEh?7G{$3}5)rT76=0#@oGDRod#X)q#=K|~#kgCICmEZu}I zE>3lF?N2DKE+QRt^PJpVZ~X;5kaJIR9(ZqV)0=6L9T8g+GE!wQ{~|fkEkwg7;k@Q> z4X~%P$F{w{{a~|vPYI4G%@`JH0as~7{)xuuP2}%>Dd#wBLRuDFmO*JHF~m8FdtsFU zmx&=Px0d;Jie90}=8BdBmt#;mP7ZUfnVScf*ObWDe{PY@56uPVGAPZ8OzFILSg$dE z(5m373`(ylGq>b;CwzKO^TGKHN)<~cbS~|Br_7hM5M0QhG(Tp}#a&q2;M0g}fNR7M zmZxE^vL3xJ&R(PmuF0S@uw+K(z&ollpVKlahOR*r8vP#s5N{b4GcKSNDBeb2&Ol4CjDnXHm z7)cb2QiUiGlY$Tk;1abeOHhJj;)V){iXw}Mi3s?8@7-5sPTv^+=K3XH-@G|9f4pDL zJ$IdEw^eGQQmqS=QbXW;c(f0H{+AI1PMtthXHn3<7yJEu8GPdg`jJf&%5Yv!ui+b4#*Gu4dd8Mh_uEUZ3 z`FUoRNA<+mAMAXb18yjh>MHHk8lLQK7?(=OM}LK7V#|JOK}Bup@tE%gDu3QbZDVuCWvtggWNMk?Y~GvFm1Y(}$hOLqGE_+VwO5Vh+;dFO{^Md&Z=gkAkCdGsC{ySACZc zj$dHhvnLMFDlFmxt(qS9Ub2_u$o0o)usUF7Z>?0*hF|RddOq6qGJv{CJO2uYT8VRM z{>!*j0!JgOqf(ppIvigDNACAxdBXP7a=@eEF)rnDEFOAqQFhjF88+g+a7O)l&I?zg zU9ZCv->m&AHnh0*DD#nVDYrhxuZNqKmIDs#v)lD&D270(uGjuq!qWGQOOYe@xva=d zIk`DzR>&7qob~Xn*hJU|KrD;&RxIpv#kB^G7h_U_qiLyV<5-yKa7@F#!U4R)=^*`V zl649_U9`XJ{&DN0-Y+z6%tH>1Db9Z3VKnO9xW7evQx|8Q;$eO$PK-;r90P$+xVGBN zg|ky94%zi_H1d(>vbgt8C+n{nlM)<_%*T$eI~@Ci<6Z#be43tycFlh0ML1q^zRj3h zADw+yBg>^bADY9IDKI*PtZJ9%4-H3FTN+`a%|o&G_b3gUACpo z2k2++LYs~P5c_O;P?G&?dH#${U5;qmrXGL981Xl|pE=u3DNJEhp7v~T^%CP!E=Rq4 zZD2MkbZr3x>j;{qEmPLAHlK$GOYzmIXUxUXuFAxKskiaG)|6i3Y-krR2OzM;-qZ?Rq~r4g(<0Y3OoHT+qzz-!I_O zEXJg~IhvJ{-E#KZ{q-T8kC}i(uSt@Rj7gCr$B$D7WM`W>>cQTBV^iu*{GO{T#*3_l zw`!*`89l_fR02m!M$NbnH8|_xoxqW2=y|4sUZWphj=LF?ayg#+ohFZ+MU46lNZr?^ zyLzKO4#D`b0f0Ciq#L-1<{`$U66&MfxXnw-CBN@lxB&C(4(;%}La^)yNc7J*P(K{k zm7;w!Ce@OoS$zz7w7MsE;3mwk?*+#vaG#}p*lU4I$8bpyIr7{d_qlQmJtvh?UGxoq z?^=jl+yFWQwNIzwACBPl-3i2;xOmH6e>}(0yj&!YH;)Xs{{e7Zg?yZZ`$5`2$cYR; z3^6X{wrieiw&#XXD`eXEXUh6dhO|e!4ge1KusCd_kBPd7w`?&c<#MzcP7X{rjUjoY z7d6bf?PSci1>^9ZxaZm#z0M1mj^UD^796dFun{+fACCB9G4iny9B1K)uhH(0fg{i8 zRSF7>OR=VM-ZO+$m*RH?N8>WGY3Kd+xfHT^ z9)P%ZMyDbfiIRH_@nTHMZPy9?jA0~u6@S%g1b+815pe2Z41a8=;&(`#6BfboVqD6L zBWH%uaP1UR`kamX8#=T>eS8FP(qJy%(o2){*NjR1D@Q}}vdg|daz`Q`SsOX#=GdD) zhJJ_4d$Z=)Q9xr{>K~NC=bZom literal 18552 zcmeI4`EOKJ6vuD1l^uby%38H-wq@u7t&z21 z=#RFH3wJ2B1KuG<>jx@zC$49RZ_qC-jbp9!+A(e!bSm%LD{UDU!Ep{AIooJ-mjCn9 zFO3|NF(+6bt*&ZJ*cp*iH(${lFM;E102*qvvX4@@rQaUJUp2>Zh`*H>7aBb= zh~Dl-zcepDCPRt3N=qmA_N*Vjue#Qj;h^U_2S7PSUyW311g_r|(CC-u&FgrgxU|I1 z^r&80a!$wNSQO{p05sfapMfRI4gJ#6;xSb1*f_I4*-{;?L_9u-c&q`SaYl0q)yL?U z){UcuJ>=RGZr}3{3dkPRnz4XH^+zJ?kI$b4H2S2Gqw{Q}Dp(as+8B%EQ8uex&+8^I z+zw^p9u=KJZ+D|lS{Fycv@}2NyWXCkjrB}1n#IkCNyea#!%a#Ba9s?xsYai)bdJ`w zjv7b7wc!hgfMW*o;~LxJ{$TCgEa@_fy6wv6CrsI)Kc#!|GGePd%a6#9Z zBgl=H0BE$)FJ?nRt^?_pCOFngzYXK-WiQoz@q1gwDFEAz2OeW|%x^=&`0$ZtDI6n? zrSbU22{#^FQD=%kXOhul;L1`handhMaI`WWH{NhLc7Wq@0Ge#n*-z4P$Mj1hNA8D1 z*6y2~8MtUn2z90wb%x71#vqmH*C-kvKGMvGqjf98nMd0%Pe=dAdV%a5u1 z;kJe4jI*aT#}$Cq2Y~K1x+r0pG5ylWk>^}aVtQdwp`96WXO_DkUW5If(*T5HYpr8A zpW)i2K|rHln&4<#C~6$9=eZm|1;?|v!)+dFTMzpbe%nA^el+KW*7ZCD*^=d+7v4aA zJc03aqa&kSp3m`*QjC6S9>;Jv7LV53xpDUQpO=8T(T66__9R>^Gf`(sQlLLHa@TOBi~v5 z8jptdTkA3}e9Z4QM>U_Q>-X`lWdsyUq(OEHyu!S*Onn_oB&301$f}N-t{oDNOssJ&z;iwym!}f?0>I zGXqhtv4l|%7_IXQJmV7>mB-PXURxNAN=-QEzSleqiI4F(%&5AD^BMZ3k)wF8*}5E= z+cfmM3Y^bu!lBF(0Afz0c9;n~SwN#tn#a+pjl?3=cGl~?C*AkMM`Iqd&M*wA5B&jW4wkzd7lY#j0P^%|5BZUPX=xne;hIPy8ID^PlE1z7a(p7zGj-tjFaX_WRE706 zrnz2gr*flTnm($vF=8 zDVo9YZP1x!v?$x%7cWaA=K94gy`H(n(XM{SWAV+Q&mSVk7I3V<&4AJ4av@{BK)*D` zBhP1I;Rb7eK$ANvXV*Jd+cJ1w$W+K>HHB2^YktdaFF*4AaJ|M(Ix*Y&$l5@!rSlPw WjfhA7=7aw}3e_&^iwBiHY5xJ)=T^!9 diff --git a/source/app/app_config.c b/source/app/app_config.c index e43bacb..9d74fbc 100644 --- a/source/app/app_config.c +++ b/source/app/app_config.c @@ -4,11 +4,15 @@ #include "../msp/eeprom.h" #include "../clib/clib.h" + + GlobalParam G; GlobalRegister R; +WR_Buf wr_buf; void L3_param_init(void) { + U8 i; G.debug = 1; //station模式状态 G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok @@ -22,6 +26,13 @@ void L3_param_init(void) Lc_strcpy(G.ap_sid,"cc_pen_ap"); //ap模式pwd Lc_strcpy(G.ap_pwd,"ccsens123"); + + wr_buf.wIndex = wr_buf.rIndex = 0; + wr_buf.maxsize = POINT_LEN; + for(i=0;irIndex+1)%(p->maxsize) == p->wIndex) + p->full = 1; +} +U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen) +{ + U8 nulllen = (wp->maxsize - wp->wIndex + wp->rIndex - 1) % wp->maxsize; + if(nulllen >= wlen) + { + wp->readdr = (wp->wIndex + wlen) % wp->maxsize; + if(wp->readdr > wp->wIndex || wp->readdr == 0) + { + Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wlen); + } + else + { + wp->relen = wlen - wp->readdr; + Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wp->relen); + Lc_buf_copy_uc((U8 *)&wp->buf[0], (U8 *)(wbuf+wp->relen), wp->readdr); + } + wp->wIndex = wp->readdr; + return sizeof(wbuf); + } + else + { + //L0_uart0_sendstr("X"); + return 0; + } + +} +U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen) +{ + U8 validlen = (rp->maxsize - rp->rIndex + rp->wIndex) % rp->maxsize; + if(validlen >= rlen) + { + rp->readdr = (rp->rIndex + rlen) % rp->maxsize; + if(rp->readdr < rp->wIndex || rp->readdr == 0) + { + Lc_buf_copy_uc((U8 *)rbuf, (U8 *)&rp->buf[rp->rIndex],rlen); + } + else + { + rp->relen = rlen - rp->readdr; + Lc_buf_copy_uc((U8 *)rbuf,(U8 *) &rp->buf[rp->rIndex], rp->relen); + Lc_buf_copy_uc((U8 *)(rbuf+rp->relen), (U8 *)&rp->buf[0], rp->readdr); + } + rp->rIndex = rp->readdr; + return sizeof(rbuf); + } + else + { + return 0; + } } diff --git a/source/app/app_config.h b/source/app/app_config.h index 9fb5cab..d0a91a8 100644 --- a/source/app/app_config.h +++ b/source/app/app_config.h @@ -3,13 +3,17 @@ #include "../clib/type.h" #include "../bsp/bsp_config.h" -#include "../bsp/bsp_config.h" #include "../tpc/ccmodbus.h" +#include "../tpc/modbus.h" + + #define APP_VERSION 0x10 -#define SLAVER_TCP_SERVER_ID 0x10 +#define SLAVER_TCP_SERVER_ID 0x14 +#define APP_VERSION_HEX 0x11 //高4位主版本,低4位次版本 #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) +#define POINT_LEN 48 //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG @@ -18,42 +22,34 @@ //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) -#define CCMD_SLAVER_INFO_MAX 4 +#define CCMD_SLAVER_INFO_MAX 3 +typedef struct pen_point +{ + U16 x_axis;//横坐标 + U16 y_axis;//纵坐标 + U32 time;//时间 +}PenPoint; typedef struct global_register { //RO Register - U16 w600_mode; - U16 pen_sta; - U16 pen_net_sta; - U16 pen_ele_sta; - U16 question_sta; - U16 spee_save; - U32 oid3_order; - U16 pack_order; - U16 frame_order; - U32 x_axis1; - U32 y_axis1; - U32 time1; - U32 x_axis2; - U32 y_axis2; - U32 time2; - CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; + U16 pen_sta;//点读笔状态 + U16 pen_net_sta;//联网状态 + U16 pen_ele_sta;//电池电量 + U16 question_sta;//问题 0上题 1下题 + U16 spee_order;//语音序号 + U32 oid3_order;//序号通知(oid3普通码) - //RW Register - U16 reserved2; - U16 zero; //清0标志,写入任何值清0(去皮) - U16 status_eep_save; //eep写入寄存器,1则写入eep并清0 - //U16 reset; //reset标志,写入任何值,所有参数恢复初始值 - struct - { //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出 - U16 slaver_id; - }p; - U16 reserved3; - + char null[25]; + + U16 pack_order;//包序号 + U16 frame_order;//帧序号 + U16 pack_mask;//包标志 + PenPoint points[POINT_LEN]; }GlobalRegister; extern GlobalRegister R; + //寄存器内存基地址 #define REG_MEM_BASE ((U16*)(&R)) //寄存器基础地址(本文件外部不应该使用该宏定义) //变量地址转寄存器 @@ -64,15 +60,12 @@ extern GlobalRegister R; - - - - //STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG typedef struct global_param { //调试模式 U8 debug; + U8 reset; //station模式状态 U8 st_status; //0:none 1:wifi_ok 2:tcp_connect_ok //station模式sid @@ -85,15 +78,43 @@ typedef struct global_param U8 ap_sid[32]; //ap模式pwd U8 ap_pwd[32]; + //w600联网模式 + U16 w600_mode; + U16 status_eep_save; + U16 slaver_id; + + vU32 modbusstmp; + U16 authed; + U16 flowStarted; + U16 flowStartVal; + U8 mcu_id[7]; + + U8 pen_up; + + CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; }GlobalParam; -extern struct global_param G; -//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<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) //发送包 + L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); + s->sendStamp = s_nos_tick.t_1s; + if(G.ccmd_slaver_info[s->slaverIndex].mask == 1) + { + G.ccmd_slaver_info[s->slaverIndex].mask = 0; + } + L2_task_go(D_task_tcp_wait_modbus_ack); + TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack + //L0_uart0_uc(s_uart2_tcp_rec.ok + '0'); + if(s_uart2_tcp_rec.ok) + { + s_uart2_tcp_rec.ok = 0; + s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; + s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); + L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); + if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) + { + s->ackFlag = 1; + + switch(s->slaverIndex) + { + case 0://如果oper == 90:成功,91 == 不成功 + switch(G.ccmd_slaver_info[s->slaverIndex].oper) + { + case 0x90: + //L0_uart0_sendstr("11111"); + G.authed = 1; + break; + case 0x91: + G.authed = 0; + break; + } + #if 0 + if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90) + { + L0_uart0_sendstr("111"); + G.authed = 1; + G.au_succ = 1; + } + else + { + L0_uart0_sendstr("222"); + G.authed = 0; + G.au_fail = 1; + } + #endif + break; + case 2: + break; + default: + break; + } + } + + L2_task_go(D_task_tcp_switch_next_slaver); + } + else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 + { + if(++s->retryTimes < 3) + { + L2_task_go(D_task_tcp_send_modbus_pkg); + } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } + } + + //L0_uart0_uc(s->ackFlag); + + 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 index 1c2f7dd..429e097 100644 --- a/source/app/app_task_tcp.h +++ b/source/app/app_task_tcp.h @@ -2,8 +2,9 @@ #define APP_TASK_TCP #include "../ctask/task.h" -#include "../tpc/tpc_ccmodbus.h" -#include "app_common.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.h" +#define U485_TIMEOUT 3 //3 x 100ms = 300ms typedef struct { @@ -18,11 +19,12 @@ typedef struct U16 treg; }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_init(void); 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..d2003eb --- /dev/null +++ b/source/app/app_task_tcp_control.c @@ -0,0 +1,80 @@ +#include "app_task_tcp_control.h" +#include "../msp/uart0.h" +#include "../app/task_w600.h" +#include "../app/app_task_tcp.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 +#define D_task_tcp_control_02 0x52 +#define D_task_tcp_control_03 0x53 + + +void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区满,调用读函数读取一段,从G->R, R.extra num 动态修改数量 + +{ + TTSS_Task_init() + L2_task_go(D_task_tcp_control_01); + TTSS_Task_step(D_task_tcp_control_01) + if(s->conn_ok_pool != s_task_gm35_flow.conn_ok) + { + G.authed = 0; + s->conn_ok_pool =s_task_gm35_flow.conn_ok; + } + L2_task_go(D_task_tcp_control_02); + TTSS_Task_step(D_task_tcp_control_02)//是否发认证包 + if(s_task_gm35_flow.conn_ok) + { + //3s一次发送数据包 + if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) + { + if(!G.authed) + { + //L0_uart0_sendstr("111"); + //发送认证包 + G.ccmd_slaver_info[0].mask = 1; + L2_task_go(D_task_tcp_control_01); + } + else + { + L2_task_go(D_task_tcp_control_03); + } + ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; + } + else if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 60) + { + G.ccmd_slaver_info[1].mask = 1; + L2_task_go(D_task_tcp_control_01); + ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; + } + } + + + TTSS_Task_step(D_task_tcp_control_03) + if(wr_buf.full == 1) + { + wr_buf.full = 0; + Lc_read_cyc_buf(&R.points ,&wr_buf ,POINT_LEN); + G.ccmd_slaver_info[2].mask = 1; + L2_task_go(D_task_tcp_control_01); + } + else if(G.pen_up == 1) + { + Lc_read_cyc_buf(&R.points ,&wr_buf ,sizeof(wr_buf.buf)/2); + G.ccmd_slaver_info[2].mask = 1; + 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..1d09935 --- /dev/null +++ b/source/app/app_task_tcp_control.h @@ -0,0 +1,22 @@ +#ifndef APP_TASK_TCP_CONTROL +#define APP_TASK_TCP_CONTROL + +#include "../ctask/task.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.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(void); +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 e44745c..62a6eba 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -69,7 +69,7 @@ stc5ac32s void L0_main_init(void) { - Lc_delay_ms(200); + Lc_delay_ms(200); //板卡初始化 L0_board_config(); //串口0初始化 @@ -80,28 +80,31 @@ void L0_main_init(void) //L0_uart3_buf_init(); //Lc_delay_ms(100); L1_tick_init(); + //开启全局中断 EA = 1; - + //系统时钟初始化 L0_timer0_Init(); - + //L0_key_init(); //G初始化 L3_param_init(); //R初始化 L3_reg_init(); //485初始化 L2_485_init(); - + //寄存器监听任务初始化 L3_task_reglisten_init(); //w600任务初始化 L3_task_gm35_flow_init(W600_ST); - - //L3_task_tcp_init(); //485轮询任务初始化 - //L3_task_tcp_control_init(); + //笔头任务初始化 + L3_task_pen_head_init(); + //tcp轮询任务初始化 + L3_task_tcp_init(); + L3_task_tcp_control_init(); } //=============================================== @@ -111,7 +114,8 @@ void main(void) { //初始化 L0_main_init(); - + //获取mcu id + L0_id_get_rom(G.mcu_id); //打印版本信息 L0_uart0_sendArray("v1.0",4); @@ -122,20 +126,29 @@ void main(void) s_nos_tick.t1s_heatbeart = 0; //LED0 ^= 1; } - + + //WIFI L3_uart2_exp_protocol(&s_uart2_at); L2_task_gm35_flow_handle(&s_task_gm35_flow); - + + //笔头数据采集 + L3_task_pen_head_handle(&s_task_pen_head); + //寄存器值监控 - L3_task_reglisten_handle(&s_task_reglisten); + //L3_task_reglisten_handle(&s_task_reglisten); + //输出,响应485协议 - L3_task_modbus_handler(&s_uart0_rec); + //L3_task_modbus_handler(&s_uart0_rec); + + //按键处理 + //L3_task_key_handle(&s_task_key_handle); //L3_task_modbus_handler2(&s_uart2_rec); - //tcp发送 - //L3_task_tcp_handle(&ts_tcp); - + + //tcp发送 + L3_task_tcp_handle(&ts_tcp); + //tcp master->slaver发送逻辑控制 - //L3_task_tcp_control_handle(&ts_tcp_control); + L3_task_tcp_control_handle(&ts_tcp_control); } } //end main diff --git a/source/app/main.h b/source/app/main.h index 05cba94..6038f04 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -54,6 +54,10 @@ #include "../app/task_register.h" #include "../app/task_encrypt.h" #include "../app/task_w600.h" +#include "../app/task_key.h" +#include "../app/task_pen_head.h" +#include "../app/app_task_tcp.h" +#include "../app/app_task_tcp_control.h" ////////////////////////////////////////////////////////////////// diff --git a/source/app/task_key b/source/app/task_key new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/source/app/task_key @@ -0,0 +1 @@ + diff --git a/source/app/task_key.c b/source/app/task_key.c new file mode 100644 index 0000000..7c97085 --- /dev/null +++ b/source/app/task_key.c @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_test.c.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// +#include "task_key.h" +#include "../clib/clib.h" + +struct _s_task_key_ s_task_key_handle; +void L0_key_init(void) +{ + //使能 INT1下降沿中断 + IT0 = 0; + //外部中断允许 + EX0 = 1; + //使能 INT1下降沿中断 + IT1 = 0; + //外部中断允许 + EX1 = 1; + L1_task_init(&s_task_key_handle.task); + L3_task_s_go(s_task_key_handle,D_task_init); +} + +void INT0_isrHanddle(void) D_SERVE_INT0 +{ + struct _s_task_key_ *p = &s_task_key_handle; + EX0=0; //关中断 + //do sth + if(key1 == 0) + { + //Lc_delay_ms(10);//按键防抖 + if(key1 == 0) + { + p->key1_ok = 1; + while(!key1) + { + p->time1++; + } + } + } + IE0 = 0; //清除INT0中断程序执行过程中的中断请求 + EX0 = 1; //开中断 +} +void INT1_isrHanddle(void) D_SERVE_INT1 +{ + struct _s_task_key_ *p = &s_task_key_handle; + EX1 = 0; //关中断 + //do sth + if(key2 == 0) + { + //Lc_delay_ms(10); + if(key2 == 0) + { + p->key2_ok = 1; + while(!key2) + { + p->time2++; + } + } + } + IE1 = 0; //清除INT1中断程序执行过程中的中断请求 + EX1 = 1; //开中断 +} + +void L3_task_key_handle(struct _s_task_key_ *p) +{ + if(p->key1_ok) + { + if(p->time1>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key1_ok = 0; + p->time1=0; + } + if(p->key2_ok) + { + if(p->time2>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key2_ok = 0; + p->time2=0; + } + if(key3 == 0) + { + //Lc_delay_ms(10);//按键防抖 + if(key3 == 0) + { + p->key3_ok = 1; + while(!key3) + { + p->time3++; + } + } + } + if(p->key3_ok) + { + if(p->time3>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key3_ok = 0; + p->time3=0; + } + +} + diff --git a/source/app/task_key.h b/source/app/task_key.h new file mode 100644 index 0000000..7635f4e --- /dev/null +++ b/source/app/task_key.h @@ -0,0 +1,33 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_test.c.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#ifndef _app_task_key_H +#define _app_task_key_H +#include "../bsp/bsp_config.h" +#include "../ctask/task.h" + + +struct _s_task_key_ +{ + TS_task task; + vU8 key1_ok; + vU8 key2_ok; + vU8 key3_ok; + vU8 time1; + vU8 time2; + vU8 time3; +}; +extern struct _s_task_key_ s_task_key_handle; +extern void L0_key_init(void); +extern void L3_task_key_handle(struct _s_task_key_ *p); +#endif + diff --git a/source/app/task_modbus.c b/source/app/task_modbus.c index 813fa9d..d4fd55e 100644 --- a/source/app/task_modbus.c +++ b/source/app/task_modbus.c @@ -4,178 +4,6 @@ //#include "../tpc/modbus.h" #include "../app/app_config.h" -U8 L3_pack_modbus_03(TS_PH4_modbus *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_modbus_06(TS_PH4_modbus *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_modbus_10(TS_PH4_modbus *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_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) -{ - switch(slaver_info->oper) - { - case MODBUS_OPER_READ: - return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); - case MODBUS_OPER_WRITE: - return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); - case MODBUS_OPER_WRITE_M: - return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); - default: - return 0; - } -} - -U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) -{ - pmodbus->slaver = slaver; - pmodbus->oper = oper; - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); - pmodbus->buf[bufsize] = pmodbus->crc[0]; - pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; - - return bufsize + 2 + 2; -} - -//MODBUS从设备数据处理函数 -static Modbus03Ack *pModbus03Ack; -static Modbus06Ack *pModbus06Ack; -static Modbus10Ack *pModbus10Ack; -static U16 modbuslen = 0,reg,num,val,count; -U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) -{ - switch(pmodbus->oper) - { - case MODBUS_OPER_READ: - case MODBUS_OPER_READCONFIG: - { - U16 i = 0,j = 0,regval = 0; - pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 - { - for(i=0; ibuf[j++] = regval >> 8 & 0xFF; - pModbus03Ack->buf[j++] = regval & 0xFF; - } - pModbus03Ack->bytes = num * 2; - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); - } - break; - } -#if 0 - case MODBUS_OPER_WRITE: - { - pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if(reg <= sizeof(R)/2) - { - *(REG_2_MEM(reg)) = val; - pModbus06Ack->reg = reg; - pModbus06Ack->val = *(REG_2_MEM(reg)); - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); - } - break; - } -#endif - case MODBUS_OPER_WRITE_M: - { - U16 i = 0; - pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - count = pmodbus->buf[4]; - if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 - { - for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); - } - pModbus10Ack->reg = reg; - pModbus10Ack->num = num; - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); - } - break; - } - default:break; - } - return modbuslen; -} - -//MODBUS主设备轮询时,从设备返回数据处理函数 -//MD_SLAVER_INFO需要被正确定义 -void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) -{ - switch(pmodbus->oper) - { - case MODBUS_OPER_READ: - case MODBUS_OPER_READCONFIG: - { - U8 i = 0; - for(i=0;ibuf[0];i++) - { - //此处假设字节序一致 - p_slaver_info->buf[i] = pmodbus->buf[i + 1]; - //TODO 字节序不一致时的处理 - } - break; - } - case MODBUS_OPER_WRITE: - case MODBUS_OPER_WRITE_M: - default: break; - } -} void L3_task_modbus_handler(TP_Handler_X *ph4) @@ -185,7 +13,7 @@ void L3_task_modbus_handler(TP_Handler_X *ph4) TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; //LED0 ^= 1; ph4->ok = 0; - if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 + if(ts_modbus->slaver == G.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 { U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); @@ -205,22 +33,6 @@ void L3_task_modbus_handler(TP_Handler_X *ph4) #endif } } -void L3_task_modbus_handler2(TP_Handler_X *ph4) -{ - if(s_uart2_rec.ok) - { - TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; - //LED0 ^= 1; - s_uart2_rec.ok=0; - L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num); - } - if(s_uart2_rec.yes) - { - s_uart2_rec.yes=0; - L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num); - } - -} diff --git a/source/app/task_pen_head.c b/source/app/task_pen_head.c new file mode 100644 index 0000000..1f0aa4e --- /dev/null +++ b/source/app/task_pen_head.c @@ -0,0 +1,35 @@ +#include "task_pen_head.h" + +struct _s_task_pen_head_ s_task_pen_head; + + +void L3_task_pen_head_init() +{ + L1_task_init(&s_task_pen_head.task); + L3_task_s_go(s_task_pen_head,D_task_init); +} +#define TTSS_TASK_HEAD_DATA_WRITE 0x01 + +U8 i = 0; +void L3_task_pen_head_handle(struct _s_task_pen_head_ *s) +{ + TTSS_Task_init() + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,0); + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE) + { + s->point.x_axis = i; + s->point.y_axis = i; + s->point.time = D_sys_now; + i++; + Lc_write_cyc_buf(&s->point,&wr_buf,1); + Lc_buf_full(&wr_buf); + } + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,D_Tdelay_20ms); + TTSS_Task_end(); +} + + + + + + diff --git a/source/app/task_pen_head.h b/source/app/task_pen_head.h new file mode 100644 index 0000000..69646b8 --- /dev/null +++ b/source/app/task_pen_head.h @@ -0,0 +1,22 @@ +#ifndef _app_task_pen_head_H +#define _app_task_pen_head_H + +#include "../bsp/bsp_config.h" +#include "../bsp/w600.h" +#include "../ctask/task.h" +#include "../tpc/at0d0a.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.h" +struct _s_task_pen_head_ +{ + TS_task task; + vU32 last_write_time; + vU32 now_write_time; + vU32 time_lag; + PenPoint point; +}; +extern struct _s_task_pen_head_ s_task_pen_head; +extern void L3_task_pen_head_init(); +extern void L3_task_pen_head_handle(struct _s_task_pen_head_ *s); + +#endif \ No newline at end of file diff --git a/source/app/task_register.c b/source/app/task_register.c index f715e06..1499c64 100644 --- a/source/app/task_register.c +++ b/source/app/task_register.c @@ -36,21 +36,21 @@ void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s) L2_task_go(D_task_WEIGHT_COUNT); TTSS_Task_step(D_task_WEIGHT_COUNT) - if(R.w600_mode == 1) + if(G.w600_mode == 1) { L3_gm35_send_str("+++"); Lc_delay_ms(1000); //s_task_gm35_flow.mode=W600_AP; L3_task_gm35_flow_init(W600_AP); - R.w600_mode = 0; + G.w600_mode = 0; } L2_task_go(D_task_IAP); //延时100ms TTSS_Task_step(D_task_IAP) - if(R.status_eep_save != 0) + if(G.status_eep_save != 0) { - R.status_eep_save = 0; + G.status_eep_save = 0; L3_reg_2_iap();//写入IAP } L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms diff --git a/source/app/task_w600.c b/source/app/task_w600.c index bae8706..d3871a4 100644 --- a/source/app/task_w600.c +++ b/source/app/task_w600.c @@ -17,8 +17,8 @@ #include "../msp/uart0.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; -TS_tcp_control ts_tcp_control; -TS_tcp ts_tcp; +//TS_tcp_control ts_tcp_control; +//TS_tcp ts_tcp; @@ -48,7 +48,7 @@ void L3_gm35_send_str(U8 *str) //将数据放入gm35待发送缓冲区 void L3_gm35_send_data(U8 *buf , U8 len) { - L3_gm35_send_str(_cipsend_hex(len)); + //L3_gm35_send_str(_cipsend_hex(len)); L0_uart2_sendArray(buf,len); if(G.debug) { @@ -62,7 +62,7 @@ void L3_gm35_rcv_data(U8* buf,U8 num) { L0_uart0_sendstr("ATRCV="); L0_uart0_uchex(num); - L0_uart0_sendArray(buf,num); + L0_uart0_sendArray(buf,num+3); } } @@ -170,23 +170,6 @@ void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p) //------------------------------------------------------ gm35 tasks -------------------------------- -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; -} - -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; -} void L3_task_gm35_flow_init(U8 mode) { @@ -194,7 +177,7 @@ void L3_task_gm35_flow_init(U8 mode) L3_task_s_go(s_task_gm35_flow,D_task_init); s_task_gm35_flow.mode = mode; s_task_gm35_flow.send = 0; - + s_task_gm35_flow.conn_ok = 0; #if 0 g_at_send_status.send_lock = 0; g_at_send_status.module_ok = 0; @@ -219,28 +202,28 @@ void L3_task_gm35_flow_init(U8 mode) //------------------------ GM35 Flow Handle ----------------------------------- -#define TTSS_TASK_GM35_MODE 0x01 - -#define TTSS_TASK_GM35_FLOW_ATEQV 0x02 -#define TTSS_TASK_GM35_FLOW_ST 0x03 -#define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04 -#define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05 -#define TTSS_TASK_GM35_FLOW_ST_TCP 0x06 -#define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07 -#define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08 -#define TTSS_TASK_GM35_FLOW_ST_DATA 0x09 -#define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10 - -#define TTSS_TASK_GM35_FLOW_AP 0x20 -#define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21 -#define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22 -#define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23 -#define TTSS_TASK_GM35_FLOW_TCP_TIME 0x24 -#define TTSS_TASK_GM35_FLOW_AP_DATA 0x25 -#define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x26 +#define TTSS_TASK_GM35_MODE 0x01 + +#define TTSS_TASK_GM35_FLOW_ATEQV 0x02 +#define TTSS_TASK_GM35_FLOW_ST 0x03 +#define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04 +#define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05 +#define TTSS_TASK_GM35_FLOW_ST_TCP 0x06 +#define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07 +#define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08 +#define TTSS_TASK_GM35_FLOW_ST_DATA 0x09 +#define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10 + +#define TTSS_TASK_GM35_FLOW_AP 0x20 +#define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21 +#define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22 +#define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23 +#define TTSS_TASK_GM35_FLOW_TCP_TIME 0x24 +#define TTSS_TASK_GM35_FLOW_AP_DATA 0x25 +#define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x26 #define TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT 0x27 -#define TTSS_TASK_MODE_TRAN 0x28 -#define TTSS_TASK_MODE_SERVER_CLOSE 0x29 +#define TTSS_TASK_MODE_TRAN 0x28 +#define TTSS_TASK_MODE_SERVER_CLOSE 0x29 #define INS_TIMEOUT 5 @@ -259,7 +242,7 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) L3_gm35_send_str(AT_INS_ATE0); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; - s->send = 1; + s->send = 1; } else if(s->ins_ok == 1) //等待 { @@ -342,7 +325,6 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_3s); } - else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; @@ -360,25 +342,39 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_3s); } - + else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) + {//超时重发 + s->send = 0; + } + TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) + if(s->send == 0) + {//发送 + L3_gm35_send_str(AT_INS_ST_CIPSEND); + s->ins_ok = 0; + s->st_error = 0; + s->ins_stmp = s_nos_tick.t_1s; + s->send = 1; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_500ms);//发完之后要等,不然st_error == 0没用 ,没收到error之前也是=0 + } else if(1 == s->st_error) { - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST,0); + s->send = 0; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,0); + } + else if(0 == s->st_error) + { + s->send = 0; + + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,0); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; - } - TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) - L3_gm35_send_str(AT_INS_ST_CIPSEND); - s->ins_ok = 0; - s->conn_ok = 0; - s->ins_stmp = s_nos_tick.t_1s; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_300ms); + } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) //L0_uart2_sendstr("abcdefg"); - s->conn_ok = 1; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_3s); + s_task_gm35_flow.conn_ok = 1; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s); @@ -552,101 +548,4 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) TTSS_Task_end(); } -#define D_task_tcp_constructor_modbus_pkg 0x41 -#define D_task_tcp_send_modbus_pkg 0x42 -#define D_task_tcp_wait_modbus_ack 0x43 -#define D_task_tcp_switch_next_slaver 0x44 - -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(R.ccmd_slaver_info[s->slaverIndex].mask > 0) - { - s->pkglen = L3_pack_ccmodbus(&s->loopPkg,R.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) //发送包 - L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); - s->sendStamp = s_nos_tick.t_1s; - if(R.ccmd_slaver_info[s->slaverIndex].mask == 1) - { - R.ccmd_slaver_info[s->slaverIndex].mask = 0; - } - L2_task_go(D_task_tcp_wait_modbus_ack); - - TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack - if(s_uart2_tcp_rec.ok) - { - s_uart2_tcp_rec.ok = 0; - s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; - - s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); - L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num + 3); - if(s->pAckPkg->slaver == R.ccmd_slaver_info[s->slaverIndex].slaver) - { - s->ackFlag = 1; - - } - } - if(s->ackFlag == 1 || s_nos_tick.t_1s - s->sendStamp >= 5) //收到ack或者超时 - { - L2_task_go(D_task_tcp_switch_next_slaver); - } - - 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(); -} - - -#define D_task_tcp_control_01 0x51 -#define D_task_tcp_control_02 0x52 - - -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 != s_task_gm35_flow.conn_ok) - { - s->conn_ok_pool = s_task_gm35_flow.conn_ok; - } - L2_task_go(D_task_tcp_control_02); - - TTSS_Task_step(D_task_tcp_control_02) - if(s_task_gm35_flow.conn_ok) - { - //3s一次发送数据包 - if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) - { - R.ccmd_slaver_info[0].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/task_w600.h b/source/app/task_w600.h index e708a9f..20c869d 100644 --- a/source/app/task_w600.h +++ b/source/app/task_w600.h @@ -25,7 +25,7 @@ #define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 //#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令 #define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令 -#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"test.tall.wiki\",49000\r\n" //连接服务器 +#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.83\",4001\r\n" //连接服务器 #define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据 #define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接 #define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态 @@ -55,6 +55,7 @@ struct _s_task_gm35_gprs_ vU8 ap_conn_ok; vU8 ap_rec_ok; vU8 st_cip_ok; + vU8 st_send_ok; vU8 ap_tcp_ok; vU8 ap_data_ok; vU8 st_error; @@ -62,9 +63,6 @@ struct _s_task_gm35_gprs_ vU8 send_lock; vU8 module_ok; - vU8 sim_ok; - vU8 net_ok; - vU8 gprs_ok; vU8 conn_ok; vU8 status_query_ok; vU32 ins_stmp; //指令时间戳 @@ -90,40 +88,18 @@ extern struct _s_task_gm35_gprs_ s_task_gm35_flow; #define STATUS_GM35_TCP_OK 5 #define BUF_SIZE 5 #define BUF_MAX 32 //注意缓冲区的长度 -typedef struct -{ - TS_task task; - TS_PH3_ccmodbus loopPkg; - TS_PH3_ccmodbus *pAckPkg; - U8 slaverIndex; - U8 pkglen; - U32 sendStamp; - U8 retryTimes; - U8 ackFlag; - U16 treg; -}TS_tcp; - - -typedef struct -{ - TS_task task; - vU8 conn_ok_pool; - vU32 tcp_send_stmp; -}TS_tcp_control; -extern TS_tcp_control ts_tcp_control; + extern struct _s_task_gm35_gprs_ s_task_gm35_flow; -extern TS_tcp ts_tcp; -#define U485_TIMEOUT 3 //3 x 100ms = 300ms -extern TS_tcp ts_tcp; -extern void L3_task_tcp_control_init(); -extern void L3_task_tcp_init(); + extern struct _s_task_gm35_gprs_ s_task_gm35_flow; extern void L3_gm35_send_str(U8 *str); +extern void L3_gm35_send_data(U8 *buf , U8 len); +extern void L3_gm35_rcv_data(U8* buf,U8 num); extern void L3_task_gm35_flow_init(U8 mode); extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s); @@ -131,9 +107,6 @@ extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s); extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p); -extern void L3_task_tcp_handle(TS_tcp *s); - -extern void L3_task_tcp_control_handle(TS_tcp_control *s); #endif diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c index 7f3dbdb..d6942b5 100644 --- a/source/bsp/bsp_config.c +++ b/source/bsp/bsp_config.c @@ -54,7 +54,7 @@ void L0_board_config(void) //485 RE/DE 配置推完输出 P55 //BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); - + //LED //D_stdIO_P1(BITN7); //D_stdIO_P5(BITN5); @@ -70,7 +70,15 @@ void L0_board_config(void) D_stdIO_P3(BITN5); D_stdIO_P3(BITN6); D_stdIO_P3(BITN7); - + D_HighI_P2(BITN7); + D_HighI_P2(BITN6); + //D_HighI_P5(BITN5); + D_HighI_P0(BITN2); + D_OpenD_P5(BITN5); + D_OpenD_P4(BITN0); + D_HighI_P3(BITN4); + D_HighI_P5(BITN0); + #if (TYPE_WDT_ENABLE == D_WDT_STATUS) WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序 #else diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index 84c4f84..e915041 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -77,7 +77,7 @@ #define D_MCU_NAME "STC8H3K64S4" //存储器特殊参数地址配置 - #define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 //...其他参数 //串口配置 @@ -115,8 +115,10 @@ //笔头 #define SCK P34 #define SDIO P50 - - + //按键 + #define key1 P32 + #define key2 P33 + #define key3 P40 //EEP存储地址定义 #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 diff --git a/source/clib/clib.c b/source/clib/clib.c index a5cfafe..951b58e 100644 --- a/source/clib/clib.c +++ b/source/clib/clib.c @@ -96,6 +96,7 @@ void Lc_buf_copy_uc(U8 *dst,U8 *src,U8 len) } } + vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) { if(a > b) @@ -331,7 +332,7 @@ void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/ CRC[1]=wcrc>>8;//crc的高八位 } -#if 0 +#if 1 void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) { unsigned char *ptr = (unsigned char *)dat; diff --git a/source/clib/clib.h b/source/clib/clib.h index 70f0109..127388b 100644 --- a/source/clib/clib.h +++ b/source/clib/clib.h @@ -99,7 +99,7 @@ extern void Lc_array_sort(S32 arr[],int n); /// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; -//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); +extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); extern int isBigEndianOrder(void); extern U32 ntohl(U32 dat); extern U32 htonl(U32 dat); diff --git a/source/ctask/tick.h b/source/ctask/tick.h index 35a26d8..fd85754 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -45,10 +45,14 @@ extern struct _s_nos_tick_ s_nos_tick; #define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) #define D_Tdelay_5ms ((5-1) / JIFFIES + 1) #define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) + #define D_Tdelay_100ms ((100-1) / JIFFIES + 1) #define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) #define D_Tdelay_300ms ((300-1) / JIFFIES + 1) #define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) + #define D_Tdelay_1s (1 * HZ) #define D_Tdelay_2s (2 * HZ) #define D_Tdelay_3s (3 * HZ) diff --git a/source/msp/UART0.C b/source/msp/UART0.C index 0ba46d1..c158a2f 100644 --- a/source/msp/UART0.C +++ b/source/msp/UART0.C @@ -127,7 +127,7 @@ void INTERRUPT_UART(void) D_SERVE_UART { // LED0 ^= 1; L0_uart0_IntRIClear(); //清除接收中断标志 - ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); + ts_uart[uNum0].t->reg = SBUF; //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); L1_s2b_PH4(ts_uart[uNum0].t); L0_timer3_restart(); @@ -138,7 +138,8 @@ void INTERRUPT_UART(void) D_SERVE_UART L0_uart0_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) { - L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); + SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]; + //L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); ts_uart[uNum0].p->now ++; } else @@ -157,11 +158,10 @@ void INTERRUPT_UART(void) D_SERVE_UART void timer3_isrHanddle(void) D_SERVE_TIMER3 { struct _tp_handler_x *p1 = &s_uart0_rec; - struct _tp_handler_x *p2 = &s_uart2_rec; if((p1->head == 1) && (p1->num >= D_s_modbus_min)) { p1->head = 0; - crc16(p1->crc,p1->buf,p1->num - 2); //校验CRC + crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) { p1->ok = 1; @@ -172,19 +172,6 @@ void timer3_isrHanddle(void) D_SERVE_TIMER3 p1->yes = 1; } } - if((p2->head == 1) && (p2->num >= D_s_modbus_min)) - { - p2->head = 0; - crc16(p2->crc,p2->buf,p2->num - 2); //校验CRC - if(p2->crc[0] == p2->buf[p2->num-2] && p2->crc[1] == p2->buf[p2->num-1]) - { - p2->ok = 1; - } - else - { - p2->yes = 1; - } - } L0_timer3_stop(); } diff --git a/source/msp/UART2.C b/source/msp/UART2.C index 4e18b00..e746df4 100644 --- a/source/msp/UART2.C +++ b/source/msp/UART2.C @@ -61,10 +61,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 //#define _USE_485 static volatile Ts_uart_send_buf idata ts_uart_send_shop; -TP_Handler_X s_uart2_rec; -TS_PH4_modbus s_uart2_ack; +//TP_Handler_X s_uart2_rec; +//TS_PH4_modbus s_uart2_ack; struct _s_PC1_0D0A_ s_uart2_at; TS_Handle_PH3 s_uart2_tcp_rec; +void (*Lp0_uart2_fun)(unsigned char sbufreg); void L0_uart2_init(void) { @@ -84,14 +85,18 @@ void L0_uart2_buf_init(void) ts_uart[uNum2].p = &ts_uart_send_shop; ts_uart[uNum2].p->now = 0; ts_uart[uNum2].p->ok = D_ready; - ts_uart[uNum2].t = &s_uart2_rec; + //ts_uart[uNum2].t = &s_uart2_rec; ts_uart[uNum2].t->head = 0; ts_uart[uNum2].t->ok = 0; ts_uart[uNum2].tp_handler = NULL; - ts_uart[uNum2].ack = (U8*)&s_uart2_ack; + //ts_uart[uNum2].ack = (U8*)&s_uart2_ack; L0_uart2_init(); D_uart2_ES_INT(1); //打开串口中断 + + //配置串口对应的操作协议 + L1_uart_tpc_config(); + #if (D_UART2_485_TYPE != TYPE_485_NONE) D_UART2_485_RX() //默认处于接收状态 #endif @@ -104,6 +109,28 @@ void L0_uart2_sendArray(U8 * buf, U16 len) #endif L0_uartN_sendArray(uNum2,buf,len); } +void L1_s2b_gm35(unsigned char sbufreg) +{ + s_uart2_tcp_rec.reg = sbufreg; + L1_s2b_PH3(&s_uart2_tcp_rec); + if(0 == s_uart2_tcp_rec.head) + { + s_uart2_at.reg = sbufreg; + L1_s2b_0d0a(&s_uart2_at); + } + else + { + s_uart2_at.head = 0; + } +} +void L1_uart_tpc_config(void) +{ + s_uart2_tcp_rec.head = 0; + s_uart2_tcp_rec.ok = 0; + s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff; + s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe; + s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus); +} /************************************************* UART 中断 @@ -114,20 +141,21 @@ void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 //NOP(); NOP(); NOP(); if(L0_uart2_IntRI()) //如果是U2接收中断 { - //LED0 ^= 1; + //LED1 ^= 1; L0_uart2_IntRIClear(); //清除接收中断标志 //ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); //ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); - s_uart2_at.reg = L0_uartN_get(uNum2); - L1_s2b_0d0a(&s_uart2_at); - L0_timer3_restart(); + //s_uart2_at.reg = L0_uartN_get(uNum2); + //L1_s2b_0d0a(&s_uart2_at); + L1_s2b_gm35(L0_uart2_get()); } if(L0_uart2_IntTI()) //如果是U0发送中断 { L0_uart2_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) { - L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]; + //L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); ts_uart[uNum2].p->now ++; } else diff --git a/source/msp/UART2.h b/source/msp/UART2.h index 32c69ae..cf66fe8 100644 --- a/source/msp/UART2.h +++ b/source/msp/UART2.h @@ -56,9 +56,9 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../bsp/bsp_config.h" #include "../tpc/at0d0a.h" -#include "../tpc/ccmodbus.h" - +#include "../tpc/modbus.h" #include "uart_x.h" +#include "../tpc/ccmodbus.h" #define uNum2 1 @@ -67,6 +67,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) #define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) #define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) +#define L0_uart2_get() (S2BUF) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -81,10 +82,13 @@ void uart2_Handdle(void); #define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) #define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) #define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) -extern TP_Handler_X s_uart2_rec; -extern TS_PH4_modbus s_uart2_ack; +//extern TP_Handler_X s_uart2_rec; +//extern TS_PH4_modbus s_uart2_ack; extern TS_Handle_0d0a s_uart2_at; extern TS_Handle_PH3 s_uart2_tcp_rec; +extern void (*Lp0_uart2_fun)(unsigned char sbufreg); + +extern void L1_uart_tpc_config(void); #endif //#ifndef _uart2_H diff --git a/source/tpc/at0d0a.c b/source/tpc/at0d0a.c index 7a5f7a7..11e7536 100644 --- a/source/tpc/at0d0a.c +++ b/source/tpc/at0d0a.c @@ -25,8 +25,13 @@ void L1_s2b_0d0a(struct _s_PC1_0D0A_ *p)// reentrant { if(1 != p->ok) { + U8 i = 0; p->buf[0] = p->num - 2; //去掉0d0a - Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2); + //Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2); + for(i=0;inum-2;i++) + { + p->buf[1+i] = p->__buf[i]; + } p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 } } diff --git a/source/tpc/ccmodbus.c b/source/tpc/ccmodbus.c index 688b01c..6a92d36 100644 --- a/source/tpc/ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -30,10 +30,10 @@ msp/uartx.c 底层代码 和cpu相关 ********************************************************************************/ #include "ccmodbus.h" +#include "modbus.h" #include "../clib/clib.h" -vU8 D_CMD_Filter1_ff; -vU8 D_CMD_Filter2_fe; -#if 0 +#include "../app/app_config.h" + U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) { U8 bufsize = 4; @@ -49,7 +49,6 @@ U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) return bufsize + 2 + 2; } - U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) { U8 bufsize = 4; @@ -66,9 +65,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) return bufsize + 2 + 2; } -U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf,U16 extra_num) { U8 bufsize = 5,i = 0; + num += extra_num; + bytes = num*2; pmodbus->slaver = slaverId; pmodbus->oper = MODBUS_OPER_WRITE_M; pmodbus->buf[0] = reg >> 8 & 0xFF; @@ -87,31 +88,33 @@ U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, return bufsize + bytes + 2 + 2; } -#endif -U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) + +U8 L3_pack_ccmodbus_90(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) { - U8 bufsize = 4; + U8 bufsize = 12,i = 0,j = 0; 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; + pmodbus->oper = MODBUS_OPER_AUTH; + pmodbus->buf[0] = APP_VERSION_HEX >> 4 & 0xF; //major version + pmodbus->buf[1] = APP_VERSION_HEX >> 0 & 0xF; //minor version + pmodbus->buf[2] = 0x00; //mq high + pmodbus->buf[3] = 0x04; //mq low + pmodbus->buf[4] = 0x00; // + for(i=5;ibuf[i] = G.mcu_id[j]; + j++; + } 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 L3_pack_ccmodbus_92(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) { - U8 bufsize = 4; + U8 bufsize = 7; 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]; + pmodbus->oper = MODBUS_OPER_PING; crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); pmodbus->buf[bufsize] = pmodbus->crc[0]; pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; @@ -119,36 +122,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) 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; -} - -#if 0 - -U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) +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; - pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info); - switch(slaver_info->oper) { case MODBUS_OPER_READ: @@ -157,17 +135,21 @@ U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) 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); + case MODBUS_OPER_WRITE_M://组包时加extra_num + pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf,slaver_info->extra_num); + break; + case MODBUS_OPER_AUTH: + pkglen = L3_pack_ccmodbus_90(pccmodbus,slaver_info->slaver); + break; + case MODBUS_OPER_PING: + pkglen = L3_pack_ccmodbus_92(pccmodbus,slaver_info->slaver); break; default: break; } pccmodbus->num = pkglen; - - return pccmodbus->num + 3; + return pkglen + 3; } -#endif U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) { @@ -186,8 +168,8 @@ void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slave ///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(struct _tp_handler_x *p)// reentrant -{ +void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant +{ p->cashe[1] = p->cashe[0]; p->cashe[0] = p->reg;// @@ -195,66 +177,47 @@ void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant { if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) { + LED1 ^= 1; p->head = 1; - p->max = D_TPC_HANDLER_X_LEN ; - p->sp = p->buf; - p->num = 0; - p->sp[p->num++] = p->head_0; - p->sp[p->num++] = 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->sp[p->num++] = p->cashe[0]; - if(p->num == 3)//数量 第3个数据 + p->num ++; + p->sp[p->num] = p->cashe[0]; + if(p->num == 2)//数量 第3个数据 { - p->max = p->cashe[0] + 3; - if((p->max > D_TPC_HANDLER_X_LEN ) || (p->max < D_s_ccmodbus_min)) + p->max = p->reg + 2;// + if(p->max >= D_s_PH3_ccmodbus_max) { - p->head = 0; - return; //error 超过最大长度 + p->max = D_s_PH3_ccmodbus_max - 1; + p->sp[p->num] = p->max - 2; } } if(p->num >= p->max) { - crc16(p->crc,p->buf + 3,p->num - 3 - 2); - if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + //crc16(p->crc,&p->ts_ccmodbus.slaver,p->ts_ccmodbus.num - 2); + //if(p->crc[0] == p->sp[p->num-1] && p->crc[1] == p->sp[p->num]) + if(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) 外 } } -} -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; } - -/****************************************************************************** -** End Of File -******************************************************************************/ +/******************************************************************************/ diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 1e59882..9130a0a 100644 --- a/source/tpc/ccmodbus.h +++ b/source/tpc/ccmodbus.h @@ -50,11 +50,11 @@ msp/uartx.c 底层代码 和cpu相关 -#ifndef __TPC_CCMODBUS_H_ -#define __TPC_CCMODBUS_H_ - -#include "tpc_x.h" -#include "modbus.h" +#ifndef __CCMODBUS_H_ +#define __CCMODBUS_H_ +#include "../clib/type.h" +#include "../tpc/tpc_x.h" +//#include "../app/app_config.h" //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> /// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 @@ -64,8 +64,9 @@ msp/uartx.c 底层代码 和cpu相关 #define D_s_PH3_ccmodbus_max 128 #define D_s_ccmodbus_min (D_s_modbus_min + 3) -extern vU8 D_CMD_Filter1_ff; -extern vU8 D_CMD_Filter2_fe; +#define D_CMD_Filter1_ff 0xFF +#define D_CMD_Filter2_fe 0xFE + typedef struct {//8byte vU8 filter1; @@ -89,7 +90,7 @@ typedef struct vU8 head; //接收标志头标志 vU8 ok; //接收协议ok标志 vU8 num; - vU8 *sp; + vU8 *sp; TS_PH3_ccmodbus ts_ccmodbus; vU8 crc[2]; }TS_Handle_PH3; @@ -103,13 +104,13 @@ typedef struct U16 bytes; U8 *buf; U16 mask; + U16 extra_num; }CCMD_SLAVER_INFO; - -extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); -extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); -extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); -extern void L1_s2b_PH3(struct _tp_handler_x *p);// reentrant; +extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info); +//extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); +//extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant; #endif /* end __TPC_CCMODBUS_H_ */ diff --git a/source/tpc/modbus.c b/source/tpc/modbus.c index f858244..84c5189 100644 --- a/source/tpc/modbus.c +++ b/source/tpc/modbus.c @@ -30,10 +30,188 @@ msp/uartx.c 底层代码 和cpu相关 ********************************************************************************/ #include "modbus.h" +#include "../app/app_config.h" #include "../bsp/bsp_config.h" #include "../ctask/tick.h" #include "../clib/clib.h" + +U8 L3_pack_modbus_03(TS_PH4_modbus *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_modbus_06(TS_PH4_modbus *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_modbus_10(TS_PH4_modbus *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_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } +#if 0 + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } +#endif + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + + + + //MODBUS协议解析函数 //超出D_tp_handle_x_len,不继续保存数据 void L1_s2b_PH4(struct _tp_handler_x *p) diff --git a/source/tpc/modbus.h b/source/tpc/modbus.h index 47222cf..5389a00 100644 --- a/source/tpc/modbus.h +++ b/source/tpc/modbus.h @@ -38,6 +38,8 @@ enum MODBUS_OPER MODBUS_OPER_WRITE = 0x06, MODBUS_OPER_WRITE_M = 0x10, MODBUS_OPER_ERR = 0x8F, + MODBUS_OPER_AUTH = 0x90, + MODBUS_OPER_PING = 0x92, }; //协议类型: MODBUS RTU模式