기본 소스를 사용해보면. 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 |