From 7c952c062355de2b6ddb579e26091b2e047c2f71 Mon Sep 17 00:00:00 2001 From: armink Date: Tue, 13 Aug 2013 21:54:54 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91F?= =?UTF-8?q?reeModbu=E5=88=86=E6=9E=90=E5=9B=BE=E4=BD=BF=E5=85=B6=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=9B=B4=E5=8A=A0=E5=AE=8C=E6=95=B4=202=E3=80=81?= =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91FreeModbus=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E5=85=B3=E4=BA=8E=E4=B8=BB=E6=9C=BA=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E5=AE=8F=E5=AE=9A=E4=B9=89=203=E3=80=81?= =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91FreeModbus=E4=B8=ADport?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E5=91=BD=E5=90=8D=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8MB=E5=90=8E=E9=9D=A2=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Master=E5=AD=97=E6=A0=B7=204=E3=80=81?= =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91FreeModbus=E4=B8=AD?= =?UTF-8?q?=E4=B8=8E=E4=B8=BB=E6=9C=BA=E7=9B=B8=E5=85=B3=E7=9A=84=E5=B8=A7?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=87=BD=E6=95=B0=E6=8C=87=E9=92=88=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0,?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E5=AE=9E=E7=8E=B0=E5=8F=8A=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=90=8E=E6=9C=9F=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: armink --- FreeModbus 分析图.vsd | Bin 142848 -> 142848 bytes FreeModbus/modbus/ascii/mbascii.c | 2 +- FreeModbus/modbus/ascii/mbascii.h | 2 +- FreeModbus/modbus/include/mbconfig.h | 19 +++++++++----- FreeModbus/modbus/mb.c | 36 ++++++++++++++++++++++----- FreeModbus/modbus/tcp/mbtcp.c | 2 +- FreeModbus/port/port.h | 3 --- FreeModbus/port/port_m_serial.c | 14 +++++------ FreeModbus/port/port_m_timer.c | 9 +++---- 9 files changed, 57 insertions(+), 30 deletions(-) diff --git a/FreeModbus 分析图.vsd b/FreeModbus 分析图.vsd index b47afb5364d43b3c91257cf0b5578159673a9703..1767bca018a68871ec275f2ccd133ede7015ad80 100644 GIT binary patch delta 29911 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 E0ga{LiU0rr delta 29019 zcmb@ucU%)s^8mb;gbs!vRmBjb*f0WusNf}(fHg$Gh8m(YMGPJLQ3UmC2?*FwBi$Ym z?BxK#t`QJyXefdTYC^Zcy&LfHd7j_z{r&NNKJSv;&CTx4?Cs9X&dzQ~Xi!gRP`|id zRrTWZwQll58BwaK$g+$dsu=0T!jjEuk5v(*gfjvsBS?m--b9uBg#c(}MCy*t@Yb75 zs{{b(z;6Tm(%|<~#y&m&j8Z+_10#(`1bp#@1fLPB2>epvcm1D&X{rE>q5!}n0T89k{EswBO9LnhRWhd56claET(KK?_sD$|djE7G{7h4z z%=Ar4e#(VG&B@uy?*^VT~NS) zx9iuhcMqk?%F0ilK0ypY5ZT$;kXS`UMY`auHLL^^Bru#H%;WKvELj5izyx8Ka2$v9 ztYIZs2r?21g%E~CAw0|uUQeGs4UxmFEg(;bg6YYVCnryygyo!^oHlLRbmz_;h=he; zfpkH!@ztwW$B!Q$5fM>TRD@v|EVOj#(*FK_m}daF!e_Z$4x9WpWnA#IPLJ5ffMupm zo%-_S%fC5)0WU8vNEW`Es#Ge4h0+BEsv?mHGEw46N=l|onF4VceY2N1!%7=BZe;y` zOppU44QV(+y2EuRO`3!t$p0%Hb8~YG3ya|_I6gyf=YdHi5=aKVra7c&gNA%!jYi-a%v7aj(N>0G~fu`DG;i7~?Q_3PLF4??i7(*=&$ zp+krEIXgF{q`ZrXfmirx&CLAW-TkGw_)}h9*OMpkD#vm72w?~eBdcDb#>TrP~`r~$X~$Q+xve|8?LSb zfZ9;?VLI>%NdY5h4#tm{$z*@)!*&fdjhFF$wsCrdsw30^DB-@ozQYRnSGOSWx6)q# z%CD-b>e{ty(*+FG|3OOIU|3CH;bFCf*K_C2DWw_q2W-Rts-u)pf`mOK7m zy__B~S{3#_G))ndalIl>QotT}g1Lqh|0+h4*%N*}Otcy#yg-w(APiqEjs|NB~h z+q%%h1L_NJNcEsb3~S%8x{dh{je{7di7;7@9Sb`mT_Dth!w3c8?@+*zOczYlfZeaH zt-WW@o^-)Z>TnTQ3N{8_Gny6{z~0t_UF`4g4@C%$Cae!zcVHGTJz}l0@8JVP!MSI+ z3WU=IR}Dsw9u23k;XHU97N2y1*#6_kkMQAtCnF;x$Pfx3Oo4%ckl1jUAv1r_8IJJ( zHf+P@30n8rvuFP`Reu3E@xVca{L%$!&cjpEfA%Jn0ys)P+S=gYK%iSHh49yF*Ax{M z!x&f?b{`Z_SlM@!7q8 z{XrgYzmE^(4;e#3Q19UDqznG>f`bbOJ~cY}@9;waGJ&k%TMQ%ld_EN1VHir_@#Dv# z)Ilo4x&*rk>S4Ozh$9pnLqkJ2asPcUXiQ-R$OOxNGf(%uthePjXqXF9k z2kB3b+uPg6#>PUHe-pH_!!RWK7YRKXC?CV@pd;|NzLFQ5xQ2M?>+8eW1NsjCDXjPY znuq^{VEspr9;FNJYQ)FKtEs8Ms_;QOC@4r>UERdQWN7X$(||WP5U{1i0x^;vu{a}B zus%bf`{L5-F%aSQ9rA>g_{k9e;_j=se`%mHe6-c!!mEw!pb5Z~pB)M}8`6jE z8A!&3h$Q_?g55>F2{UF7XHYPh;T{<^a)$)g;7tKjVEH>XBnu_}VdQVxNjbTG3b+EX zgEl00CAL0lt$xoVO`P&U8|uF@W1uTgnc)+isvk($_mBn9k!KIn-=WO-8ogy)hoXnL z*hT&Yvz&&r@?n;}1kUN29SZj6E(B!kj)^etEWx_S`yke-L$M9Eyb_kGnhp#y^kO#} zWD-_A|||iAUeBVR92Hyg+L{&WJ{v1E_UvIHMwl-CL<7)I<$9D$bG5J*&pa;n0`7bW_!thyWD&1OO(1o1_-Rj{_NXDM%e9ng@E+J@=MZ zlSz{y%Q<6}uhgNSERhC~=GnLdWfN{|c6UxYLw>muEE^Q4<{#ygrcME^!)@s7@{I(O zD0Ycpw>l{C%3d(ueR2$-%yEDwo<7t;14?p*)#Ok|_>!qZujGetv-zZNL$47;s?rVv z3Zd$5YFB4z>~uisS_xK_G~8vVc{y(fl!ld%(r{NRDOp4(Qq=i(zIVb7Q}(pGg-0AGvivh~1l|TnkDRF=NL?2sUlSpxw2SJe<>S;J`JI+*-4+g_= z3;Wa46rw7Tf`mXHe6~P!+A%(fqa3%d%D#qOeXBMxo8lz|?yAbJ-b=hnr0fj`;Kpxd zXE(e~q;Mko0XTP4HSldBMb;Gsz>=G)TN|W_lsU2A6||eGneVVf$_dyFlWvlL8m;7H zBcVC}-1|hzvCZ%$@BQtr%5&A^)mve?Eq~g@r4~Wx z$tV$!S?b=%c_iaxA1{-1LuUaFByQ*u0c`n5!8;aW3j$wIs@5RoLM;!xT z`WVnZG^T;DE|Yg0C?zb2)ZY2fM+n-L0^iw12^p<-=)4+YiRF-Kx{!*hT;UDep@cn? z%Z&w&H+s=oz#q+chFp3%q*)+1Rla{$=qLn1jK9ST2{4uxumLajrg-l0&@7)j9* zAry*!27^LBbU_`lXEYOsRXxccDS*%fZM_QAg%~Tk-_ohiT1Q-7etz+!F^5PRhy(c_ zfF7Eufm|E{zG@(nAwaD82jFQT=aiU(+JB0aXd{y4X{s40xqG9JSCG% zdY%h9z!ErnG04ZXDKhIk07{suJJMfjQ{K3MOKi0ea=+T%d~Xd(Fj-ADy8r+QTP={> zt@bq)uo1K26s=2ED>(Gg8aZyTgNQy#R=})31Syc9*P$ch z5y{BTL`p#g071j#UOml6G!OYtK&GfXc}gX@AKE_waYK*o(Wa=t+W($koS#uiMG!OR z@3chG?IJIRg#JBsor7hJ??OxlEuMRbKM^rgr9hNXWriYtR7M)b0#nXG=YW7@2?Krq zo|R%?A^ZQr_#y%l`@b+BU>WXT3?u{m42Ep4U56szQ}_3uJ)K?9ynz24cx-s!S?>o< zc6Dk{+j_CS&bD68#~#W|Xz@A}2=Lv6w09z!w0is z!->U)lZp)|uPZiOmxAc186e152G~1pJY(-T4*YtfuLnyIYx&eEaGd_2z49e|( zk$%{za0ok0CH582nA6@Vq!=gM7}rdCMQi?{Mbk0}oN?-(mha04#tn2S(%Hpi#7a#U zLDJb|z2AMhb_{|90?6!etdVz1aZt(LN%Y41LB}#(0Ju!WJeESYt*4=K}xu!m2|7J=~P>9f}DZm?Ds|fw7TcbEZQ9 zy<}#GV(Q19WZjnUrL=LnYBaCbK7T=|0|*J!qD6&i8H5DBLZZTcsX#<51S(ZR0*iQ2 zVMRQ!CiE->&hplTO5k0hM7)Ak7JGyQHp6=}4I)Y*P)b`9+6V7_O2kJ5iwgS)iD)vS z!ZaBWqYnXn#+uNv@D7D$P3U+CjE4w2c(+p`oFU*05i(v>m`urrEQkst3)X~w>x>Hf z)(H`WZB!UxyC$>)mgrEHXhEXFT97rN-4M~OMD#X9wMg0`*bBD5MxAz1v1uzZh-d<42anXfsGL135$3ti_C+-JXnVd?_5E` znou7I_ymOnhVr699{%%PebYOV_bXbqpBjy}{95^Db$wcVhhk$LC5#50jIH^;w4}t1 zVYD4^#EbQ5yE+s$yR`#p|8yw!c)6#gVBk}Clt7KvN86DcFFgCc(V z^tN7){AnY05_g*-oOD^NWTHG^sfkUiey?y&141TCc=zv$+Yo&T&yImSiYh`j%6NqP97MzX3JdWO%yivpzHwj$ z)OgeTkz?+AMjk^4<+^>L_Nc9WSTnlZtg%ZWXKzM#4650w$bSuWu<8A^*4;B6WFJRP3qOVVx7K!SUCCzhgb)Zkg?$}{Ttzg-bu2~VUF zYWIqUS2gLuUj0S-V$iZ$lcC9=MCn8A)wPTY;05q7PSo1wN;SJy4jk}4k3LwNxwv= zV3qWN@4jN*s+?6hX69{di#B$)U2M6l^{nY9P1%Vk(%?sG5vfxO|$> z>-|x6LU#@N{>O$-G(QSEMQ#K)(~fqKE^tmXUu~vot2Eues~d-?G+k|Z+C;g3cS;=c zwCSq+q5SRFRh>ZIx{laN>?cTWcdKlL=3Fq1%UM|CZmfDPcoW~9AOBHz$-KkC<3$Nv zvPrzj##3$}OH}4b^INiTLN696N)~kq$q4z>{9mEoE0-+zBI*?ZwS!ZzLXSP-GB*#T zOC^*EHZ%7!cT$f~&r)wwrPL-(aF{L?H;JFo8|hti3X|wjzd4oWH=ZdU-&eEpZutr( z*eLl&a)6o7yuy6IY*(QcfUD?3bS!-;U615RUq%n3leUdXu)!Ky%Pn)9YUkGEvO#BU zYx%S4wbd$3HT?H0m(?l0Ez5qL-Ff!avxPH52*x@pUz@nI$87`lqTEDK`7)?_^5v@u znu6rlLDejy?k%5V*9-lAv9i6IDJ+)oD*f%(xSM8a!dzjgP%pZ}r%q^Q?s~Mjr@U_s z>vsLE8qMg^oII@MZ9P(&12|h~ek-sI+c;UN*kSAp2KO7K-7Ic{b_HuX2 z@4T1)7#V8{EKHYw@ZU3H=_of|$dXB1&|u)P@Mx>OXNii3M~n8(Il!oH6t{JGHZLzR zkAJE%FR`(VKbrr6-^W+qun719&#AA<#|aNpJ%!7JjCocdCt zVW;QPE(gEmsRAp!Li|F!o0-i#&jdKLpQ(Y4Ms47}1P@(?AX%6ZyT&P!kQBrUn8 z9MRrb*;77-pLLfWAMH0O7UT+qyj($+pxAz};ufmzbMoWu)#<|Y@Vlk{(MNXN82r9S zjm5#(X1eMGg=Eg+{7zsEMwETQISIE{NhB{jTJiYG2CS;?9ZoEVyJ$oXDYmctVnFQH zv;ay1`%QJ@;F$_??7p;s*zs8b*Q;^`$KfEFT;xX*Z`M0zKMmGmVJsWyg|9A-E$f?C z$MJi-h`~ZY)r7MZ5x~vo!049&XcrH8agyY7Yh-^(z!!3$SI~3epp#UhWf^ zuctImc~f6zX~SzXvmT{aDF8ljBXEgki#myPzRbm~MbJt5BzzSzm`>7)!4{TI3rG`e zURA~#yxpvwcDMP1?UNRjremHDD*QN@So*R1$0vMsoZN1IixW-JhO&sbLtvibelK7r-e@6+Xj<#*w=IJjR@V9SivkG^V0$80gTO(S|xKLokZslyG}xH?W- zYt0OsEWd?#03LIr%sc?TE=K$Bmh-ct5To9W7PZNKq+IdOQKTC73Fa%+_ad{Le4$KU>!xTV@8A zP`KW11E2^qlmLwCB0B`4Q)W8FXm$;#nNQIdcmZ=aHY8=Btp} zn1a|kfiqd)_~`{Jar({|ZjsTxIn(oGNDk^=f*RK9abEQ}HlpNi6sRoxA=8qZ%9(QZ zS1cx{Gy@#sq}lnk9OA?u*d`arbL5~zJ}tm4^2s+-c9ZDD}>5J)DD19@1FZ~1^T%=dfUyMF_(40Pv_Kn6%heW>77iFq3SBWM~ zVh6FACw-Vf%y{N*=K0h}e&q;a=dgpvxpSUT9$?90k!$R>J*+aDHfkRyPb*+9CF8nQ zR(YdMO*4sn@DqZLL<{=bJNC85%#&93zz2lwcISc z!+p*L&DEg_+Qqju#7TU^sL28@aW)Wcr4h=-^)M2zsRrPzu>p=VZW`t zL&v24P2+^}A2TfH2>pe+dmc_s+!pj)VDV4Lg2Xesfk)lB@G@bIut#g{6)Wt%4r%SJ z>ZRB^Y%8`OJBeMwKqXd>eZp$#nYmdxy|gZUAk68=%gVWt$V)6>?~$%cE<3g7Q@!er z3n@R53C4@SHs6!al@qDv{v>cOW%n8^xF%D$w&>O6rPb`9p2HLRTeB$#;Pg3Xu-weu z+?2&>lw-qAGiTG?NzG`_2ifn|n&UU-Ra&IyG+Y*)kQ8=p-)iSv93gS@>+|jEDMqvn z4|DXQ`;h3)@GdO{Bik*#4?z@+J>3rSSzkkPObwzXW+^A@s!i=a=CH9K8>b(-chyIf zXyfsm z!s`3Q0yh1)g>FTR#Tg55DfX(x{EE0ri&Lvv?TI%FGUeIA^TJnMN6zj_4D47>?dud8 ztGw>aK*(Tg|JLuT>{7ep2aFtatI7~oTzc=9*{Js{BZr2|*xtOEB%QwI8z^t)@UH2Z0ZJcDU_>ytZj#>o?G z`N*t}f`-e2&#Nphq_9zFaNWS1B=4jSQdZ97`DzZ;XLc{G_WO)~{#4Q`l{bA7EQ&H= zv0QswS=dj33UPM~EcmsAvrw05ew?6n1jbssQkUcsQ$X1Z~3#hM8+72c2V=8?OeR5{cQ zuF%^J2urK|;w_^R3+sMiI{$p8f|!2eo@3r&K4&&Fdzh*yFhiOAIcxrdd0BXPq0_|L~76}>gKBm zjf4|0;oa2}Rh-I8p{ zc?mA5mb6Gf?>X$UHtsJyi@T`aySWbsLe%lvefe9DS~UEsQxJ9&yuh!Z#W!Y1=Sgk2 zJ-1rr;H^g%_l)$G^qI6#+9jpPfT3)>Y^H3!jMVAR3$I@H0${NQ+iFv3$9XVR zLJfeT_ddJbqn6vs?dNJh{}R~nQ9h5q#{Wwl1vNy+qrYc5PM7-)xs=51Roy6Su7w`H zd&pR=Y~@f^S+)ntx`MWUnPs2RG+SkY&q?`glIyi*!?E|~#hJ~GDsP!DxHEEX95P=p z&;hVJmq!woKlXLbayUYqC2kW5yMkgoKX{Y6JekXw(?kRyb<*g2nJ1XTi0F}5%ZZdZ*=5zU{I2@mPa9Vr#3vrv6 z4CY}5RUlTvyst6;cQ8+~T!MLUFI@oL!A~Ub&u?a`iA}^8nH9{m7tA*1?K)=b*rr9B z`<_YQ@@G-abHCOaQ+(0mWrjYQK{eVSj=yWkm*Ru`vCZuqBnY>Q)5KSV4}@=md|TUvX1|3aFf+^!bB`IFR#;JQQC@?Ux0v^(Hr6AJ)rlC$ zzzVRd*hB0s_7x*GYm^)7ip)i4;8{YA^7$f994y0=M46&Oky5A{MBhZZnB_9^5 z^SxI>38sSs zF5MR2Ozi#FQU1Nx=Ff6 zdRz)5(sF67v{l+K?IqNxHnKtVeJR}DI9oRwVZ93cB#e|L%d%ueGS@iHYfFUW!f|$8 z6KxgVNAl+&{uukaOjABaK1I%wCoGZ&%H!HSI(N#C$SwHT%PheZ=71&AoSN?2Flt2@HqW`38GsiNo<4NwbKrP-{`ji*OBvn4; z?PBVR!GBsWV{{@4oY94702+lx2$O`TQ1rdd_x=c6Ry}o@tPTB+0!{81Zb^e6@?LFe zAwhamt6}|VaZMpolM~HN;U40G)7+cfr(78~uKg(wBk}e5s>g7Gc*>j2pCOtjis6G) z{$c(Z{w@A9ej~pOuff3we7ta`aK3Pr@RwLek|_kxWR>@_3=Aj*sY*5^NEll_P6XCVw@a77rS3L(!X-!KG-Z5c;sPcgv!tFc(>`Ce zh5@22jvy;LmvqZ>=;=ogdU}FddFlXo8__-fF01NPmfg2mlQx0{=TCYA;aL#%z0pHY z5wx-_rrlk!!8tAFec1${OI%?;Z3Ii7aC@R_ zU)hDSu!`WsDdP=43>f5ZZd4!lBJK=ZKXuAsm(6oVBAjAn$ne33MlbUm-BVfl2hArd zP~$8|UN;|de(x#0WZoCk z_KCan>hw~;cI^qf2diB6=ghKAWEtp*fW<$x4-AAS(unjb~oK|M(A zr-DR&X;aU>BK~!LPok8sNdU;-JE2^NU_cqAnU1M2 zjhGXd@GvNrkcVBy?qjd94r~CsDFV8Tdy_;iDJDleq((nu`%9sM&BL00snRzhHMDvM4Pi%>M4Y4j`#Q;l%TX^HgAVkvTgi=gQ)<8& zS)TkIQ_g%X@93D)JSbOJF8ZhaPFQ}JORS?u6Ci~+M4TpW5<}|%qDTxd?ql%`>OAU7 zs*qYuZJ~lr$yMq-$ty{_grL&Kj7B;ATUb4*2l`WKYa?yLN`eRQ4ojjLOI-&*i!VK!@Bn}6nJ`! zd#}m;^38^eav#fA2V#g`Pv%BJY#=Du-%ZQeF97yA$AqWC%hsNXji_2C4U_6_m7n6? zm_M_!=8McjrYlS2Bwk)b4Wx2qghv{5X>+J&s1rgw+0)nP7;*x2=wR)VZ!2D^&b;@T z`ip9xbIS+pGJNd2i~hLwM^HbZK^;x~ZKLXr`LUEM0RmITM`5t~txOrLW~J#gqh^at z-|cx^D~`IK<#Qgpe_*$3Ra7n=Ni_$_)^r3|>5biUr(l|hvu}#ZDp7<8B#9~wLX1dh zX`PXHGA=~P1d-NxOnenD6W548h(VuNT{22CSu*<^T<4&rXhO0iOHw2;be)`%)`>NQ z&LW_DITRBB`B!Fe=W$nZTku|7O=|KObS1uV7}knuVvcyJ7_1X-74OfE6x1@_*ha3O zLMGKRwD$y-@uJXEYpRW6c;IMCtHBR}lrb)GX$ybR8hJwC8rSd^TZQd_?SSdI7|!6* zxG&0Buw)#;V$HY0l$-3tLzKmWCsQ`Qbbf}{1YUm=bO&F*Z*!s>iBuDu!2Sr{4jL`z zkz+Mk0kMVS5&|gt(Nf0oZm;&EH^R3(4S3n{JfJ*y)%IZ9sBtjBIbr#t$cTw5Z>Gk? zBOqa1f;Eh98b)r2LSnE~EJ-ygVr=3RUSZ_@xDt$f7`unP+Fnf~lWQ3no`SbHM3=Xwp__*@+;+qPj*R~GBUMnY|HifYqCc#IvGXX%AlrOG7M^}N8HIX zwv8kipeoZ@;MV{?TDDg#Qe4}yK*nD8iw5VvB!qRUvkTj#@5w0V8~h- zYm2Nr+Kbl{d#nDGjC@lD5K)qOc;}eiIv?#s?xMva5GvZduYh@VTy8SfRxG+J0(GK~ zq90I%RZe*EMu{hjNgV-=A1db@$}L%TB=>SSG)v-iah~|H_`dkHxZ|i}FK8hy7aK~( zpVnz|lFXHGb%0J279mNJWJ(Gp*CdZ54HETll1EhgzPDpa7w|3@&&9zCd;^|Zh^h3$T=-t`Yaxgq(8&7n5Ik?lgVcO ziOZVpw3|wd*B?YVa6vxk`5XohuR({zbNTuDS5?o-Vv_H@y1%}Ba;rHh_I5--EGMC| z$MQL5POhK)oB4|@UPu(xevSbw&YZ#ZDbHcpf9vdDthGA@^-PZzhfxRaqlkf+Wi38u zKQYm9N5~;xF*!tRu^An~CLN13h$3a%Wk-SA83QPl%i!8`Jr*2`Ol~1fDnup~UON!a z-ObJBp67zk?M7rq8$HJMri8SMWFR6Zi-CAfMmZ`TBwgf5$h` zITlG40t4Z%+s7jR<#;3uL6-10X<6*`#kYm|K{2U&9)oW}fazftm?P$eEyvblU^{lh zq?PeDJs%UkxQ*q@K+~4DS^b!XXtc;igo?H>2MrvCH^;Eij>oK7y0*6CUtF+W^dYgb zj9J6{z%>)nZxY9 zi3Hh&$QAFkOK$>MGerHh;#P6LSVQ8m03w#TA*v_3!r^t1Bv2A30lOqeCG}pm$W2Vr z&%GoF{xG|}XlP&M$C*cDppB2kr{b=-FCL6<#7kFzYbqD0UMe^7e!ujl*LVjGs!h|I zXwq>~2kEf*dn;YB`OM3zFFpp282KtLqnZT5+n`~&TLI*ePo(dq3MomZFSC+4$-rE= zr@FcN3F9P|t&jaQI3xq7Wv!Sp%-bm=%i-Smw}BmNl1x|}xN8^!r;5mgmup_5TX!aq zeY_i$i^mdCmFT>j)3N9@yUBQ(C+o^vDx5vv*?Z|6R3Uq0P?|VC1k%Xu;;zoP*Xfo; zv0qH*lkNB$iP8g47`Klk>{#+I_hmG8{)r_5NP08!`W7cI`j=}B!Za&v3oqQ{DK{^? z8=EDdN1}>1nb16837&0A2yfGmDrem%jF0pmbfsD_nSjkynuK_! z2kVOTfmF%_P0Vhl3TlK-Kxd%~&~cLQU1QM6%uVY*YCDARoJe{d(t;-hh3>l-uDf3z4HpX;k9mwuLVs(qD<^rf~m%bPZBWJ zouFLgBefo0p_C=uwcIV-eOxiOXL}QN*@G3J`g7}SF>=f@spm z&~1Dwn*#h+8qT33gyPf#yXE2u9p zb#dEz@Hu8X%P|-lU8>URP7AqI=xzBWhtd=rMMoNiUBV?Jck!GIDE4u5jBJM;qMz1- zTus1^_y_bi^e^;5x~>hQ_*x06FAnL8OOA47`Z9x=8<{}!kyYa8XS;Y8nNJ_`f?qPh zXXY=a4oXLDQ8&~N4M736<8}W2<>FIl)jLM8rgqB|oyhbB11yTLofODK$7cU$9Z zcUG@os==AanS<3G6+RI`KY1oZmNsDqf`E@4!~nsgi?Oo-T+p}xGx$>y*I$7Dylf6U z;k%d$*kHbHz$2bx`twK?r(;ECBX2#A9CtsGgI5@9vbMVF(7we89V^Xf zM%Px#BCBfB1Yv4G85tSmye_}FUmM707N*7=7w^5!IaiUxcrl{@jJUso8_+L?Cdz_8K9J+kBVH}Y;~ zHlviXM$&0-`Qd;EvY&qcw5BCC6<`70m0P51rGv89B9MA@=_Z%S`75fGA)@Q~jmw+s zqif@6HPgPp5YZk2)2mL&+xVk+SM@^dPl)J|-IL~e`3_{jG-20jWHmg?{<39r@{yo@ z=|)*#evbHLc8=a{TI;CRdt$LqQg%-G{!GX8@1oNeMvLLUCAesN04t2#*?S{bziL*J zRU)uTG)Qy8`3-C?IWMBj<^@L2MssTrn;#=8W& z1di#t!LBFS$gHICKZ=W5Tu+|XKQ&`&hJQ6>g9_yVX@dqqj146fSMUP2%rVI!30Hkd#a)EKjiw?-c2SG( zfeIeI+~P)V%rlEwNwN8FEliW*K3P;OD#e#l!PE?sHvgA!I>LH~cS#zR+a$dbHQWRT zNb(596#&+a+hK(|p}EdgS*cE2&fkxer@#=Fo}+8`iRofTB+}rZW6BKmaBj;iN@duH zK&1i8bw+ljIu%AXY-vdEh2mWA1HK(-;$K^0CfzWdE_ok2Lo&{fqiUEpD^SAI{RqRg zm|DRaKiapgOSabS_fsA7d>M#vSi{es=~29jVZ!scrIrU)F_IG36{p);6E@uyYL4l^ z#BXce*W%2}Ki!I4Rrm+50)}5<wDBaU>ENVU*`zOUU+8+sofa+-*x><~olzDu@_piuOIu z-bTtl&L(5DGq=5_<%EF^VoOQ7t*(Chk;UD|V z*zLU*zdX|}v;9Z&DKq$fEy&oM#r*Y0(jO=BRl`rz;t}J<+NRqc=SsK%vl0c?4gx zY;@eG%EX_OvDuh6wi=7s`1JlRY-lxR#=_#0OuF@QF4Kl7{V7coZy{Lde15=s&!Av%YeiX_)1;IZVL zL@q(_k+>z^O#Ob3tXVefdH#bR!!O`Kxdrh7@53t@nTYO_Ofsls9AVp(oA7MP8`xSl zXE3eIOqGLGBMuwSbQzg#P(cja`YdgH*w#Nc6Wn=j77L<*%RbfuIXpnjcUC|wX zr^z1p)ue6uX-x@l^2ZE(Hp~6>To24m8h5xY%n=E*ZHh!_TDuWR%Wg;VZY0?*lLXwF zGz_?ML1Qt^rRHu^u^-!J;SB$g?Jb|=yXNkE4Xyn(dppwuG^Mql%$?2gAGw0kjP7SO zlBSf&&7ZI3-m&acvF%JU2nfj>gKDB;?q&j{8bV|L6r&8-Dy{u;{l;Ie@hvfJm+b21 z4_o^Z+mtusk1{5(7ZQK0{ir9{+_WBKV3Mw0&5*I*=(9O_X5AD-1D@w3o+ALOrh*-}IAeiOLgG)eDLId-YsQ*TAn zil#h0FE)eC_~IHAANbCEgYg5WcK)FeIznjdtGg%BjPT7~8U}$!<`bB@sC4R59vQ?;k8ui2+HNOw5yjf6 z*zB8ngToOm741e5^7iCb5y_eyqEVSg%Me}}m1I=$%hk)r*OT@h{`u?02s008=*4c$ zoTL}GJJVCIl;mzqt?s_T`8|CqZEBD+Jz*g|fS$K|J3Wn#<v@kQ0vr)VRYzNyIbOLk?aV@hmu)}5_X#wSY0 zWLcluvUK5eJ-$^T!`|gm_eCR8u_2P%vxs54e<}gc`lcg`2gP(2w9OH!X zy5Us_WqIQz57zZmht#Ls+=~V2nEKF>NC!)B@LpS0bB?|G6hvtMp$(Y=cbSUN>nM1P zzC-0G!X3%Azd&aluFK53Uy9l+WZ3?*)K({%-!ci{R@8 zei>it2b#cp{seKBoJ#!!^GRfKqSr)mxyz5Kl*2}ayt}YbcwCRP2wjBk!+Iq(2q-i z^5k!=L>W%dz(?aYI6!e8z6PgbJMkm9(qscE-h_AKDpDhC!9d8_c(nv63Iycf&WmPQpxjL=x zT=cRia1}f7vNqPKNxvzFw!GT;>p=9O9YZ?@#srzgDSZvkg%VHU|C&+G4EX9|O%`XV zUo#S3b~E!QTAA62?{2>ePnteskYZh)2fT}2{v4h(tx&KA9lsqQ$I=x6v6;^Yveu30 zJTBaL?a+=g*$Ot%hH@|%@7e7xH;4awW>qu%$pyh0`kmoMeI^Uhp5Pl5ky+=|_>Er# zqp_LK;Ur)A9$A))@FkHKM%a=`?#;XnQKYlEO^Ys{A{Q5`kk95K)kUOUr&c|}LXmE3 z9CWNnzt!Qiyf4=RJSlwN(#-qRvfxVAqN$xZw3+=mOMYW{FbMk`Xm&R*=_L6Q?)^{U z!P14LeQBB1n{(4xgHK7?WoIun^GZuvdiQ6|Z|zIKSn$+s1Int(8ah|{<072u7eDf; zM!%QVgDR*+;J`^-^$C~itl7KX^mkK&?j>&Iw#}8?NZJ`8T-R(H*@hpNzT@pJzU4-; z!>0A-IQvF7`_g8PCwJ-Vcj@3pVuEPqos68^Y9>gy7-Jv)j`wxW%WWMPkBl@PELRuZ z6W#EbCh}ulQ=LGnz)#9n@4s7Lm38_h*uU>qR$s$9-a8%_6JQ77Z(SEJy~MBN*YiIu zGnhWOL?xkauX(Gef9Lxq6|pXnFhM*E6E6_+#gXDeI*T%tJO zH9Kb=YdfCgkYlpANLR40V6kef1Oa~3kP#gcxVeopaQoZun}8=)^1jK$jcho4==C68 zcIvXOp!ClBrib|3>peS$HnA#kR>FuP1^n@!Miqf8Lr1_t`kVeIbo%7@SRW>U$2gw8 zZ~7?xA;oRpH___=VSOoT1Zsxb%~&VfDqFkLgLSp*NWRf&S=j$m)tSdbwf=GZIcLU_ zmXSzG9b_#v5v?>cvedoZJ4Vue2T^X@7?Jj4Z@pK_Qc@Gq;>x6mez}d2t&}mSqm&qKVH0j&$FE8dCu~EKHu+&kIG9rHKaqZ-=AtEl(8gLyQC()iXC#kF^gD0oGn7SaC(Ay zB=O+N4^tN{$tO@5(Lku>>$>dGYN@NFFKZ;gDz7VYJNYb!9@E|bxE#8x)Gh#uN7Pg=YUr=Qi1KPG#&HhLw>JTk6 z*&$y$juknX6gknL$!H7zABQ`b`^5t*_9H{cZR7zGoggoeW{Kq9 zNj*vG8@uU$JxO=0@a!b}$2J=r+U>HFV$<|y>(5J(CpIRgPB&vVzKc3zfF(~z)|Q<6 zmvJY7vtin&+qR|8=cRmjT~_K-H9_JcK|f3UC1H{{Nvh-+vafpjVW7u__$n-7?Ak+fQRU;1@@6r*Bor=rU`*O9aL zf|6rcT#@^)Bd^IYwdVQMC9~)f=GBpB2*&@2ulsF^lM@xLw>mm5top?o`^6eZzgTZl z#4FMi=M+~fk73ny=;`pk6thUPgQJu6RHmxQD#TU!sK_AIX4M{5x~hA-kuxgiG^rea z>*)BX8bVF}siPxmSK`4$wKy<_N~T^Mi1WGpDDEni$4AVDY8M*)O#9PebR3;ZpQZmt z--4hL8d-PJooP7&1J*qun#P*PTE<$>+QmA^%F?6EzMRZbhtp{@jA^dtcG$%zQg1rr9Bd4^v$b;HVb1bvdl2X(A{In=lZk5~@7c6|R!{!G0Q(m+PUcr$-x#8m%l z!B%5SPGn!a|HZQab_&!1BB17jTL?HhWqpx*u9pmT;0_XKINqESWENRZIA9=N+x0@g zz;guSd<6LVuxy{rTNq^6X2$w39tP3!>{09q>=Lmvk3H&r>cLHE4%m^^Mp0S%1keZbI-_4x7W{^l2ARpLpTC^6c-wNI+BN zigE-)_~ZCDkLL&+DR;_`LLpQfKb22>3|zE?JYB`N?9wW`a;W@b>#F>Y|Kd(31S7b6 zb?po;&g)Y#P7-o^RgA(2;cnqSA8bww5mQG}P$g8#UI=@H!$fAHR!5P$D2o;1Zyobc*+=unEB`E0pJ1kUs?~{MP`heKn@UkOOWcj#=N)zMA zVY)wVF}^#E#73&Ri1Vb3L`w1r*|kGbpc^YG2pnH=7nvtcP4q|v?P5Gvd4IB`pl4qq zni<+FnPp?=BJRg6~HE9NM?6+O#a=|DEDtl|fR+P!ZWQMJ1= zp*pH@+EK+HH*Qs2Q$RRGC0FK4_J$dC>U+cP6F4l4AQT`*zAm6sUw_vNbLAr+G4q7A zy$UFo=%}h|hgXMgtXGFY?2ps#sZg8hlWHjSYkZ@5#P41mTxwRvUi7|9 z?tj79EbyQX6PItKqNqbuHg%aoHB<}riuyt=JM_<-WBeI3B9o8T@qVF0X`PjIJoP$4 z>V@=>Zl}G^Jahg{8h#%AGd;QjG&|a-J*t*(VeMm~3|2l%?HGT`QinGlzJf-JJIp5& zxj|lpO0;fFhZQ%PI85Xa#l#Kb*VSU5Y`S*?p!ex2(m;zBd3xBFh#Gwp1${V!ymxbV z&8Wn%YBTm9iZ8}3o)!_>Q~V=lhx#+aec4^+FV^p5;?V&Id$xvd+WgE+7t6QT8Op`- z0uAfe4X@$NQ&!j{Tw-I^i8B&Q!a`YlYHYVA1Sc}KB<}m&JBDGXue1(ic*kHjcdNa( zp+h(nSd`sU$PJ9t@dUZkRv5p9y#lxn_Dm%dUh|3yRo)K`vO zbUU+9Imx#!KyVI)F8o30FANhd9I~(Sn9zDy`H}7Sx=CNIQV?7hfTLl=Y4&QpFFsp` z>xfK5Xrjnf#1{pKHi_azX`-S4Y(i~N(fXN}vgC`!4FOw+qlSQ2(Tdyrt22uhM{t$G z%Fj-ZuYz+Je8Zmu#@DMo24-ld>!f;c4kO{BR?-{sA#ITFqE-(dPQ4y0tfyd)d!KISxz-k)Q&sHitZ+r z4X%_nwWw-TCNv>M37vCmT*C?vCaIkUW#cL$I!zCoq=r7`_q212F`5)Vir+kHiSpE= zeih--(H~woXJemlpY*W6rh|g8^UbzcRYXV@XlRfv*wTTH@@cPge7h1Y!N=hX=PS~iPP<@L7T0e%qRlrY&P zAe*9A@EX#Kk6pIV5@3O{i7B3@gyCvr9JjU$g7ry zO}exScEg@b-muy`m4Ar$1Z^w$@yW*2trvxqn2M!RD0G3kLe)}#gRYIj=nGBw2}C7w zrF=So-bD9l)X+DPnmR7chBcGr|KqSd!~I!dtXxn$LoYK}Rcy^=cr=0Ri8(}_ERg7w zB@jo5TmqF6b%f{THbSlRpTqa&qq*!w>^1DI?EP%@bNN;UY9!gm72gMkBDEBHH|Hql zg7i<0g7b)j-f$+;#(X<|3U!7O^2K}<%TM8-;pZmS^8e;j3ryFbslw4Ke9o|09xHsL ztA+EmklJ}bur3R0ge}5X!Y@Mf(^gZ_I*=G_eeYtlFmE9QXb|+TM!~^386?~%=C9r; zL8@RK_J=jLMmNU>lCJ=nc}s$VW7xY^9TnTZV4f7CTkCh$ z+Po%LyxDxZDe>WKzhL(SxafuMc_qf2R=!`+G3s1{_*KNFuK(?AKM_4qUX|EaF|apU(cFHB)aeI07RR+Y#218Im6kn_EZY=GNofLJnV4`mJ*H zWT1=6ki!R3V((-~@{igVJjy}p=;;-*lEV!VRg%a27ZTJXF%z2Q?#(3*$!krI@5Vn{& zuyALMbGHbE+GUt)K~hIoPy-OQ>&YqZKm2d3D)@}{HLJg-a!8~{rc|retvlI5z9NI? zuCGKdg`b5iQD4|fT43y*XqT05O3Zi5P46QsocNuTU-*zc5MNh5KFZf_Z6d_NCTC1Wrqc4`xgJu^N{pQ>( zc0M}uz^X-D@nb8}5FW+VH<&Yx6v)`4#E&0wxK1t3E)`1m$}5~5OZ6{oFs>Eg5zF97 zTs);1oH}E?xnFMjFwS~ZMO|ORJ3gi4g{z@Ctfr_b4^lu^I$*Mi)bW zeNn6Ryo~C?ph0$L^4u%gU7$Ui@m*DAKj2^vzM3Ty!d>hEhN@aDjR#~TvspuK0$erQ2`FZ4LoA-8F zT#qWxc{QgcFZUYXku9#8Wm$Pc=6~y^4}Rd52;#pJg8fPV2!+|M%43Q%E}zJSju|Jn zX>$o1vQw?HyvMjx8&w;if2Y~PQ>ES5%pRu-)&D(qSflkc0}jKAvraYI&G5Cd5ohdZ zz#^w-sPa{)Ox2)z`uA&PcVpYM1V`Rn)HZDlHHqR-0%{c%@$c`^x^Yx$Ti`qH&z6^{ zO6nd-p*HFhHIyc3&=k{)I?{edKM7%Ce}1jZq6_IOD_<*73;l}ji?MfN9s2R=YX6n2 zgM8QVkW*rawQnv9m9pwst*lNKlj!r4K!!U($B3jr;^(*9iD*(XCTc`d0dbwUL-dJk z(91=hX4a|G%i6-pk6+xYJ(JY}QkOvw-E61C*7fNR_OS~y*!gCA9Adt340oR*d%ZXB zICrbemOF$cEq1;gGn<3eB(@}4Ol-6t)I26tN5U8_@#i3_LC~>%=K8cG&M8h2r<#NA zy9zqG8y}`x2V!#{rt0&N1s{@Z@RxW*c&(jBx+iVrGxzgD+7Hf+JL`pQDw&T(pj-Th z{J!XiUV+&%l#=5nGZe%7-%^`Eb$kuVFBNnsgpY*ZwC(z8jhUU|(CLTUgE9jQ#ps;q zs_3>z?HOT^Mx+giW|E7=-SUNGaCo;olw7RRO(sv1?qs7=Ty?Dc(2d`d${t*4BOgR! zdqZ3GV_MeJ>O26$xt`T@kmJz>){t-Db4kv{$1=|sZ$7BN=cQAIo;Jv8Jzoue{C@s# z8)NVY?FSe9BR+)gjNh0TmH1BFLza1AIX>rL3n0>f%dIkln{`(`SDGk~mkghmlJjhe z1j{BV?q$kI;w_me`9g)v#=GSfC(7~7hyDy((9M|lF3JgoyibrEk>pBBCHGys<&O`e zmUoez*xZ(P>eLzP%o(jqJS4-HO4mtu=9N77kA}CsFC6Ze{e(K2v?oKFFD;WoYUEJC z-x1b-c2k$LZlhggl95f)XVPw|9w{@GO_m|_x?(p;CK0rN{}`y{HmiKSGp?rb$hg9*>Q`GPd3v&9;02h-{$wqBNclU#}w$iLZ(nEo+!E$I;y!_&vYO=RdD#34o?+1maq0tmXNJR z?5`T8sP^}t=+C>r`RW<(POG)A;A;=%^uA~-t@d1>8!xwtzf!6yiR zh}S#21QkWd*P%$*YJs$!;EdGFrx7&)#KmCwM=5Qss5em_%mTr0bskcipFR z=5v;FHh|2B^KB{JpIzLr6%*|xlQ$UP4QCK~2Dxq;(G5sn=Pp3Z5?ODSYGSg7cSyzvKf{5ngrs+U#0bb=f)`{ah*v+c zBwafhM*z+0N6A1MfK2Zv6}Fv>K__7&s-HO7buxYcqRwdE*TnGYos4Zj9QsMJt2_S3 z0Gqdvi1EPy5)@9RGX`g3Xm}DAV!1h;(E`M= zpCkhrlJ$Mb%*b?x7mykKHsO)!Mhp^=I+f$sQw>HnS;aR8%ef zcmZSxkiL@NuD8bD0a1TTrSB+rgLINH?i|*eD6-F}35vD{GQQtv2~^JqqG@6?R3-!h zc}u?*v>t4>4zO|0ddAobgxOy`bCVwa+km6upsVB=KR$Ah&^N zst<>r{S8FZGczc<4Tz>eabUy9#So;F{@VLE7khjtkg@%B5L^nG#y(4)rSDl%#S=MIra~X{H}V-4c2%r7)|J} z-WNy{kSYD-DOAsdOud@wM?q!gKr};^4Gm%g(F_pN)gGS>MAI>QIBF>nQgfIk7_9+B z^jGE%MhQSP{fL7Gr2>KU&|hav#aRzr21LDz`{qy~*mMuD@l|9p%+L2-dirb*09gWL zD%pS7Q#fotAWiQpz^Dj_dhz!iX1LKBe-1=_f#@Ud&}hT_?;9NiWGWENWNd;{{Sy$2 z{-c=x*yAD~mI&(aD`*My^)MjK`G|vpGJ$ALS{#g`42WhF-JwA(Ks1fEhoYIVt*V)N zC*detAn<93uXU}5y4-=lc_qIt4_`RU7m%j1a40$qh~`vh133mnGhs7e1(yTSEZ{;Q zEd$6cAe{rqQy_Yfo>_eq+1Gn!gF9~V74;EQAhQM#Cm=op$O0g12aq5jF#|{`^gbPk zW;mLG6n-P1ABR>j!}ajGZ>X1;0r__TaRGuCd|%KKAf^LI9FS=P$VnjH14t>5wf%%t zSKkaMt{?R_C_)cEF@VIu0F?lNB4{Wvo(cA-%K+(s6Xs#A6aE8tU(Oh)% zz^3YZ8xk!6qq_r)D!_;WqFIVfP}yf7n#!8N#-i~1%3c9+96*?c=?u34WE2pe0fdZ$ z>H`63+Gr0(+Xon(1e^T>Y?#mO@oXTPONu>^Dj=G5?+fGw5Y1UEgbVZVqVMk%86=$8 zF@Q8HxB`r(4lpW(>Ro|on&=Kq^aG+f)lG11SPevTwTOf26M<-kb%hB-M+!vqOyFxm zGITBtK&4<*Jb*MkR5GptvF{&y_ijiT4@5ISPe&>lT|hLqrMS;oOoPkcH!%ooEP#BS z`A}M+31g)W50Iusc~HH_05U3{p)-F#L2;%m)>0sv%9!w7i_HUU+zA#d;c~H?4Za&U zs-Qe!yS<(@Y#}GdLGar7o7n7T1DD% zSU%*5C*7rE(2N8ugaygWul2idh(baxk;wWxE-C@56hr0rSKp9iunxvqp`e zU$*DfW$IyVo&Whau^?a?yPnC|IrB|B*`te4gB$T~Gl9mwZ2t>BqN2K#iO~I*?LO!; zB>%QNKbUzS>kLAsCI;sTNa&p0kg1=Sqd#hd9enR#E~$_E!9RDT8GMH1&i1vLj9nRv zF;r$^012go+VmxE$1!vdekCA9eDllpr_TBdPhnTlxNY!`1sThyn9^|jJ_UnfD}x6S lU&Mh#<20Po7&wg+Ucc!}#=k;4KnK57G0!T%96ly^=KtD9I6wdZ diff --git a/FreeModbus/modbus/ascii/mbascii.c b/FreeModbus/modbus/ascii/mbascii.c index 34fdf96..ad24332 100644 --- a/FreeModbus/modbus/ascii/mbascii.c +++ b/FreeModbus/modbus/ascii/mbascii.c @@ -44,7 +44,7 @@ #include "mbcrc.h" #include "mbport.h" -#if MB_ASCII_ENABLED > 0 +#if MB_SLAVER_ASCII_ENABLED > 0 /* ----------------------- Defines ------------------------------------------*/ #define MB_ASCII_DEFAULT_CR '\r' /*!< Default CR character for Modbus ASCII. */ diff --git a/FreeModbus/modbus/ascii/mbascii.h b/FreeModbus/modbus/ascii/mbascii.h index d2500f7..a99076a 100644 --- a/FreeModbus/modbus/ascii/mbascii.h +++ b/FreeModbus/modbus/ascii/mbascii.h @@ -35,7 +35,7 @@ PR_BEGIN_EXTERN_C #endif -#if MB_ASCII_ENABLED > 0 +#if MB_SLAVER_ASCII_ENABLED > 0 eMBErrorCode eMBASCIIInit( UCHAR slaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ); void eMBASCIIStart( void ); diff --git a/FreeModbus/modbus/include/mbconfig.h b/FreeModbus/modbus/include/mbconfig.h index e46f7fc..d2a7bd9 100644 --- a/FreeModbus/modbus/include/mbconfig.h +++ b/FreeModbus/modbus/include/mbconfig.h @@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * File: $Id: mbconfig.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ + * $Id: mbconfig.h,v 1.15 2013/08/13 21:19:55 Armink Add Master Functions $ */ #ifndef _MB_CONFIG_H @@ -46,12 +47,18 @@ PR_BEGIN_EXTERN_C /*! \addtogroup modbus_cfg * @{ */ -/*! \brief If Modbus ASCII support is enabled. */ -#define MB_ASCII_ENABLED ( 0 ) -/*! \brief If Modbus RTU support is enabled. */ -#define MB_RTU_ENABLED ( 1 ) -/*! \brief If Modbus TCP support is enabled. */ -#define MB_TCP_ENABLED ( 0 ) +/*! \brief If Modbus Master ASCII support is enabled. */ +#define MB_MASTER_ASCII_ENABLED ( 0 ) +/*! \brief If Modbus Master RTU support is enabled. */ +#define MB_MASTER_RTU_ENABLED ( 1 ) +/*! \brief If Modbus Master TCP support is enabled. */ +#define MB_MASTER_TCP_ENABLED ( 0 ) +/*! \brief If Modbus Slaver ASCII support is enabled. */ +#define MB_SLAVER_ASCII_ENABLED ( 0 ) +/*! \brief If Modbus Slaver RTU support is enabled. */ +#define MB_SLAVER_RTU_ENABLED ( 1 ) +/*! \brief If Modbus Slaver TCP support is enabled. */ +#define MB_SLAVER_TCP_ENABLED ( 0 ) /*! \brief The character timeout value for Modbus ASCII. * * The character timeout value is not fixed for Modbus ASCII and is therefore diff --git a/FreeModbus/modbus/mb.c b/FreeModbus/modbus/mb.c index 6557813..ec8a440 100644 --- a/FreeModbus/modbus/mb.c +++ b/FreeModbus/modbus/mb.c @@ -44,13 +44,13 @@ #include "mbfunc.h" #include "mbport.h" -#if MB_RTU_ENABLED == 1 +#if MB_SLAVER_RTU_ENABLED == 1 #include "mbrtu.h" #endif -#if MB_ASCII_ENABLED == 1 +#if MB_SLAVER_ASCII_ENABLED == 1 #include "mbascii.h" #endif -#if MB_TCP_ENABLED == 1 +#if MB_SLAVER_TCP_ENABLED == 1 #include "mbtcp.h" #endif @@ -72,6 +72,7 @@ static enum /* Functions pointer which are initialized in eMBInit( ). Depending on the * mode (RTU or ASCII) the are set to the correct implementations. + * Using for Modbus Slaver */ static peMBFrameSend peMBFrameSendCur; static pvMBFrameStart pvMBFrameStartCur; @@ -79,9 +80,20 @@ static pvMBFrameStop pvMBFrameStopCur; static peMBFrameReceive peMBFrameReceiveCur; static pvMBFrameClose pvMBFrameCloseCur; +/* Functions pointer which are initialized in eMBInit( ). Depending on the + * mode (RTU or ASCII) the are set to the correct implementations. + * Using for Modbus Master,Add by Armink 20130813 + */ +static peMBFrameSend peMBMasterFrameSendCur; +static pvMBFrameStart pvMBMasterFrameStartCur; +static pvMBFrameStop pvMBMasterFrameStopCur; +static peMBFrameReceive peMBMasterFrameReceiveCur; +static pvMBFrameClose pvMBMasterFrameCloseCur; + /* Callback functions required by the porting layer. They are called when * an external event has happend which includes a timeout or the reception * or transmission of a character. + * Using for Modbus Slaver */ BOOL( *pxMBFrameCBByteReceived ) ( void ); BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); @@ -90,6 +102,18 @@ BOOL( *pxMBPortCBTimerExpired ) ( void ); BOOL( *pxMBFrameCBReceiveFSMCur ) ( void ); BOOL( *pxMBFrameCBTransmitFSMCur ) ( void ); +/* Callback functions required by the porting layer. They are called when + * an external event has happend which includes a timeout or the reception + * or transmission of a character. + * Using for Modbus Master,Add by Armink 20130813 + */ +BOOL( *pxMBMasterFrameCBByteReceived ) ( void ); +BOOL( *pxMBMasterFrameCBTransmitterEmpty ) ( void ); +BOOL( *pxMBMasterPortCBTimerExpired ) ( void ); + +BOOL( *pxMBMasterFrameCBReceiveFSMCur ) ( void ); +BOOL( *pxMBMasterFrameCBTransmitFSMCur ) ( void ); + /* An array of Modbus functions handlers which associates Modbus function * codes with implementing functions. */ @@ -144,7 +168,7 @@ eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eM switch ( eMode ) { -#if MB_RTU_ENABLED > 0 +#if MB_SLAVER_RTU_ENABLED > 0 case MB_RTU: pvMBFrameStartCur = eMBRTUStart; pvMBFrameStopCur = eMBRTUStop; @@ -158,7 +182,7 @@ eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eM eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); break; #endif -#if MB_ASCII_ENABLED > 0 +#if MB_SLAVER_ASCII_ENABLED > 0 case MB_ASCII: pvMBFrameStartCur = eMBASCIIStart; pvMBFrameStopCur = eMBASCIIStop; @@ -193,7 +217,7 @@ eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eM return eStatus; } -#if MB_TCP_ENABLED > 0 +#if MB_SLAVER_TCP_ENABLED > 0 eMBErrorCode eMBTCPInit( USHORT ucTCPPort ) { diff --git a/FreeModbus/modbus/tcp/mbtcp.c b/FreeModbus/modbus/tcp/mbtcp.c index eb79a32..af8f07b 100644 --- a/FreeModbus/modbus/tcp/mbtcp.c +++ b/FreeModbus/modbus/tcp/mbtcp.c @@ -42,7 +42,7 @@ #include "mbframe.h" #include "mbport.h" -#if MB_TCP_ENABLED > 0 +#if MB_SLAVER_TCP_ENABLED > 0 /* ----------------------- Defines ------------------------------------------*/ diff --git a/FreeModbus/port/port.h b/FreeModbus/port/port.h index 9838a6c..734fcc2 100644 --- a/FreeModbus/port/port.h +++ b/FreeModbus/port/port.h @@ -39,9 +39,6 @@ #define MASTER_RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) #define MASTER_RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) -//void USART1_IRQHandler(void); -//void TIM3_IRQHandler(void); - #define ENTER_CRITICAL_SECTION() EnterCriticalSection() #define EXIT_CRITICAL_SECTION() ExitCriticalSection() diff --git a/FreeModbus/port/port_m_serial.c b/FreeModbus/port/port_m_serial.c index ce7b008..a2e8bd6 100644 --- a/FreeModbus/port/port_m_serial.c +++ b/FreeModbus/port/port_m_serial.c @@ -29,7 +29,7 @@ static void prvvUARTTxReadyISR(void); static void prvvUARTRxISR(void); /* ----------------------- Start implementation -----------------------------*/ -void vMBPortMasterSerialEnable(BOOL xRxEnable, BOOL xTxEnable) +void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) { if (xRxEnable) { @@ -51,13 +51,13 @@ void vMBPortMasterSerialEnable(BOOL xRxEnable, BOOL xTxEnable) } } -void vMBPortMasterClose(void) +void vMBMasterPortClose(void) { USART_ITConfig(USART2, USART_IT_TXE | USART_IT_RXNE, DISABLE); USART_Cmd(USART2, DISABLE); } //Ĭһӻ 2 ʿ ż -BOOL xMBPortMasterSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, +BOOL xMBMasterPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity) { GPIO_InitTypeDef GPIO_InitStructure; @@ -130,13 +130,13 @@ BOOL xMBPortMasterSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, return TRUE; } -BOOL xMBPortMasterSerialPutByte(CHAR ucByte) +BOOL xMBMasterPortSerialPutByte(CHAR ucByte) { USART_SendData(USART2, ucByte); return TRUE; } -BOOL xMBPortMasterSerialGetByte(CHAR * pucByte) +BOOL xMBMasterPortSerialGetByte(CHAR * pucByte) { *pucByte = USART_ReceiveData(USART2); return TRUE; @@ -151,7 +151,7 @@ BOOL xMBPortMasterSerialGetByte(CHAR * pucByte) */ void prvvUARTTxReadyISR(void) { - pxMBFrameCBTransmitterEmpty(); + pxMBMasterFrameCBTransmitterEmpty(); } /* @@ -162,7 +162,7 @@ void prvvUARTTxReadyISR(void) */ void prvvUARTRxISR(void) { - pxMBFrameCBByteReceived(); + pxMBMasterFrameCBByteReceived(); } /******************************************************************************* * Function Name : USART2_IRQHandler diff --git a/FreeModbus/port/port_m_timer.c b/FreeModbus/port/port_m_timer.c index 036a094..0787e98 100644 --- a/FreeModbus/port/port_m_timer.c +++ b/FreeModbus/port/port_m_timer.c @@ -30,7 +30,7 @@ static void prvvTIMERExpiredISR(void); /* ----------------------- Start implementation -----------------------------*/ -BOOL xMBPortMasterTimersInit(USHORT usTim1Timerout50us) +BOOL xMBMasterPortTimersInit(USHORT usTim1Timerout50us) { uint16_t PrescalerValue = 0; @@ -72,7 +72,7 @@ BOOL xMBPortMasterTimersInit(USHORT usTim1Timerout50us) return TRUE; } -void vMBPortMasterTimersEnable() +void vMBMasterPortTimersEnable() { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); @@ -80,7 +80,7 @@ void vMBPortMasterTimersEnable() TIM_Cmd(TIM2, ENABLE); } -void vMBPortMasterTimersDisable() +void vMBMasterPortTimersDisable() { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); @@ -90,8 +90,7 @@ void vMBPortMasterTimersDisable() void prvvTIMERExpiredISR(void) { - //TODO ޸ʺ - (void) pxMBPortCBTimerExpired(); + (void) pxMBMasterPortCBTimerExpired(); } void TIM2_IRQHandler(void)