2024.1.26
Ethernet MAC Address에서 앞에 세 개는 Make ID, 뒤에 세 개는 시리얼 넘버(S/N)이다
STM의 IP주소와, subnet mask, gateway address를 설정해준다.
LAN8742로 등록되어 있으므로 IPs or Components와 Found Solutions를 LAN8742로 바꿔준다
/* USER CODE BEGIN 0 */
extern struct netif gnetif; // ADD_JM
/* USER CODE END 0 */
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lwip/udp.h" // ADD_JM
#include "udp_echoserver.h" // ADD_JM
/* USER CODE END Includes */
void StartDefaultTask(void *argument)
{
/* init code for LWIP */
MX_LWIP_Init();
/* USER CODE BEGIN 5 */
udp_echoserver_init(); // ADD_JM
/* Infinite loop */
for(;;)
{
ethernetif_input(&gnetif); // ADD_JM
sys_check_timeout(); // ADD_JM
osDelay(1);
}
/* USER CODE END 5 */
}
udp_echoserver_init() 메서드는 udp_echoserver.c 파일에 있음
window + r키를 누르고 ping (ip주소) -t 하면 위와 같이 실행된다
/* USER CODE BEGIN 4 */
ip_addr_t addr1; // ADD_JM
struct pbuf *p1; // ADD send buffer
char temp_str[40]; // ADD temp buffer
extern struct udp_pcb *upcb1; // ADD udp control block
extern uint8_t udp_data[100]; // ADD udp data
/* USER CODE END 4 */
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* init code for LWIP */
MX_LWIP_Init();
/* USER CODE BEGIN 5 */
// --------------- TCP/IP start -------------------
udp_echoserver_init(); // ADD_JM
upcb1 = udp_new(); // ADD_JM
IP4_ADDR(&addr1, 10, 10, 15, 59); // ADD client PC IP address
udp_bind(upcb1, IP_ADDR_ANY, 9999); // ADD
// ---------------- TCP/IP end --------------------
/* Infinite loop */
for(;;)
{
ethernetif_input(&gnetif); // ADD_JM
sys_check_timeouts(); // ADD_JM
udp_connect(upcb1, &addr1, 9999);
sprintf(temp_str, "Hello jimeaning!\n");
p1 = pbuf_alloc(PBUF_TRANSPORT, strlen((char*)temp_str), PBUF_POOL);
if (p1 != NULL) // OK alloc
{
// 1. copy data to pbuf
pbuf_take(p1, (char *)temp_str, strlen((char *)temp_str));
// 2. send udp data
udp_send(upcb1, p1);
// 3. free the UDP connection
udp_disconnect(upcb1);
// 4. free pbuf (memory)
pbuf_free(p1);
}
else
{
HAL_UART_Transmit(&huart3, "pbuf not alloc!!\n", strlen("pbuf not alloc!!\n"), 10);
}
osDelay(100);
}
/* USER CODE END 5 */
}
pbuf *p1은 send buffer로 동적 메모리를 할당하는 변수이다.
9999 포트를 쓰는 이유는 이미 사용하던 포트와 겹치지 않게 하기 위함이다.
UDP에서 Module IP에 STM32 IP로 설정해주고, 포트와 로컬 포트를 9999로 설정한 후 Listen 버튼을 클릭한다.
리눅스에서 QT를 다운받아준다
버전: 5.12.4
다운로드 링크