C221-S3C6410 보드에 있는 RS232로 들어오는 데이터를 UDP로보내는 프로그램은 다음과 같습니다.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/poll.h>

#include <termios.h>                   // B115200, CS8 등 상수 정의

#include <fcntl.h>                     // O_RDWR , O_NOCTTY 등의 상수 정의

#include <sys/socket.h>

#include <arpa/inet.h>



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

{

int    fd;

int    ndx;

int    cnt;

char   buf[1024];

struct termios    newtio;

struct pollfd     poll_events;      // 체크할 event 정보를 갖는 struct

int    poll_state;


int udp_client_socket;

int server_addr_size;


struct sockaddr_in   udp_server_addr;



if ( 2 > argc ) {

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

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

exit( 0);

}


   // 시리얼 포트를 open


fd = open( argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK );        // 디바이스를 open 한다.

if ( 0 > fd ) {

printf("open error\n");

return -1;

}


   // 시리얼 포트 통신 환경 설정


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

newtio.c_cflag       = B115200 | CS8 | CLOCAL | CREAD;

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 );

fcntl(fd, F_SETFL, FNDELAY);



// poll 사용을 위한 준비

poll_events.fd        = fd;

poll_events.events    = POLLIN | POLLERR;          // 수신된 자료가 있는지, 에러가 있는지

poll_events.revents   = 0;


// udp 소켓 연결

udp_client_socket  = socket( PF_INET, SOCK_DGRAM, 0);


if( -1 == udp_client_socket ) {

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= inet_addr( argv[1]);



// 자료 송수신


while ( 1 ) {

poll_state = poll(                               // poll()을 호출하여 event 발생 여부 확인

(struct pollfd*)&poll_events, // event 등록 변수

1,  // 체크할 pollfd 개수

1000   // time out 시간

);


if ( 0 < poll_state ) {                             // 발생한 event 가 있음

if ( poll_events.revents & POLLIN ) {            // event 가 자료 수신?

cnt = read( fd, buf, 1024);

buf[cnt] = '\0';

printf( "data received - %d %s\n", cnt, buf);


sendto( udp_client_socket, buf, strlen( buf)+1, 0,    // +1: NULL까지 포함해서 전송

( struct sockaddr*)&udp_server_addr, sizeof( udp_server_addr) );


close( udp_client_socket);

}

if ( poll_events.revents & POLLERR ) {      // event 가 에러?

printf( "통신 라인에 에러가 발생, 프로그램 종료");

break;

}

}

   }

   close( fd );

   return 0;



sendto( udp_client_socket, buf, strlen( buf)+1, 0,  ( struct sockaddr*)&udp_server_addr, sizeof( udp_server_addr) ); 함수는 

UDP/IP 통신에서 소켓으로 데이터를 전송합니다.


udp_client_socket

          소켓 지정자입니니다.


buf

          전송할 데이터


strlen( buf)+1

          전송할 데이터의 바이트 단위 길이  ( +1 은 NULL까지 포함해서 전송 )

  

0

          전송을 위한 옵션


( struct sockaddr*)&udp_server_addr

           목적지 주소 정보


sizeof( udp_server_addr)

           목적지 주소 정보의 크기



===========

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