본문 바로가기

개발자 모드/C언어

ChatGPT로 개발하기 CodeComposerStudio 개발하기

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