EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
stm32F4 lwip+TCP Modbus 移植
/ P$ @ s8 O" ?' A' Y6 i! n4 P' q
' Y5 [( z7 \$ H1 K9 _, b4 d' n1、硬件+TCP协议栈: LAN8720+LWIP 例程可以参看原子的例程 UCOS+lwip例程( h3 k4 q; h' R$ [9 s S7 z0 Q
2、开发环境:MDK511 2 _2 G- l y5 j1 ?: Q9 i4 h
1 i c7 A; O. Y6 }: N# ]$ H: v' f/ u/ H5 W8 Y7 [2 w
第一步:需要编写一个文件porttcp.c 我下面附录会给,直接加入工程中/ h5 v8 F$ G( O+ B4 u, B
: ` X6 K; }3 t: i
编译出现如下错误:
& N$ s9 ]3 o1 W! Q
8 x( @" l# O3 H/ F3 l4 A修改如下:5 @% Y7 Y, ^9 @! L n
在port.c文件中加入:
# B( p; ~& T7 C/ p! Y. r5 y7 M/ c7 ivoid EnterCriticalSection( ) { __ASM volatile("cpsid i"); }
! b) [ p& h: \+ Jvoid ExitCriticalSection( ) { __ASM volatile("cpsie i"); } 在port.h文件中加入: #define vPortEnterCritical( ) EnterCriticalSection( ) #define vPortExitCritical( ) ExitCriticalSection( ) 9 B1 T5 g' A' a2 z3 O* \6 l% V
在porteven.c中添加: static eMBEventType eTCPQueuedEvent ; static BOOL xTCPEventInQueue= false; ) t. s7 r( L g; O3 {" j
9 ?: U6 e1 ~; J8 C" rBOOL xMBTCPPortEventInit( void ) { xTCPEventInQueue = FALSE; return TRUE; }
2 `9 S" I! U6 Mvoid vMBTCPPortEventClose( void ) { xTCPEventInQueue = FALSE; }
3 k3 @. w6 q; S FBOOL xMBTCPPortEventPost( eMBEventType eEvent ) { xTCPEventInQueue = TRUE; eTCPQueuedEvent = eEvent; return TRUE; }
) u4 ? E A U7 f& Y4 d: qBOOL xMBTCPPortEventGet( eMBEventType * eEvent ) {
% f3 r! z5 Z' X* p* s& B/ Y if( xTCPEventInQueue ) { *eEvent = eTCPQueuedEvent; xTCPEventInQueue = FALSE; return TRUE; } else { return FALSE; } } + C& ~- d8 d+ v* h+ h
编译无错误。 第二步:将mb.c文件中的内容替换:(附录会给出) 编译还有4个错误: 在mbconfig.h中将#define MB_TCP_ENABLED ( 0 ) 改为: #define MB_TCP_ENABLED ( 1 ) 编译无错误。 + d" f/ K! U# R) x" B
第三步:修改main函数 初始化加入: eMBTCPInit( TCP_SERVER_PORT ); eMBEnable( MB_TCP ); ; g0 {' D! e+ r3 ]
- T/ F, { z0 H8 N/ H. B
/ }0 ^0 {) N" {) u T5 \! l. s
在while循环中加入: eMBPoll();
( e u1 e# j; y8 Q" B# |编译下载......
8 ~& U9 F2 Y8 d6 \! x; \5 ?先ping一下:
! b/ f3 Y* }' w( o6 h) L: E打开Modbus Poll设置如下: 以下是我定义的保持寄存器的值 u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0102,0x0304,0x0506,0x0708,0x1122,0x3344,0x5566,0x7799};
1 V+ k1 d2 {. {* _2 ~& F " J3 R7 M+ C4 n3 d0 b/ A |
# [# Q Y2 z' `6 g
连接成功!返回如下: 此时,FreeModbus TCP移植成功! TCP Modbus和Serial Modbus可独立工作,以下是Modbus RTU返回的数据: 2 W2 \4 r0 j( K4 }) D# ]- k
1 f4 Q* o' I: C
下载:+ S" M9 c& D; z9 s& `6 G# b9 V
|