하드웨어
#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 프로그램을 설명하도록 하겠습니다.