WIZnet Developer Forum

[WIZ750SR-RS232] 사용중 IP 관련 문의사항

안녕하세요!!
[WIZ750SR-RS232] Module을
1:N UDP 방식으로 사용중입니다.
Module 1개에 Server 2개 를 사용합니다.
Module의 IP는 192.168.1.101
Server_1의 IP는 192.168.1.81
Server_2의 IP는 192.168.1.82 입니다

Server 1,2 가 데이터를 보내면 Module을 통해 시리얼데이터가 RX되고
Main MCU가 시리얼데이터를 TX 하는 Flow로 동작됩니다.

문제는 Server 1,2 가 연속으로 데이터를 Module로 송신할 경우,
Main MCU 쪽에서 데이터버퍼에 쌓아 순서대로 전송하는데,
시리얼속도가 이더넷속도보다 느리다보니,
Server 1에서 받은 데이터를 Ack 하기도 전에 Server 2의 데이터를 받아버려서
MCU가 송신시 두개의 버퍼를 Server 2에만 보내는 문제가 있습니다.
※ 참고로 Server 에서는 보내는 타이밍을 제어 할 수 없는상황입니다.

간략히 표로 전송상황을 설명하면

Server 1 -> Module -> MCU 수신
MCU -> Module -> Server 1 송신 정상

Server 2 -> Module -> MCU 수신
MCU -> Module -> Server 2 송신 정상

Server 1,2 -> Module -> MCU 수신
MCU -> Module -> Server 2 송신 에러

그래서 아래와 같이 패킷에 구분을 해봤는데요.
시리얼로 변환되는 패킷에 보내는 IP의 마지막 주소를 넣었습니다.
※ uart_to_ether() Function 부분 입니다.

					// UDP 1:N mode
					**peerip[3] = g_send_buf[05]; // 추가한 부분**
					sent_len = (int16_t)sendto(sock, g_send_buf, len, peerip, peerport);

위와 같이 시리얼패킷에 송신할 IP 마지막주소를 추가하여 peerip[3] 에 추가했더니
잘 동작되지만,
실제로 보낸 IP(192.168.1.81) 0x51와 패킷에 추가된 주소,g_send_buf[05]=0x52가 다를 경우, 전송이되지 않고
이후에도 모듈이 먹통이 되는 문제가 있습니다.
어떻게 해결 할 수 있을지 도움부탁드립니다
감사합니다.

전송시에 데이터 값을 이용하여 IP 주소에 mapping 해서 쓰는 방법은 말씀하신대로 솔루션으로 부적합한 것 같습니다.
대신에, 수신시에 recvfrom 수신함수에 보면 데이터를 보낸 서버의 IP가 같이 전달받을 수 있습니다.
이 정보를 활용하면 서버 별로 수신된 데이터를 각각 다른 응용 버퍼에 넣어둘 수 있고, 해당 버퍼별로 각각 맞는 해당 IP로 전송하는 형태로 해야 할 것 같습니다.

1 Like

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.