WIZnet Developer Forum

[WIZ750SR-RS232] WIZnet S2E CONFIG Tool 연결문제

안녕하세요!
WIZ750SR-RS232
문의사항입니다.

UDP 1:N 으로 2개의 서버와 통신합니다.
최초 서버의 MAC 을 모를때는 ARP를 진행하고
서버의 MAC이 저장되면 그때부턴 SEND_MAC을 하는데요

해당서버 PC 로 WIZnet S2E Configuration Tool 을 열어서
Device Search 하면 모듈이 나타나지 않고,
Module을 Reset하면 모듈이 나타납니다.

SEND_MAC 때문인 것 같은데 해결할 방법이 있을까요?

config 툴 자체는 브로드캐스트 패킷이든 유니캐스트 패킷이든 다 받아들이게 되어 있습니다.
MAC를 잘못 입력해서 보내명 아예 패킷이 툴이 동작하는 서버로 들어오지 않으므로 당연히 보여지지 않습니다.
따라서, 먼저 send_mac를 수행하고 그 패킷이 정상적으로 나가는지 패킷캡쳐등을 통해 보고 툴이 동작하고 있는 서버의 mac 이 맞는지도 한 번 더 확인 하고 다 정상이면 코드를 추가로 디버깅해야 할 것 같습니다.
위 사항을 재차 확인해도 다 조건이 맞다고 판단되시면, 코드를 공유해서 코드레벨로 확인을 좀 해봐야 겠습니다.

개인사정으로 답변이 늦었습니다.!
도움감사드립니다.
수정된 부분 코드 첨부드립니다.

1. void uart_to_ether(uint8_t sock)  수정 된 부분
				if((netinfo->remote_ip[0] == 0x00) && (netinfo->remote_ip[1] == 0x00) && (netinfo->remote_ip[2] == 0x00) && (netinfo->remote_ip[3] == 0x00))
				{
					if((peerip[0] == 0x00) && (peerip[1] == 0x00) && (peerip[2] == 0x00) && (peerip[3] == 0x00))
					{
						if(serial->serial_debug_en) printf(" > SEG:UDP_MODE:DATA SEND FAILED - UDP Peer IP/Port required (0.0.0.0)\r\n");
					}
					else
					{
						// UDP 1:N mode
					/**
					  ******************************************************************************
					  * @author  yhlee
					  * @date	 Jan-2020
					  * @description : each server1 & server2 send the data include their last of
					                   ip address to MCU thoruogh wiz750sr
					                   g_send_buf[05] contained peerip[3]
					                   ex> server1 ip : 192.168.1.81 
					                       server1 send packet 59 59 00 08 00 51 xx xx xx ..
                                           (51 means hex 0x51 so it's 81)
					                   and then MCU send ack packet 59 59 00 08 00 51 xx xx xx ..
					                   wiz750sr get these packet to g_send_buf[]
					                   g_send_buf[05] could decied whether module send the data to
					                   server1 or server2
					  ******************************************************************************
					**/ 				

						if(g_send_buf[05] == peerip_1[3]){
							setSn_DHAR(sock, mac_1);
							memcpy(peerip, peerip_1, 4);
							peer1_seqence_flag = 1;
							peer2_seqence_flag = 0;
						}
						else if(g_send_buf[05] == peerip_2[3]){
							setSn_DHAR(sock, mac_2);
							memcpy(peerip, peerip_2, 4);
							peer1_seqence_flag = 0;
							peer2_seqence_flag = 1;							
						}
						sent_len = (int16_t)sendto(sock, g_send_buf, len, peerip, peerport);

						if(g_send_buf[05] == peerip_1[3]){
							getSn_DHAR(sock, mac_1);
							if((mac_1[0] == 0x00) && (mac_1[1] == 0x00) && (mac_1[2] == 0x00) && (mac_1[3] == 0x00) && (mac_1[4] == 0x00) && (mac_1[5] == 0x00))
							{
								if(serial->serial_debug_en) printf("ARP1 Inspction Error %2x:%2x:%2x:%2x:%2x:%2x\r\n",mac_1[0],mac_1[1],mac_1[2],mac_1[3],mac_1[4],mac_1[5]);
							}
							else mac_flag1 = 1;
						}
						else if(g_send_buf[05] == peerip_2[3]) {
							getSn_DHAR(sock, mac_2);
							if((mac_2[0] == 0x00) && (mac_2[1] == 0x00) && (mac_2[2] == 0x00) && (mac_2[3] == 0x00) && (mac_2[4] == 0x00) && (mac_2[5] == 0x00))
							{
								if(serial->serial_debug_en) printf("ARP2 Inspction Error %2x:%2x:%2x:%2x:%2x:%2x\r\n",mac_2[0],mac_2[1],mac_2[2],mac_2[3],mac_2[4],mac_2[5]);
							}
							else mac_flag2 = 1;

						}
						if(serial->serial_debug_en) {
							if(peer1_seqence_flag)
							{
								printf(" > UDP Peer IP/Port1: %d.%d.%d.%d : %d\r\n", peerip_1[0], peerip_1[1], peerip_1[2], peerip_1[3], peerport);
								printf("RECV ARP packet1 from %2x:%2x:%2x:%2x:%2x:%2x\r\n",mac_1[0],mac_1[1],mac_1[2],mac_1[3],mac_1[4],mac_1[5]);
							}
							else if(peer2_seqence_flag)
							{
								printf(" > UDP Peer IP/Port2: %d.%d.%d.%d : %d\r\n", peerip_2[0], peerip_2[1], peerip_2[2], peerip_2[3], peerport);							
								printf("RECV ARP packet2 from %2x:%2x:%2x:%2x:%2x:%2x\r\n",mac_2[0],mac_2[1],mac_2[2],mac_2[3],mac_2[4],mac_2[5]);
							}
						}
						/*********************************************************************************/						
					}
				}

<void ether_to_uart(uint8_t sock)> 에서 수정된 부분

			case SOCK_UDP: // UDP_MODE
				e2u_size = recvfrom(sock, g_recv_buf, len, peerip, &peerport);

				if((memcmp(peerip_1, peerip, 4) !=  0) && (!peerip_flag1))// yhlee
				{
					memcpy(peerip_1, peerip, 4);
					peerip_flag1 = 1;
 					if(serial->serial_debug_en) {
						//printf(" > UDP Peer IP/Port1: %d.%d.%d.%d : %d\r\n", peerip_1[0], peerip_1[1], peerip_1[2], peerip_1[3], peerport);
					}
				}
				
				else if((memcmp(peerip_1, peerip, 4) ==	0) && (peerip_flag1))// yhlee
				{
					memcpy(peerip_1, peerip, 4);
					peerip_flag1 = 1;					
					if(serial->serial_debug_en) {
						//printf(" > UDP Peer IP/Port1: %d.%d.%d.%d : %d\r\n", peerip_1[0], peerip_1[1], peerip_1[2], peerip_1[3], peerport);
					}
				}

				else if((memcmp(peerip_2, peerip, 4) !=  0) && (!peerip_flag2))
				{
					memcpy(peerip_2, peerip, 4);
					peerip_flag2 = 1;					
 					if(serial->serial_debug_en) {
						//printf(" > UDP Peer IP/Port2: %d.%d.%d.%d : %d\r\n", peerip_2[0], peerip_2[1], peerip_2[2], peerip_2[3], peerport);
					}
				}	
				else if((memcmp(peerip_1, peerip, 4) !=  0) && (memcmp(peerip_2, peerip, 4) !=  0) && (peerip_flag1) && (peerip_flag2))
				{
					memcpy(peerip_1, peerip, 4);
					peerip_flag1 = 1;					
 					if(serial->serial_debug_en) {
						//printf(" > UDP Peer IP/Port1: %d.%d.%d.%d : %d\r\n", peerip_1[0], peerip_1[1], peerip_1[2], peerip_1[3], peerport);
					}
				}					
				/*if(memcmp(peerip_tmp, peerip, 4) !=  0)
				{
					memcpy(peerip_tmp, peerip, 4);
					if(serial->serial_debug_en) printf(" > UDP Peer IP/Port: %d.%d.%d.%d : %d\r\n", peerip[0], peerip[1], peerip[2], peerip[3], peerport);
				}*/
				break;

<int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)> 에서 수정된 부분

#if _WIZCHIP_ == 5200   // for W5200 ARP errata 
    setSUBR(0);
#endif

	
	if(peer1_seqence_flag && mac_flag1) setSn_CR(sn,Sn_CR_SEND_MAC); // yhlee
	else if(peer2_seqence_flag && mac_flag2) setSn_CR(sn,Sn_CR_SEND_MAC); // yhlee
    else setSn_CR(sn,Sn_CR_SEND); // yhlee
	//setSn_CR(sn,Sn_CR_SEND);    
    /* wait to process the command... */
    while(getSn_CR(sn));
		
#if _WIZCHIP_ == 5200   // for W5200 ARP errata 
    setSUBR((uint8_t*)"\x00\x00\x00\x00");
#endif

이상 입니다. 검토 부탁드립니다.

안녕하세요

Configtool에서 Device search는 기본 동작으로 UDP 통신을 이용합니다.
이때 WIZ750SR은 Configtool의 Device search에 대한 UDP 응답 패킷도 sendto를 통해 전송합니다.
따라서 sendto 코드를 수정할 경우 정상동작하지 않을 수 있습니다.
응용코드는 sendto를 수정하지 마시고 별도로 함수를 만드셔서 사용하시는 것을 추천드립니다.

네 별도의 응용코드를 만들어 써야겠네요~! 도움감사드립니다.

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