EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
stm32F4 lwip+TCP Modbus 移植- v: i- Y3 D3 F1 [1 M
- n J2 ]' m0 E
6 g* J* H5 m3 M8 D1 h1、硬件+TCP协议栈: LAN8720+LWIP 例程可以参看原子的例程 UCOS+lwip例程
4 J6 l7 B2 T0 f( ~7 O1 R, X 2、开发环境:MDK511
$ I( G, k$ f' {) O; w1 q) r) F, i& a; o, J( {& G
4 _( G% }" u+ ~) U6 K( O
第一步:需要编写一个文件porttcp.c 我下面附录会给,直接加入工程中$ L* n; _3 a2 C4 t. B
2 H& z% I* N( X5 ~$ J+ X
编译出现如下错误:7 K* X% h" H: t$ d
) i- m. v9 ^# N- g4 x3 U7 X
修改如下:, \+ _3 k! G5 U5 Q8 F* ^
在port.c文件中加入:9 _) t2 h' n- K# ?5 s
void EnterCriticalSection( ) { __ASM volatile("cpsid i"); } / S" T: u1 _- r7 G
void ExitCriticalSection( ) { __ASM volatile("cpsie i"); } 在port.h文件中加入: #define vPortEnterCritical( ) EnterCriticalSection( ) #define vPortExitCritical( ) ExitCriticalSection( )
$ Z% F1 p9 ?8 ]# m' l4 Q5 [3 S 在porteven.c中添加: static eMBEventType eTCPQueuedEvent ; static BOOL xTCPEventInQueue= false;
# f# o, f# p/ N, a" ]: a% A% S; K4 B1 o2 w- b5 V
BOOL xMBTCPPortEventInit( void ) { xTCPEventInQueue = FALSE; return TRUE; }
: D& L" @% l# o* _4 j3 S2 fvoid vMBTCPPortEventClose( void ) { xTCPEventInQueue = FALSE; } ) G+ i3 D( b# b& v9 I
BOOL xMBTCPPortEventPost( eMBEventType eEvent ) { xTCPEventInQueue = TRUE; eTCPQueuedEvent = eEvent; return TRUE; }
$ ?$ Y1 b( H1 F7 XBOOL xMBTCPPortEventGet( eMBEventType * eEvent ) { ; N( t. ?- M; S5 e7 V
if( xTCPEventInQueue ) { *eEvent = eTCPQueuedEvent; xTCPEventInQueue = FALSE; return TRUE; } else { return FALSE; } } # x* H; {/ y# o$ |. y! B
编译无错误。 第二步:将mb.c文件中的内容替换:(附录会给出) 编译还有4个错误: 在mbconfig.h中将#define MB_TCP_ENABLED ( 0 ) 改为: #define MB_TCP_ENABLED ( 1 ) 编译无错误。 4 `* i' r/ [6 X+ _
第三步:修改main函数 初始化加入: eMBTCPInit( TCP_SERVER_PORT ); eMBEnable( MB_TCP ); ) K! _- m5 I k" Q" Q6 y0 a* B
8 e! ?; M) E- L1 u% E+ G$ _6 r3 a4 z5 f X/ c0 u: }+ i* U. P
在while循环中加入: eMBPoll();
- X) O) z; p! [- W% u编译下载...... ' ~$ @4 B$ U! k) Q. t
先ping一下: ! ~' q$ Q& P+ T" ]
打开Modbus Poll设置如下: 以下是我定义的保持寄存器的值 u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0102,0x0304,0x0506,0x0708,0x1122,0x3344,0x5566,0x7799};
+ N3 K9 `% f) D! p# ?
) F5 i+ D( Z* U' o. m
; ^5 G; |6 V) w2 {- ?: M+ E连接成功!返回如下: 此时,FreeModbus TCP移植成功! TCP Modbus和Serial Modbus可独立工作,以下是Modbus RTU返回的数据: ; Q( V ^7 [9 w0 [
4 P5 D* r. ? D: _/ f
|