728x90
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/uart.h"
#include "driverlib/ethernet.h"
#include "utils/uartstdio.h"
#include "utils/lwiplib.h"
#include "lwip/sockets.h"
#include "lwip/inet.h"
// 네트워크 설정
#define LOCAL_IP_ADDR 0xC0A80001 // 192.168.0.1
#define NET_MASK 0xFFFFFF00 // 서브넷 마스크 255.255.255.0
#define GATEWAY_ADDR 0xC0A80001 // 게이트웨이 192.168.0.1
#define PORT 5000 // 송수신할 포트 번호
#define SERVER_IP_ADDR 0xC0A80002 // 192.168.0.2 (UDP 서버 IP)
void InitConsole(void) {
// UART 초기화
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, SysCtlClockGet());
}
void EthernetInit(void) {
// 이더넷 초기화 및 고정 IP 설정
lwIPInit(SysCtlClockGet(), LOCAL_IP_ADDR, NET_MASK, GATEWAY_ADDR, IPADDR_USE_STATIC);
}
void UDPClientTask(void) {
int sock;
struct sockaddr_in server_addr;
// 소켓 생성
sock = lwip_socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
UARTprintf("Socket creation failed\n");
return;
}
// 서버 주소 설정
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = htonl(SERVER_IP_ADDR);
// 데이터 송신 루프
while (1) {
char message[] = "Hello from TivaC!";
// 데이터 전송
int result = lwip_sendto(sock, message, sizeof(message), 0,
(struct sockaddr *)&server_addr, sizeof(server_addr));
if (result < 0) {
UARTprintf("Failed to send data\n");
} else {
UARTprintf("Sent: %s\n", message);
}
SysCtlDelay(SysCtlClockGet() / 3); // 약 1초 대기
}
lwip_close(sock);
}
void UDPServerTask(void) {
int sock;
struct sockaddr_in addr;
int addr_len = sizeof(addr);
// 소켓 생성
sock = lwip_socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
UARTprintf("Socket creation failed\n");
return;
}
// 로컬 주소 설정 및 바인딩
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
if (lwip_bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
UARTprintf("Socket bind failed\n");
lwip_close(sock);
return;
}
UARTprintf("UDP Server started at port %d\n", PORT);
// 데이터 수신 루프
while (1) {
char buffer[1024];
int len = lwip_recvfrom(sock, buffer, sizeof(buffer), 0,
(struct sockaddr *)&addr, (socklen_t *)&addr_len);
if (len > 0) {
buffer[len] = '\0'; // 문자열 종료
UARTprintf("Received: %s\n", buffer);
// 여기에 수신 데이터 처리 로직을 추가할 수 있음
}
}
lwip_close(sock);
}
int main(void) {
// 시스템 클럭 설정
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
InitConsole();
UARTprintf("System Initialized\n");
// 이더넷 초기화
EthernetInit();
UARTprintf("Ethernet Initialized\n");
// UDP 송신 및 수신 태스크 시작
UDPClientTask();
UDPServerTask();
while (1) {
// 메인 루프
}
}
728x90
'개발자 모드 > C언어' 카테고리의 다른 글
C언어 포인터 SWAP함수 응용 (0) | 2021.09.18 |
---|---|
C언어 배열과 포인터의 관계 2 (0) | 2021.09.18 |
C언어 다차원 배열 기본 개념 #2 (0) | 2021.09.18 |
C언어 배열과 포인터의 관계 (0) | 2021.09.18 |
C언어 배열과 포인터의 관계 (0) | 2021.09.17 |