지금.. Com 포트에 데이터 쓰고 읽기..

leolo의 이미지

ttyS0에다 데이터를 쓰고 ttyS1에서 데이터를 읽어 파일에다가
적는 걸 테스트하고 있습니다.
ttyS0은 flow control을 사용하지 않고 데이터를 읽정 시간 간격으로
계속해서 보내고, ttyS1은 h/w flow control을 사용합니다.

1. 일정시간 간격으로 흐름제어를 하지 않는 ttyS0에 데이터를 쓰는게
가능한지.. 아래와 같이 하면 되는지 알고 싶습니다. 지금 코드는 그냥
한번만 쓰게 되어있거든요.. 라이트 하는 부분을 어떻게 수정하면
일정한 간격이 되는지 알고 싶습니다. usleep하면 되는지..
아참.. 일정한 간격으로 쓸때.. 시간은 정밀해야합니다.(마이크로초)

2. 다음으로 두번째.. 코드가 올바른지 알고 싶습니다.
현재 테스트 환경은 무선으로 연결된 상태입니다.
ttyS0 ------> 무선 ------>ttyS1

/******************************
 * "/dev/ttyS0"
 * RS232 interface write Data.
 ******************************/

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include "serial.h"
#include "buf.h"

int serial_open(const char *device, int baud, int flow)
{
    int fd;
    static long baudrate;
    struct termios tio;
    
    fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK, 0644);
    if(fd < 0) {
        dbg("Can't open device %s\n", device);
        return -1;
    } else {
        dbg("Open %s Device, fd %d : \n", device, fd);
        
        bzero(&tio, sizeof(tio));
        
        switch(baud) {
            case 9600:
                baudrate = B9600;
                break;
            case 19200:
                baudrate = B19200;
                break;
            default :
                dbg("Can't define %d\n", baud);
                close(fd);
                exit(0); 
        }  /* end switch */

        tio.c_cflag &= ~CSIZE; 
        tio.c_cflag |= CS8;                          /* 8 data bit    */
        tio.c_cflag &= ~CSTOPB;                      /* 1 stop bit    */
        tio.c_cflag &= ~(PARENB | PARODD);           /* no parity bit */

        if(flow){
            tio.c_cflag |= CRTSCTS;   /* h/w flow control */
        }
        else{
            tio.c_cflag &= ~CRTSCTS;  /* no flow control */
        }
        
        if((cfsetispeed(&tio, baudrate) < 0 || cfsetospeed(&tio, baudrate) < 0)){  /* baudrate set */
            dbg("Can't set baudrate\n");
            close(fd);
            return -1;
        } else {
            if(tcsetattr(fd, TCSANOW, &tio) < 0){     /* termios set */
                dbg("Can't set Termios struct\n");
                close(fd);
                return -1;
            } else {
                if(tcflush(fd, TCIOFLUSH) < 0){
                    close(fd);
                    return -1;
                }   
            } 
        }
   }
   return fd;
}

int serial_write(int fd, char *buf, int size)
{
    int t = 0;
    int ones;
    int writesize;

    writesize = size;
    while(writesize > 0) {
        ones = write(fd, buf, writesize);
        if(ones <= 0) {
            if(errno == EINTR || errno == EAGAIN){
                dbg("Error write serail : %d\n", errno);
                exit(0);
            }
        } else {
            buf += ones;
            writesize -= ones;
            t += ones;
        }
    }
    return t;   
}

int serial_stat(int fd){

    struct termios stio;
    tcgetattr(fd, &stio);

    if(stio.c_cflag & B9600) printf("9600 B/S,");
    else if(stio.c_cflag & B19200) printf("19200 B/S,");
    else printf("Not B/S,");

    if(stio.c_cflag & CRTSCTS) printf("h/w F/C,");
    else if(stio.c_cflag & ~CRTSCTS) printf("none F/C,");
    else printf("s/w F/C,");

    
    if(stio.c_cflag & CS8) printf("8 D/B,");
    else printf("Not D/B,");
    
    if(stio.c_cflag & ~CSTOPB) printf("1 S/T,");
    else printf("2 S/T,");

    if(stio.c_cflag & ~(PARENB|PARODD)) printf("no P/B\n");
    else printf("P/B\n");
}

int usage(const char *device)
{
    printf("serial_write - RS232 write Data. copyright(c)2003 by leolo\n");
    printf("description : RS232(%s) write data\n", device);
    printf("serial_write baudrate <flow/none> byte time count\n");
    exit(0);
}
int main(int argc, char *argv[])
{
    int baud;
    int flow;
    int fd;
    int n;
    const char *device = "/dev/ttyS0";
    int size;
    int tdata = 0;

    if(argc != 4)
        usage(device);

    baud = atoi(argv[1]);
    if(strncmp(argv[2], "flow", 4) == 0)
        flow = 1;         /* h/w flow control */
    else 
        flow = 0;         /* no flow  control */
    size = atoi(argv[3]);
    
    fd = serial_open(device, baud, flow);    
    serial_stat(fd);

    n = serial_write(fd, buf, size);
    tdata += n;
    dbg("Send data total %d\n", tdata);
    close(fd); 
    return 0;
}

/******************************
 * "/dev/ttyS1"
 * RS232 interface read Data.
 ******************************/

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include "serial.h"

int serial_open(const char *device, int baud, int flow)
{
    int fd;
    static long baudrate;
    struct termios tio;
    
    fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK, 0644);
    if(fd < 0) {
        dbg("Can't open device %s\n", device);
        return -1;
    } else {
        dbg("Open %s Device, fd %d : \n", device, fd);
        
        bzero(&tio, sizeof(tio));
        
        switch(baud) {
            case 9600:
                baudrate = B9600;
                break;
            case 19200:
                baudrate = B19200;
                break;
            default :
                dbg("Can't define %d\n", baud);
                close(fd);
                exit(0); 
        }  /* end switch */

        tio.c_cflag &= ~CSIZE; 
        tio.c_cflag |= CS8;                          /* 8 data bit    */
        tio.c_cflag &= ~CSTOPB;                      /* 1 stop bit    */
        tio.c_cflag &= ~(PARENB | PARODD);           /* no parity bit */
        tio.c_cflag |= CREAD;

        if(flow){
            tio.c_cflag |= CRTSCTS;   /* h/w flow control */
        }
        else{
            tio.c_cflag &= ~CRTSCTS;  /* no flow control */
        }
        
        if((cfsetispeed(&tio, baudrate) < 0 || cfsetospeed(&tio, baudrate) < 0)){  /* baudrate set */
            dbg("Can't set baudrate\n");
            close(fd);
            return -1;
        } else {
            if(tcsetattr(fd, TCSANOW, &tio) < 0){     /* termios set */
                dbg("Can't set Termios struct\n");
                close(fd);
                return -1;
            } else {
                if(tcflush(fd, TCIOFLUSH) < 0){
                    close(fd);
                    return -1;
                }   
            } 
        }
   }
   return fd;
}

int serial_write(int fd, char *buf, int size)
{
    int t = 0;
    int ones;
    int writesize;

    writesize = size;
    while(writesize > 0) {
        ones = write(fd, buf, writesize);
        if(ones <= 0) {
            if(errno == EINTR || errno == EAGAIN){
                dbg("Error write serail : %d\n", errno);
                exit(0);
            }
        } else {
            buf += ones;
            writesize -= ones;
            t += ones;
        }
    }
    return t;   
}

int serial_read(int fd, char *buff, int size)
{
    fd_set rfds;    
    int filefd;
    int result, isread, readsize;

    char buffer[2048];

    filefd = open("./serial.out", O_RDWR | O_CREAT | O_TRUNC, 0644);
    while(1){
        FD_ZERO(&rfds); 
        FD_SET(fd, &rfds); 
        printf("select pending\n");
        result = select(fd + 1, &rfds, (fd_set *)0, (fd_set *)0, NULL); 
        if(result <= 0){
            dbg("select error\n");
            exit(0);
        }

        isread = FD_ISSET(fd, &rfds); 
        if(result > 0 && isread != 0){ 
            memset(buffer, '\0', sizeof(buffer));
            readsize = read(fd, buffer, size); 
            if(readsize > 0) { 
                printf("read data %d byte ->  %s\n", readsize,  buffer); 
                write(filefd, buffer, readsize);
            } else { 
                if(readsize <= 0){
                    dbg("Can't read\n"); 
                    exit(0);
                 }
                break; 
            } 
        } else {
            close(filefd);
            break; 
        }
    }
    return -1;
}

int serial_stat(int fd){

    struct termios stio;
    tcgetattr(fd, &stio);

    if(stio.c_cflag & B9600) printf("9600 B/S,");
    else if(stio.c_cflag & B19200) printf("19200 B/S,");
    else printf("Not B/S,");

    if(stio.c_cflag & CRTSCTS) printf("h/w F/C,");
    else if(stio.c_cflag & ~CRTSCTS) printf("none F/C,");
    else printf("s/w F/C,");

    
    if(stio.c_cflag & CS8) printf("8 D/B,");
    else printf("Not D/B,");
    
    if(stio.c_cflag & ~CSTOPB) printf("1 S/T,");
    else printf("2 S/T,");

    if(stio.c_cflag & ~(PARENB|PARODD)) printf("no P/B\n");
    else printf("P/B\n");
}

int main(int argc, char *argv[])
{
    int baud;
    int flow;
    int fd;
    int n;
    char *buf;

    const char *device = "/dev/ttyS1";
    int size = 2048;
    bzero(buf, sizeof(buf));

    flow = 1;      /* h/w flow control */
    baud = 9600;   /* baud rate        */

    fd = serial_open(device, baud, flow);   
    serial_stat(fd);
    n = serial_read(fd, buf, size);


    
    close(fd); 
    return 0;
}
[/code]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.