기본 소스를 사용해보면. modbus_receive() 에서 블록킹 된 상태라서 다른걸 할 수가 없다.

 

검색을 해보니 libmodbus issue 쪽에서 발견한 내용으로

poll 에서 확인이 되면 소켓을 modbus_set_socket() 함수를 이용하여 context에 연결하고 receive 하도록 구성되어 있다.

    modbus_t *ctx = modbus_new_tcp("0.0.0.0", port_);
    int server_socket = modbus_tcp_listen(ctx, 2);
    if (server_socket < 0) {
      // error handling
      modbus_free(ctx);
      return;
    }

          if (p->revents & POLLIN) {
            modbus_set_socket(ctx, p->fd); // set the socket to libmodbus answers to the right client

            uint8_t query[MODBUS_RTU_MAX_ADU_LENGTH];
            int rc = modbus_receive(ctx, query);
            if (rc <= 0) { // connection has been closed actually by the client
              ::close(p->fd);
              p = sockets.erase(p); // remove it from the poll-array
              continue;
            }

            /* rc is the query size */
            rc = modbus_reply_callback(ctx, query, rc); // handle the reply (via the callbacks)
            if (rc < 0) {
              // error handling - invalid request
              ::close(p->fd); // close client
              p = sockets.erase(p);
              continue;
            }
          }

[링크 : https://github.com/stephane/libmodbus/issues/173]

 

[링크 : https://libmodbus.org/docs/v3.0.8/modbus_set_socket.html]

'프로그램 사용 > libmodbus' 카테고리의 다른 글

libmodbus pi 함수들  (0) 2022.05.10
libmodbus modbus_mapping_new()  (0) 2022.05.10
modbus tcp  (0) 2022.05.04
libmodbus 예제 프로그램  (0) 2022.05.04
libmodbus tcp 예제  (0) 2022.05.04
Posted by 구차니