EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
stm32F4 lwip+TCP Modbus 移植; G1 U$ l2 S( O! \3 U
, C4 i# W |2 T+ e; l2 _& R
) z2 Y0 ]- [! w* {( _
1、硬件+TCP协议栈: LAN8720+LWIP 例程可以参看原子的例程 UCOS+lwip例程- h! R. G6 X1 Q* L- Y
2、开发环境:MDK511 5 Y1 t8 F9 A: Y* B
# {- K7 }2 E$ l8 w4 D# S& ~: ]3 o2 V" @1 u: D
第一步:需要编写一个文件porttcp.c 我下面附录会给,直接加入工程中
8 x2 S8 ?: x& P" e+ S+ C4 p+ q # F$ x9 F( f1 @/ z( I& ^' [6 X) B% ]
编译出现如下错误:& a- G3 ?2 Y& P
. r) [$ g# V! U) Q* X3 b; i9 }修改如下:, _0 l n. C* j& m! i1 |
在port.c文件中加入:
' N8 i8 B* r( k2 ^6 I0 j3 Kvoid EnterCriticalSection( ) { __ASM volatile("cpsid i"); }
0 x" ?! W* G8 |0 _( ~% X- Fvoid ExitCriticalSection( ) { __ASM volatile("cpsie i"); } 在port.h文件中加入: #define vPortEnterCritical( ) EnterCriticalSection( ) #define vPortExitCritical( ) ExitCriticalSection( )
g1 I8 W( X! @( X7 `7 e" E& N 在porteven.c中添加: static eMBEventType eTCPQueuedEvent ; static BOOL xTCPEventInQueue= false;
$ O: G3 a- A& `3 ]
" G/ S8 R; M) cBOOL xMBTCPPortEventInit( void ) { xTCPEventInQueue = FALSE; return TRUE; } # |# c, W$ {+ r4 M. V
void vMBTCPPortEventClose( void ) { xTCPEventInQueue = FALSE; } 8 r6 ^. F" J' l. ^5 @) P
BOOL xMBTCPPortEventPost( eMBEventType eEvent ) { xTCPEventInQueue = TRUE; eTCPQueuedEvent = eEvent; return TRUE; } 3 Z0 |$ I2 @* t9 x
BOOL xMBTCPPortEventGet( eMBEventType * eEvent ) { & w; V, \5 ~/ t
if( xTCPEventInQueue ) { *eEvent = eTCPQueuedEvent; xTCPEventInQueue = FALSE; return TRUE; } else { return FALSE; } } ) R1 ^& r$ @! K3 P% g* r- n. _
编译无错误。 第二步:将mb.c文件中的内容替换:(附录会给出) 编译还有4个错误: 在mbconfig.h中将#define MB_TCP_ENABLED ( 0 ) 改为: #define MB_TCP_ENABLED ( 1 ) 编译无错误。 + f0 @/ c6 f* T- z3 C
第三步:修改main函数 初始化加入: eMBTCPInit( TCP_SERVER_PORT ); eMBEnable( MB_TCP );
# [( V7 Y' k! }# o2 ^0 _( U* {& d4 _
1 F9 a! I3 E( h$ B+ A1 ~" S9 w5 }, v/ P
在while循环中加入: eMBPoll(); , j5 b1 L& ]0 k# {% K- I9 i: }. U' F
编译下载......
3 k) D# E' J4 n先ping一下:
8 Q u a; y) M& u# G- x. p/ h打开Modbus Poll设置如下: 以下是我定义的保持寄存器的值 u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0102,0x0304,0x0506,0x0708,0x1122,0x3344,0x5566,0x7799}; ! ^9 ]7 E& \ A0 \& ?5 S; |& V
1 S6 X% a$ }2 Y( {6 y
$ S$ M, A, E6 X7 W连接成功!返回如下: 此时,FreeModbus TCP移植成功! TCP Modbus和Serial Modbus可独立工作,以下是Modbus RTU返回的数据:
& l+ C$ U+ r5 J* A# _' e/ p
' S* b! L! ~/ R! ?1 r& d& R0 G8 B& J
下载:
3 D9 X) f- v f7 k' P* } |