C221-S3C6410 보드에 있는 Ehternet을 통하여 UDP로 들어온 데이타를 RS232로 보내는 프로그램은 다음과 같습니다.


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <termios.h>

#include <fcntl.h>

#include <arpa/inet.h>

#include <sys/socket.h>


#define  BUFF_SIZE   1024


int main(int argc, char *argv[]) {


int udp_server_sock;

int client_addr_size;


struct sockaddr_in udp_server_addr;

struct sockaddr_in client_addr;


char buff_rcv[BUFF_SIZE + 1];


int fd;

struct termios newtio;


if (2 > argc) {

printf("인수가 모자릅니다. 시리얼 포트를 입력하여 주시오\n");

printf("실행방법: ]$ ./app_udp_to_rs232 /dev/ttyS3\n");

exit(0);

}


fd = open(argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK);

memset(&newtio, 0, sizeof(newtio));

newtio.c_cflag = B115200; // 통신 속도 115200

newtio.c_cflag |= CS8; // 데이터 비트가 8bit

newtio.c_cflag |= CLOCAL; // 외부 모뎀을 사용하지 않고 내부 통신 포트 사용

newtio.c_cflag |= CREAD; // 쓰기는 기본, 읽기도 가능하게

newtio.c_iflag = 0; // parity 비트는 없음

newtio.c_oflag = 0;

newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 0;

newtio.c_cc[VMIN] = 1;


tcflush(fd, TCIFLUSH);

tcsetattr(fd, TCSANOW, &newtio); // 포트에 대한 통신 환경을 설정합니다.


udp_server_sock = socket(PF_INET, SOCK_DGRAM, 0);


if (-1 == udp_server_sock) {

printf("socket 생성 실패\n");

exit(1);

}


memset(&udp_server_addr, 0, sizeof(udp_server_addr));

udp_server_addr.sin_family = AF_INET;

udp_server_addr.sin_port = htons(4000);

udp_server_addr.sin_addr.s_addr = htonl(INADDR_ANY);


if (-1 == bind(udp_server_sock, (struct sockaddr*) &udp_server_addr,

sizeof(udp_server_addr))) {

printf("bind() 실행 에러\n");

exit(1);

}


while (1) {

client_addr_size = sizeof(client_addr);

recvfrom(udp_server_sock, buff_rcv, BUFF_SIZE, 0,

(struct sockaddr*) &client_addr, &client_addr_size);

printf("receive: %s\n", buff_rcv);


write(fd, buff_rcv, strlen(buff_rcv)); // udp 포트로 들어온 데이터를 전송 합니다.

sleep(1); // receiver가 자료를 수신할 수 있도록 대기

}

close(fd); // 통신 포트를 닫아 사용을 중지합니다.


return 0;

}

 




recvfrom(udp_server_sock, buff_rcv, BUFF_SIZE, 0, (struct sockaddr*) &client_addr, &client_addr_size);  함수는 소켓으로 부터 데이타를 읽어들이기 위해서 사용됩니다.

udp_server_sock 
    소켓 지정자입니니다.

buff_rcv
     데이타를 읽어들입니다.

BUFF_SIZE 
     읽어들일 데이터의 최대 크기를 지정합니다. 

     flag 를 설정하는 부분입니다.
     사용안할 경우에는 0을 넣으면 됩니다. 

(struct sockaddr*) &client_addr
     메시지의 원주소를 나타냅니다.  연결지향소켓이 아닌경우에만 채워집니다.

&client_addr_size
     주소구조체의 크기입니다.
        

===========

다음 강좌에서는 RS232 to UDP 프로그램을 설명하도록 하겠습니다.