하드웨어
C221-S3C6410 보드에 있는 TCP로 들어오는 데이터를 CAN 통신으로 보내는 프로그램은 다음과 같습니다.
#include <stdio.h> #include <arpa/inet.h> #include <linux/can.h> #define BUFF_SIZE 1024 int fd_can; // can 통신을 위한 파일 디스크립터 void on_data( )
rd_cnt = read ( fd_client, buff_rcv, BUFF_SIZE); // 클라이언트로부터 전송된 메시지 수령 if ( 8 < rd_cnt) // CAN 통신에서는 최고 8 바이트 전송 printf( "receive:"); // 수령 메시지 화면 출력 sendto( fd_can, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr_can, sizeof(addr_can));
void on_accept( )
// 여기까지 실행되었다면 클라이언트로부터 접속 요청이 있었음 if ( -1 == fd_client)
int main( int argc, char *argv[])
if ( 2 > argc) { sprintf( can_port, "%s", argv[1]);
// can 포트 open //////////////////////////////////////////////////////////// struct ifreq ifr;
if ( 0 > ( fd_can = socket(PF_CAN, SOCK_RAW, CAN_RAW)) ) {
strcpy(ifr.ifr_name, can_port); addr_can.can_family = AF_CAN; if ( 0 > bind( fd_can, (struct sockaddr *)&addr_can, sizeof(addr_can)) ) {
// TCP 서버 //////////////////////////////////////////////////////////////// struct sockaddr_in addr_in;
fd_server = socket( PF_INET, SOCK_STREAM, 0 );
option = 1; bzero( &addr_in, sizeof(struct sockaddr_in) ); if( bind( fd_server, (struct sockaddr *)&addr_in, sizeof(struct sockaddr_in) ) < 0 ) if ( 0 > listen( fd_server, 1 ))
// poll 초기화 및 등록 //////////////////////////////////////////////////// poll_events[0].fd = fd_server; // 서버 소켙의 파일 디스크립터 저정
// 자료 송수신 //////////////////////////////////////////////////////////// while ( 1)
poll_state = poll( // poll()을 호출하여 event 발생 여부 확인
if ( 0 < poll_state) // 발생한 event 가 있음 return 0; |
===========
다음 강좌에서는 udp to can 프로그램을 설명하도록 하겠습니다