EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
stm32F4 lwip+TCP Modbus 移植. \- G- p- {- u, C9 H6 l Y
. ]$ I* N' k3 [1 j, e
. _, [! s7 Z% w% U
1、硬件+TCP协议栈: LAN8720+LWIP 例程可以参看原子的例程 UCOS+lwip例程
! e& C, e5 K6 X6 ~ 2、开发环境:MDK511 * n& v: ^0 O6 R0 u+ `/ Z' w0 C9 }
# F% X# ~& s# m j0 c
) p: a' w7 N* ^第一步:需要编写一个文件porttcp.c 我下面附录会给,直接加入工程中
4 Z% M5 Y% f% [4 }- m
& a5 k$ |5 Y3 z- @编译出现如下错误:! |' h& S; Q N: M4 g, x" D4 L
[" i9 T' P: a5 Z4 W+ U* j修改如下:. A, z% u0 C8 R5 B, G; S1 Q- s: J* e
在port.c文件中加入:3 @; S+ j/ V- M; G# o
void EnterCriticalSection( ) { __ASM volatile("cpsid i"); } ; r/ B! F0 ]: |) F% q! e
void ExitCriticalSection( ) { __ASM volatile("cpsie i"); } 在port.h文件中加入: #define vPortEnterCritical( ) EnterCriticalSection( ) #define vPortExitCritical( ) ExitCriticalSection( ) 0 ` m4 Q. f% e- J, S
在porteven.c中添加: static eMBEventType eTCPQueuedEvent ; static BOOL xTCPEventInQueue= false; + m$ p( i; t8 A
$ r, M$ A. X9 w& A% _! s. [
BOOL xMBTCPPortEventInit( void ) { xTCPEventInQueue = FALSE; return TRUE; }
5 A5 @2 s, D/ d8 n4 Pvoid vMBTCPPortEventClose( void ) { xTCPEventInQueue = FALSE; }
; s& o Q! v ABOOL xMBTCPPortEventPost( eMBEventType eEvent ) { xTCPEventInQueue = TRUE; eTCPQueuedEvent = eEvent; return TRUE; } . i J9 f, A8 u9 n) h4 `( ^
BOOL xMBTCPPortEventGet( eMBEventType * eEvent ) { 3 j# D5 y- s/ D: o5 g# n$ R6 F
if( xTCPEventInQueue ) { *eEvent = eTCPQueuedEvent; xTCPEventInQueue = FALSE; return TRUE; } else { return FALSE; } } 6 `0 f( Y2 y. E; R1 n" R
编译无错误。 第二步:将mb.c文件中的内容替换:(附录会给出) 编译还有4个错误: 在mbconfig.h中将#define MB_TCP_ENABLED ( 0 ) 改为: #define MB_TCP_ENABLED ( 1 ) 编译无错误。
2 i0 A7 P& r; v3 B5 `9 d5 c# E& l# S- ]
第三步:修改main函数 初始化加入: eMBTCPInit( TCP_SERVER_PORT ); eMBEnable( MB_TCP ); / e) ]$ \1 w0 O+ ?% U2 W1 o, g- x) @5 n
8 d/ F% J" D# `, T! r: Q+ {- T
9 x! P* i: V. ]# W ~在while循环中加入: eMBPoll();
% W4 T! ^0 |5 Y/ u" _8 N' w* t/ d编译下载......
0 g7 M* c1 E P" C8 r& E s先ping一下:
) v+ }; D8 Q8 w% m5 |打开Modbus Poll设置如下: 以下是我定义的保持寄存器的值 u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0102,0x0304,0x0506,0x0708,0x1122,0x3344,0x5566,0x7799};
* E- K8 |. R& f7 s9 Z
9 ?% f& T a* K0 Z J$ `; h$ Z: ]0 ^% M2 h/ S3 h
连接成功!返回如下: 此时,FreeModbus TCP移植成功! TCP Modbus和Serial Modbus可独立工作,以下是Modbus RTU返回的数据:
- q: o' b' g5 D8 ]+ j. g( j5 {* }' b e' p2 l
下载:* j7 V; k7 w: t9 E3 K6 j, E
|