TCP modbus server 接收多个客户端数据

2019-10-11 16:20 [复制链接] 0 462

TCP modbus server
( j+ E; `1 Z9 {& `( \& t) q! r* G7 R5 ?5 {8 f1 C6 [: M
下面程序 只能接收一个客户端数据,同时有几个客户端要怎么处理呢?
1 j. R6 u. b9 b* M* C8 e  q, c8 k# a- Z% h" Z( a( V* J
static void test_thread(void *param)  y" a6 T- P, S
{
6 ~5 X% d! i6 X$ b- r        while(1){9 w, c6 e, [& s+ p+ B) t- c. Z% d
    rt_thread_mdelay(5000);
% m8 h( U# T2 s1 L    int s = -1;
% d2 N2 a0 ?3 e0 s    modbus_t *ctx = NULL;7 Q, C9 e5 l" g  D5 ^% L% |4 s6 b
    modbus_mapping_t *mb_mapping = NULL;4 o1 N1 ~+ @9 Q5 |3 i
    int rc;  |" q8 q. I, r, e2 m8 B

6 Z! l" I: R1 Y% P5 s6 v5 b    ctx = modbus_new_tcp(RT_NULL, 1502);/ f7 i1 ^% u: `! m
    s = modbus_tcp_listen(ctx, 10);5 {5 _/ R9 V  l& g
    modbus_tcp_accept(ctx, &s);
+ X+ Z% L1 d. k1 ^( u" o9 J; \    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,; F2 w# Q6 d( U8 K# m
                                    MODBUS_MAX_READ_REGISTERS, 0);
" ~! `& W: R' ^. @% g    while(1)
" V0 C' c/ p7 A6 T) K- z+ ?    {
4 H% I; l6 P5 |        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];" o5 c8 D/ p- Y7 u
                         uint16_t data[]={1,2,3,4,5,6,7,8};+ f$ G% o9 `3 w4 W
                        3 R: N4 n: }0 L: P9 _
                          w- o. H4 e8 ]  R" j
//       modbus_write_registers(ctx,0x12,4,data);
3 _, P" p- `. F0 [) E9 O        rc = modbus_receive(ctx, query);* n+ y, f' G8 D; h, f
        if (rc > 0) {% a# @% ^% B; ~: |
            modbus_reply(ctx, query, rc, mb_mapping);
; X; f4 m- I- v3 Q5 Q! E$ A                                         for(int i=0;i<20;i++)                                          
; I/ ?# v! E) }6 {                                        printf("%2x ",query[i]);" D$ W. m, O! E- R/ Y6 X
        } else if (rc  == -1) {7 p8 L) L$ A: w+ y# v( t! C; M2 T
                                        5 g0 @* K" D, o
            /* Connection closed by the client or error */7 ~! M5 N( X+ u* Y
            break;
, H( V7 j, s: d( O        }/ ]# K: P. s7 i% k* F: V+ ~8 Y
                                rt_thread_mdelay(50);
2 w/ p- V# _% y8 c% p# d    }
$ z) s8 r: ]; S9 I) v    modbus_mapping_free(mb_mapping);+ b6 b4 {" b  k* F
    if (s != -1) {
2 I) X) o: _8 D1 |        close(s);
0 E0 |" ]- \+ S0 k3 `    }# G* L: W0 U. F' q$ C
    /* For RTU, skipped by TCP (no TCP connect) */
: c, ^  n7 l: \  f: c# u- n    modbus_close(ctx);
! s# o+ e) ?/ t2 b$ y1 C) a# ~/ y    modbus_free(ctx);4 P, ]1 l5 s1 @9 N' g7 R
        }1 r" e$ |6 G; {' N, }, k
}$ o, U9 m3 O. Q

, L  j* S) Z+ s4 m( M
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 7 主题
  2. 59 帖子
  3. 59 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表