官方下载freemodbus-v1.6.zip源码,然后把源码中的modbus文件夹、demo\BARE\port文件夹导入工程。
1 k9 v3 x$ E' S0 P4 y+ z) F3 \8 c. A
先是一波无脑导,把文件夹里所有文件导入。
+ Q1 ?' B! O$ i e- P
; N5 ? ~, U8 a' X0 }9 V: w存储区配置,单片机上定义的起始地址要比实际通信过程中读写的地址+1。! C2 {- x# X1 H5 |- M4 O/ s
- #include "mb.h"8 D3 `% y* d/ P! Q' }
- #include "mbport.h"2 A0 ^) i! V/ r0 F$ n
- #include "mbutils.h"* r( O$ O4 E, d9 _; }5 G
- //输入寄存器7 v0 b% f/ W4 I+ ]7 L, `5 \
- #define REG_INPUT_START 1001
& C9 l+ u2 @- Y0 [8 W - #define REG_INPUT_NREGS 2
/ Q$ g) g8 [8 m p! D: |5 j' J% F - 5 r* _6 ~) F8 ^4 h7 _- J6 i
- static USHORT usRegInputStart = REG_INPUT_START;5 t+ W& r! S" P s' E6 S* {# P
- static USHORT usRegInputBuf[REG_INPUT_NREGS];- Q+ Z( c2 i/ v/ ]
3 o# X5 N! \' C- B; d- //保持寄存器5 R X" h7 f2 N, m) X" q3 e% i3 n
- #define REG_HOLDING_START 2001
, `( @6 |* y, l& ` Q6 V( } - #define REG_HOLDING_NREGS 1
4 k1 O$ e. G0 m! P. P
$ J% o6 J5 F! @5 K/ [& n- j- static USHORT usRegHoldingStart = REG_HOLDING_START;+ @9 ?$ ^. E; z8 x; l$ p) d
- static USHORT usRegHoldingBuf[REG_HOLDING_NREGS];% D p9 B8 I/ b) h1 u/ t7 N: }+ X% x
- ' z! `0 j6 r/ a8 @. K' ]
- //输出线圈点+ U8 O+ }% K$ a" r) n( i2 F
- #define REG_COILS_START 3001) y5 H* v) |( o7 Q/ V0 z) H' I9 @
- #define REG_COILS_SIZE 40 D! a& j7 N1 e+ T) d" A) j
% D; i: c+ T9 T- static USHORT usRegCoilsStart = REG_COILS_START;
* B5 g! o) J' q- @ - static UCHAR ucRegCoilsBuf[REG_COILS_SIZE/8+(REG_COILS_SIZE%8?1:0)];- O& e u% L! Z
- $ I% ?% L( j q$ W
- //离散输入点* M- t" Y8 { g: |" E3 o
- #define REG_DISCRETE_START 4001
8 k( \: E) [: T - #define REG_DISCRETE_SIZE 8
2 ~. h3 b8 N2 G! y4 u3 ~* x0 q
: x* _" W( F3 B2 J J& ]3 |+ i- static USHORT usRegDiscreteStart = REG_DISCRETE_START;) x+ s6 M' }: r8 O- @- o v, t; R& T
- static UCHAR ucRegDiscreteBuf[REG_DISCRETE_SIZE/8+(REG_DISCRETE_SIZE%8?1:0)];
; J/ y; e9 [* T# G" ^
3 E4 ]% k( Y& l4 q" \9 q
复制代码
. A) {9 F: p6 l! d主程序就是标准的运行三连+IO读写。; w! X2 \8 U$ a1 n3 Q! F" F7 b
- eStatus = eMBInit( MB_RTU, addr, 0, 9600, MB_PAR_EVEN );
9 T) V+ E2 _" w" ]. s1 @ - * h; `' C+ e8 R2 v- |0 v
- /* Enable the Modbus Protocol Stack. */3 k; ^$ h3 T: v& L6 }2 @
- eStatus = eMBEnable( );
# e; g% d G' B7 Q' \9 D3 H - 1 F2 E+ c8 H9 h" `) m- i) M
- for( ;; )/ a, I0 V9 L- A5 T* L
- {
* p" ?% X1 o: S4 l) K - ( void )eMBPoll( );
3 z" F" k3 U0 E# G2 M$ G5 \+ v) o - usRegInputBuf[0]=Get_Adc_Average(8,10);
0 y$ e. c5 h# V. i2 G - usRegInputBuf[1]=Get_Adc_Average(9,10);
u! \) d1 H4 a+ l: l - 8 B8 L8 @' I4 M" \8 h& r
- ucRegDiscreteBuf[0]=(GPIOB->IDR&0xFFFFFF00)>>8;
1 S; y6 I2 K' ]0 @/ v5 M - GPIOB->ODR=GPIOB->ODR&0xFFFFFF0F;, |. Y8 a% M) B- D) C0 _3 ?
- GPIOB->ODR=GPIOB->ODR|ucRegCoilsBuf[0]<<4;, n9 Q( `. ?0 W) w) v
- }' z. T) {% M$ B! w: X$ G. F
复制代码
7 Z D( ?( m* a& b支持的4种读写function扔在主函数后面就行了。1 b8 Z+ I5 p9 D) K7 ^
- /**5 x" J' \3 F9 F" H" @1 W
- * @brief 输入寄存器处理函数,输入寄存器可读,但不可写。
; u: } d j, J' n6 F* e/ ?* ? - * @param pucRegBuffer 返回数据指针
I3 m* V5 w: b7 B- }& ~ - * usAddress 寄存器起始地址( w6 D M% p$ x6 F8 J
- * usNRegs 寄存器长度6 D/ W& L# ]1 G: O" S/ B
- * @retval eStatus 寄存器状态
# e5 e2 I0 S0 \* Y- T4 Q5 m% \ - */3 C6 W. P% O4 p3 e- R# F; x
- eMBErrorCode: }1 \. W) D7 G; G! o* u
- eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )4 X1 ~) q3 D# u9 l- V1 ^
- {2 N& d/ J) \) ~- h# _& x
- eMBErrorCode eStatus = MB_ENOERR;
$ D$ i" m; o" H% ` - int16_t iRegIndex;
5 b5 z4 u" J0 K' g7 |" b! l" n - : s5 G& Y% ?0 h+ o$ s; n
- //查询是否在寄存器范围内
/ p a) ~9 l6 O H) N& o, w- m - //为了避免警告,修改为有符号整数, z* d. [& J3 y4 H( a! J
- if( ( (int16_t)usAddress >= REG_INPUT_START ) \* V+ a8 k! E% i5 m* s M
- && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )9 i% [7 G4 S* r& z
- {# M( {0 ^( F7 S: v& w3 ^7 [
- //获得操作偏移量,本次操作起始地址-输入寄存器的初始地址8 F7 A( z7 L9 g# X8 b
- iRegIndex = ( int16_t )( usAddress - REG_INPUT_START );
7 ?$ w2 @# N! t" A - //逐个赋值" K. T6 [* @0 o' @7 q3 s- `
- while( usNRegs > 0 )0 b# c2 h2 _5 Z+ O" R: c$ j/ a
- {
, V3 `0 r2 Y( d6 W4 \+ q6 z - //赋值高字节: Q! K8 i* G" U% f
- *pucRegBuffer++ = ( uint8_t )( usRegInputBuf[iRegIndex] >> 8 );
0 X: I2 ?8 N, x6 R - //赋值低字节
M9 i* l; r8 t0 J, @ - *pucRegBuffer++ = ( uint8_t )( usRegInputBuf[iRegIndex] & 0xFF );% k3 V* w/ l" ?' e: P# G
- //偏移量增加
: V. U. p8 O) ~) L4 e - iRegIndex++;
+ V% W1 x, y: D! V" o+ {4 o, A - //被操作寄存器数量递减
. c$ S# Z- g0 E3 h - usNRegs--;0 u. Z. Y/ w! i; g( T' O- M
- }
5 [' f' k3 a3 @# w4 M, a% v. @: u1 Q - }* E% S1 F) P: k I: |$ }. E4 c
- else
* O$ j8 M1 E1 m+ i4 H1 P8 d% | - {
+ h' C$ s& h3 x2 G" F5 ~ - //返回错误状态,无寄存器
& U% w. z0 z2 c1 F* E* c/ w3 j - eStatus = MB_ENOREG;
% W( K( h6 K& R, v& F; x/ ^ - }# B% j9 \/ w4 l& @- n7 X' T' W
- ; }+ U, _" T, X
- return eStatus;. Z: z! J6 k+ k+ Y) W2 z: P
- }9 T& I+ b+ z1 D- d' O4 \+ E
- 8 r+ Z7 O3 F( X& B3 l
- /**0 u- H, [6 v) o/ Y' o( X7 b3 z% E
- * @brief 保持寄存器处理函数,保持寄存器可读,可读可写5 e4 ~1 k0 Z& a! L; Y) S9 |
- * @param pucRegBuffer 读操作时--返回数据指针,写操作时--输入数据指针
# M& X9 `) r& a$ L- A - * usAddress 寄存器起始地址
+ `3 J4 b+ R+ d - * usNRegs 寄存器长度
$ o( z2 j4 A. O: p/ M - * eMode 操作方式,读或者写: g4 D4 W3 A$ J8 Y
- * @retval eStatus 寄存器状态% ~, h6 S0 w. b
- */7 i+ V) E z# S- K& N
- eMBErrorCode$ u( p4 d, n; U
- eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,* \/ |' N- [) H* A6 `2 F
- eMBRegisterMode eMode )
8 Y& i$ C- L( q4 h) B9 p6 q7 A8 O+ S - {
2 Z" I, s/ Y4 o3 U - //错误状态
& C: n; w% j: s$ h l1 e - eMBErrorCode eStatus = MB_ENOERR;
9 E! U; o" S- o) ^ - //偏移量
& P* ^" V! H) G7 ~ - int16_t iRegIndex;+ l1 g, D* }, J3 D3 c* x
- 2 O3 _! u$ f- S& s3 |
- //判断寄存器是不是在范围内& F" k9 b' H! x) N. [# K6 N
- if( ( (int16_t)usAddress >= REG_HOLDING_START ) \ }' U) N8 g/ e
- && ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
0 {' p' g6 E, }1 O7 F% E6 d - {
/ e$ G0 n! U. w& j - //计算偏移量* m% U5 R2 [0 ]8 f
- iRegIndex = ( int16_t )( usAddress - REG_HOLDING_START );1 |- G9 Q; t0 {) i
- : Z1 {6 V, M9 {4 y! P7 s7 y% F
- switch ( eMode )
5 J. N' y% `5 j y& r. z' w - {
% a9 K' N, ]; D/ `$ { - //读处理函数8 g: @) \: _& `# a8 V5 b
- case MB_REG_READ:% w9 N2 X6 |/ _* F1 f$ \+ s) D$ x
- while( usNRegs > 0 )
: q, o7 X+ S9 E, c% l; n; j! k - {6 v% ~3 j6 J+ [0 R0 t
- *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] >> 8 );
. V; o$ N3 E& H! b& m6 K2 x - *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] & 0xFF );
8 O7 y, I. M. {$ |4 P! O' i - iRegIndex++;
' q7 \! G/ e) Z8 E, D - usNRegs--;! u [$ M3 k' U/ w4 u" v- D
- }
- [; K6 x6 J5 C! N7 I - break;
F% j* g' v. h5 d: r0 j! S - 6 ^/ \+ V5 S! \' H7 u4 f) ^5 `
- //写处理函数+ Y1 |6 S, h+ U: f& a5 _. x% n- j0 F
- case MB_REG_WRITE:0 r6 ~- ]6 I5 F5 ^1 j
- while( usNRegs > 0 )" {" }. g* r4 v& o2 Y
- {
5 ?1 g+ K. G4 d - usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;$ {5 s! D5 o" z. k: ]" l
- usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; p+ l! k: X3 Y1 I- ^
- iRegIndex++;
, y4 w3 }# }2 u- n, A3 c! O! L - usNRegs--;
+ r$ F' s5 ?# I G& U4 v - }0 ~& B) m, _1 M7 f7 h5 q$ B. {* f
- break;
/ t i3 D) v5 Q/ b - }" p2 |( Y6 M0 X" \& F+ i. }. @& ]
- }
8 [) S+ M4 x9 G" [8 q - else( Y! I; b- O: @; w" H" S6 L
- {7 w0 T. J/ d9 j/ K S j2 ^9 K# A
- //返回错误状态% J; f8 P+ f" x$ O
- eStatus = MB_ENOREG;, b1 c. h/ _& \7 S+ }$ v+ ]
- }! z; h* v3 }5 N9 i$ v ]
- * T% M0 ]/ ?5 e5 |" W O8 B/ G }4 e
- return eStatus;
. t8 p- N0 Y0 `# ` - }% P% Q3 v8 ?5 U0 V& |% ~% o Z f
) A- F: y( j, O: j! ^! N- & I. K4 X/ i" ]1 ~# y
- ; }' {2 O: F U2 B
+ f* j+ O# C/ P2 f) J8 \- /**
* T6 Q& R3 Q, \: Q - * @brief 线圈寄存器处理函数,线圈寄存器可读,可读可写! h, Q, m- e" P, l
- * @param pucRegBuffer 读操作---返回数据指针,写操作--返回数据指针
: r1 j2 [& U1 g. t - * usAddress 寄存器起始地址& [$ P: @8 U' J" v: d
- * usNRegs 寄存器长度
* G1 U6 I3 i+ J' `& ~; [ - * eMode 操作方式,读或者写$ o' _, N! o6 G
- * @retval eStatus 寄存器状态
- E9 ~4 J6 k) E* [ } - */: s0 |4 v# p7 K& y* @
- eMBErrorCode1 E8 @2 z% t( ]
- eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
3 x; D; K. M7 z5 W - eMBRegisterMode eMode )/ W1 L3 N+ p* g8 i" e
- {
5 M$ d# y1 H7 m% d# \% r - //错误状态4 j4 g2 i, t6 g7 U) l
- eMBErrorCode eStatus = MB_ENOERR;
}3 a8 a! |6 c7 c% ?5 s - //寄存器个数. v* _) p, V: W: m# a4 z6 v$ w6 J8 z
- int16_t iNCoils = ( int16_t )usNCoils;
$ B( x# k5 y" `) f - //寄存器偏移量( Y- l0 T, M5 k6 c3 ^% S# k
- int16_t usBitOffset;0 a: y6 z3 p' f; [, M
% r+ p/ v; N# ]0 ?- //检查寄存器是否在指定范围内
2 F% r R- m) F' z, P6 V - if( ( (int16_t)usAddress >= REG_COILS_START ) &&
9 g Y$ w* L% ^3 U) C - ( usAddress + usNCoils <= REG_COILS_START + REG_COILS_SIZE ) )+ K. T3 \ D3 D. r
- {/ ^0 d# y5 S+ E. S# @+ ^- c
- //计算寄存器偏移量
/ S; } K8 }* @ m. g# j" \ - usBitOffset = ( int16_t )( usAddress - REG_COILS_START );
I" F: i5 U; u - switch ( eMode )
' G' _ c3 \/ \5 p# F8 g5 ]7 z5 t - {! ]* r- G, w# e/ }- r0 ]" k, a4 V
- //读操作 `( Y8 E. `3 G
- case MB_REG_READ:$ G2 @4 f/ Z, J8 m
- while( iNCoils > 0 )
1 w2 C% m J N2 l& b7 M+ q - {* ]9 |+ `# m7 D) p
- *pucRegBuffer++ = xMBUtilGetBits( ucRegCoilsBuf, usBitOffset,
, j+ {0 I1 M1 `! O. }# S, @7 @ - ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ) );
5 d- u/ F2 }8 z8 G" e" `! i; I - iNCoils -= 8;
' ?8 a$ K3 \$ V* T, a - usBitOffset += 8;% K' ^6 ~9 g5 T8 t9 g
- }6 A" m' |8 r5 |0 D8 V& k
- break;! b: V/ S5 M2 ~# X" o5 b* _
- 3 D/ H/ \1 V# m1 ~# t1 B
- //写操作7 K) K+ j: Z" ^: Q
- case MB_REG_WRITE:; s; j" y+ K' Y* ^' l6 a" Y" q
- while( iNCoils > 0 )+ {) `3 ^( ~4 ~# w
- {: Q: D* [6 y, v B& l# e
- xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,9 v$ q& W" C- [/ _+ T5 d
- ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ),
% |: H7 ^4 E$ m3 M% z- c. b1 t - *pucRegBuffer++ );
' P6 p& X6 Y& E% W - iNCoils -= 8;
/ ^/ y! k& c' S% Q, Z W) o - usBitOffset += 8;
3 O% r! a/ V9 r8 s& m( T - }
1 k' |* i0 n8 p$ @5 I - break;
5 e& @. S: \/ u2 p5 ]7 H8 s# M - }
. T/ @" @2 n% r4 Y' w2 {3 G, { - 9 H* q" ]; C; I R4 N5 Q) Z& l
- }3 Q) S5 h6 ~3 _' O4 A; V8 T k
- else& f6 ^' |1 w. ~: L! x9 W& |# h, Y9 K# i
- {
5 b% p- \- g" |( x: |, k4 X* l - eStatus = MB_ENOREG;
+ M b) S. W, h6 L9 m( h - }: W7 T5 k8 p& \+ `! o
- return eStatus;
8 d3 v& I9 y# Y# n9 Q" \: K+ f - }
9 @: J- l, F5 [, s) {* |( X1 _- s
7 f7 L4 s- Q+ f3 u3 t! B
/ c; a. J6 t" g8 r- |9 e1 |% J- , [1 A! G& d6 q
- # ~1 a, f- _/ \! }, P1 d; q
- /**. q% q3 e# c5 @" @
- * @brief 开关输入寄存器处理函数,开关输入寄存器,可读
* E, Q2 D! J3 V* T - * @param pucRegBuffer 读操作---返回数据指针,写操作--返回数据指针: R6 S/ J& W5 R i
- * usAddress 寄存器起始地址& Y( D9 c3 p1 O* h
- * usNRegs 寄存器长度" _, L+ x4 S! ~& E( c% ]4 v6 P2 Z A2 q
- * eMode 操作方式,读或者写( j' B: {- U+ D2 A2 A0 j
- * @retval eStatus 寄存器状态( D; V6 A9 x% t. I, h
- */
8 [# m Y$ n* H! k2 E$ s# o& k# b; L - eMBErrorCode( D" a& e* o8 u* F* D
- eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )6 c" S2 T, ~5 z9 j$ Z5 e
- {* @6 Y* `2 t' t. C
- //错误状态8 `) T2 _4 m+ q7 Q( i
- eMBErrorCode eStatus = MB_ENOERR;
3 C) y1 N, [1 T4 D3 _( { - //操作寄存器个数; K* R7 l5 B( E. d
- int16_t iNDiscrete = ( int16_t )usNDiscrete;
: S, Z- y. J1 S1 Z - //偏移量
$ y# c7 o' p. H - uint16_t usBitOffset;
) O7 F" ~: M o& E - " v5 ] L* `2 B$ d
- //判断寄存器时候再指定范围内( G; h* J! ^5 o6 `4 s4 f
- if( ( (int16_t)usAddress >= REG_DISCRETE_START ) &&
3 r1 i& m- x! I- t - ( usAddress + usNDiscrete <= REG_DISCRETE_START + REG_DISCRETE_SIZE ) )
8 N& y( O0 D' A" [ a - {) Y1 v( ~7 w; ^+ I+ W" o6 R, [
- //获得偏移量( k1 v9 ?1 i+ F* H, C
- usBitOffset = ( uint16_t )( usAddress - REG_DISCRETE_START );
" t$ m2 L4 y9 h' p7 L, ^% y6 U - 5 y/ F$ S) n0 q" U; y
- while( iNDiscrete > 0 ), O" _% G, ^+ {6 [+ l. g/ I) M
- {
+ Z$ W, {- A ] - *pucRegBuffer++ = xMBUtilGetBits( ucRegDiscreteBuf, usBitOffset,9 l! X# R4 E# q5 V+ J
- ( uint8_t)( iNDiscrete > 8 ? 8 : iNDiscrete ) );0 w$ d( L, |* `5 M6 u% W
- iNDiscrete -= 8;+ c7 v% q- F0 M: t8 `
- usBitOffset += 8;! v7 M" Y8 Y; Q; ~8 M
- }
5 C& [6 n( @1 p* b! u+ t - 4 J1 P$ d, c. k) q0 W
- }2 s, }0 K5 ?& P' i1 F8 p. H- ]) x
- else* q2 F v" S4 L8 g$ h9 p Z/ b
- {
% X6 ?& x; P$ F; M - eStatus = MB_ENOREG;
' ^5 W E; G6 P, u - }; N5 I% ~$ d* H0 @8 B+ k+ z" e- [
- return eStatus;/ P8 S( [1 Q- \8 v4 S! t. m6 A; p
- }: [5 }7 S e2 B8 `
4 l. U6 h" i2 z$ q- 8 H- B. M; u" v: X2 |' N9 ?6 y9 f
复制代码
: n0 R, `$ u+ ~& `porttimer.c是和定时器相关的实现接口,计算好预分频与装载值之后,可以直接调用原子例程。$ E1 ~; S" S# S; X: b. p+ K
- /*
/ j! j1 g6 g) H% H( A - * FreeModbus Libary: BARE Port
0 ]* J( ~3 l+ L$ V0 V- @ - * Copyright (C) 2006 Christian Walter <wolti@sil.at>! B. u. ?8 _; W! w
- *
+ f9 E' t W5 |: T, F - * This library is free software; you can redistribute it and/or. D5 Y6 M' [' c
- * modify it under the terms of the GNU Lesser General Public
' m' o% ?! y2 p" f1 U - * License as published by the Free Software Foundation; either
; G: G; b9 |! G - * version 2.1 of the License, or (at your option) any later version.6 J, _- l1 D$ A5 q. p8 |) P
- *
( ^; h) m9 }) j5 S+ c2 k. n - * This library is distributed in the hope that it will be useful,
) i3 R. J6 Y2 B- Y% S - * but WITHOUT ANY WARRANTY; without even the implied warranty of
) `' m: w2 `& N( v; h o - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3 i( z; }: r# {9 O, m- F6 ^ - * Lesser General Public License for more details.8 i0 w4 I, e) q2 ` C B4 h% k
- *. m; p! Z( `8 n6 `* F/ @
- * You should have received a copy of the GNU Lesser General Public( V2 i( u' q) N+ Q; q
- * License along with this library; if not, write to the Free Software
- w0 R8 B9 d# x5 C8 l. f3 ^ - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA: e6 k9 P9 p0 f. K) ^; J0 f
- *5 F8 C- B7 `& z: r" H! _# @
- * File: $Id$
0 Y# ^. y q/ u, q1 z* A - */
/ B* u# L& @- y C - , D, F0 {4 s0 d& A4 X: \7 c
- #include "port.h"
! M+ u5 X) x# O( S, d7 N& k6 A/ L - + N/ R1 G% o! e/ r
- /* ----------------------- Modbus includes ----------------------------------*/
/ u' P- \) b) P) |: ?) \5 ^ - #include "mb.h"
! T8 N: ]4 v6 p- u - #include "mbport.h"
5 k4 ^, G# {" z: e8 u# g# U( Z
+ ~! c$ a" p Q& L# a# v- #include "rs485.h", s* x v, ]1 s
- 0 I+ |, w& c6 K# z& r" |: J
- /* ----------------------- static functions ---------------------------------*/
9 I- m) { x' Q! P9 I - static void prvvUARTTxReadyISR( void );8 j3 e4 } W2 n; x
- static void prvvUARTRxISR( void );; t( e6 l. b; \& F. O( W
- ' [- u; s6 r* c I% ~" Q# Y
- /* ----------------------- Start implementation -----------------------------*/
% y7 U( p/ j- c9 S" A& `+ \( | - void
( @7 C" J: P. G! H M - vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
+ c, W: g i d/ x - {
2 `' g; o# I0 V e6 I7 C6 \ E - /* If xRXEnable enable serial receive interrupts. If xTxENable enable4 i) S0 N& o" I/ y+ y& g
- * transmitter empty interrupts.
5 S8 [% m7 F$ O1 B) _; @6 A - */2 T5 y0 b* U o# O" a% S) X% U- `* ~
- if(xRxEnable)
|4 B9 K3 @. [- F# Q7 f - {
9 C, l1 M- R7 K, N; N3 Q - //使能接收和接收中断$ {% v3 X0 k5 W. S4 n
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
+ h1 Q0 `) E( a+ _2 f/ P. N9 D( m2 U - //MAX485操作 低电平为接收模式
1 m9 U, ]6 V; y9 I5 {+ Z - //GPIO_ResetBits(GPIOD,GPIO_Pin_8);
, d9 V: D' x3 O: r - RS485_TX_EN=0; M& L/ b( K$ r/ R: z, a
- }# @+ u. k/ K2 f6 I
- else' ]) J9 R, z- K" o- x
- {( t- i6 B( [+ S- E5 P# C4 Y
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
4 s3 d& Y; Y& B - //MAX485操作 高电平为发送模式7 j& x2 ^) H# H2 \5 B2 X
- //GPIO_SetBits(GPIOD,GPIO_Pin_8);
S( p( y% N" K* Q2 `4 J' k; o - RS485_TX_EN=1;
/ _3 O6 K1 l2 o) U/ i% W - }
' ^3 F) P& ^6 @0 M }/ P - 1 J/ R, \6 k; B) o, e! I
- if(xTxEnable)- R% s9 L2 W# a" h
- {
6 M0 d* m& L R/ U& T: \3 \8 @ - //使能发送完成中断
8 ~4 }5 @' ]" ?$ u" d - USART_ITConfig(USART2, USART_IT_TC, ENABLE);
5 o; I: k' K0 t. P8 N* l+ z9 Q - }3 N2 M5 [4 U1 o' `4 y3 M
- else
2 q! ~0 N2 l6 s0 t) P3 h4 n) U$ _ - {
' U* i) F& p' Z# ?( R' |( v! _) ` - //禁止发送完成中断
0 C' J# c& v" X6 c; D | - USART_ITConfig(USART2, USART_IT_TC, DISABLE);
, u8 F# i$ B: f: F5 A8 d. ], ]( \! ]$ S - }
: a r( N+ \9 _, {$ z6 c/ D3 e - & f; I# l* O- E- t6 g
* F* H c# q- Y% z: O- }
r; \( O" R' F8 b; @/ ` - 9 U( h/ j/ Q! J& i7 }& y7 i- m
- BOOL/ R& f) v; R+ B4 H( z) I% L' x( Y6 K
- xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )' U$ W3 g9 g% z7 e
- {
0 o" b2 @5 A1 T+ Q" Y5 {: q - RS485_Init(9600); //初始化RS4859 o* m' P8 K5 K5 d$ ]* d: U
- return TRUE;- n. Z: w; _% V6 h. w% k
- //return FALSE;
/ o- n5 Q) q5 {: _; _ - }
" r7 g5 I* d9 W. T6 @, R& N
5 l8 W) @1 V" b: }& q- BOOL+ K x u r* V
- xMBPortSerialPutByte( CHAR ucByte ). r3 p4 J+ e( N& a
- {+ R8 M9 K% H2 G, V6 t7 J4 A ?: B
- /* Put a byte in the UARTs transmit buffer. This function is called
$ s' c5 f6 J% L1 S7 B O0 |0 \ \ - * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been5 L& u) k7 R6 b& L' `' m
- * called. */
* m( H8 D1 J0 Z0 T% t - //发送数据5 M; o7 \2 R4 P: f; ^
- USART_SendData(USART2, ucByte);
1 K7 E9 X- T' Y5 F# O - return TRUE;) _: ^, i8 y$ `; [ L7 @! v9 H3 f
- }' @3 h% F( K5 X k; e+ }
0 P. H2 A0 f8 K) I- + A; b9 Z0 t1 e( Q3 P1 h
- BOOL- I) c4 E+ H4 L( x7 |$ J$ Q
- xMBPortSerialGetByte( CHAR * pucByte )
' f+ |2 {. F7 [* h' Y - {+ M: C! F- z" x, p
- /* Return the byte in the UARTs receive buffer. This function is called
$ J+ L% ]- Y7 Y& v' A - * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
6 Q# g0 o) `4 _ Z - */' k1 j: O9 p1 [
- //接收数据) W$ ?. X, o/ R; M9 l( g# a B
- *pucByte = USART_ReceiveData(USART2);9 J: z5 U+ M+ J7 M J) s( ?% _
- return TRUE;9 f' F5 `' O2 z* J( H
+ m9 s8 b; t+ |4 N. y$ Z- }5 T% P6 J0 W5 V( |, x4 n
- 2 |8 x; s1 A8 m" N. s8 x6 h4 k& V" [
- /* Create an interrupt handler for the transmit buffer empty interrupt- ^# e, S9 B7 M; i9 j" L7 q7 K. w
- * (or an equivalent) for your target processor. This function should then
. n4 D2 f+ K7 C; |& e( C1 G: o - * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
) y6 Z2 u9 M3 U, ^1 C' t- k6 U - * a new character can be sent. The protocol stack will then call1 Q6 m! U" O" s/ K3 u4 W9 G+ e
- * xMBPortSerialPutByte( ) to send the character.% v/ @( p4 P* D
- */
4 R# b* Z. c( Q& m; m' T7 ~ \ - static void prvvUARTTxReadyISR( void )
+ W. {* z. c& i" \' S2 r - {
$ F' P. d' G8 O: v - pxMBFrameCBTransmitterEmpty( );
% _. x) i- {6 Y, ~% m - }7 l4 P' Z* S8 W& Y6 q
- 2 G9 U4 ?; i5 S" X5 g
- /* Create an interrupt handler for the receive interrupt for your target: U; V- L. \0 v$ L2 w, Q; k
- * processor. This function should then call pxMBFrameCBByteReceived( ). The! r! {5 F/ T6 q
- * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the* O' t3 v3 r$ \5 |3 n, x
- * character.
! J9 ?, y0 Q7 [' V4 m% H1 _/ i" _ - */
! ?! n9 t% u) G' t: ? - static void prvvUARTRxISR( void )0 a* F. N$ i5 ~. c) P' ]: A2 ]# @
- {
2 h8 j- a& ^1 F- S: M, M; W5 `$ W) m - pxMBFrameCBByteReceived( );
& Z6 g1 B% D1 f# T$ F4 Y - }
' C4 M5 {/ Y0 R% c; u& c D
; i& L6 g6 x: I6 A9 S" N; A- void USART2_IRQHandler(void); w4 i% i0 Q$ D
- {
$ D+ ]: l/ U T: E9 ?2 K - if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)# R/ `! l, l6 ?/ U1 W7 O$ d
- {4 U p" \3 w6 j
- prvvUARTRxISR();
( t. B/ g( t/ O! }! U! g( A - //清除中断标志位
3 [$ Y, `+ m3 o/ Z( o9 L; [" y - USART_ClearITPendingBit(USART2, USART_IT_RXNE);$ j' K' i; T6 {3 y
- }
4 [ ^2 K0 a1 {: s% O# H9 D. r" F - ! J( [" s* w6 D
- //发生完成中断& o! v7 b7 G1 y0 H$ n
- if(USART_GetITStatus(USART2, USART_IT_TC) == SET)8 I0 C9 ?" e8 e* N4 ]
- {
$ ^: J/ s3 Q' t) p - prvvUARTTxReadyISR();/ ^8 z- X& U j/ j. s/ }
- //清除中断标志
" a2 x6 B6 U& N) F - USART_ClearITPendingBit(USART2, USART_IT_TC);" |) v5 Z' @! }( R
- }
5 }, b- _" Z! p
5 U) X& {" Z( l% [0 J i* t- }
0 @& D4 }) D2 l) p! z: l4 @
- @0 v7 @5 G) ?! S9 e
复制代码
4 B: J9 g+ R) k4 ]! lmodbus移植过程基本就完成了。
" T3 B5 R1 \5 ]9 P: K3 E4 l7 B————————————————( \. c( f" c1 h: S
版权声明:小盼你最萌哒
. d2 g! i2 y0 i: \- j如有侵权请联系删除 B' ]( q2 w9 o( n, w
; |. X* z' a; ?8 v+ k) t" S1 Z
4 v' ^ ]( \( }7 d8 H0 Z' N6 j' X |