멀티 시리얼 통신에 대해서 질문 드립니다.

cdcmp의 이미지

com1, com2, com3 포트 세개를 사용하여 멀티 시리얼 통신을 하고 있습니다.

우선 소스는 다음과 같습니다.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <iostream>


#define  SERIALDEVICE_com1 "/dev/ttyMP1"
#define  SERIALDEVICE_com2 "/dev/ttyMP2"
#define  SERIALDEVICE_com3 "/dev/ttyMP3"

#define  BAUDRATE_com1 B9600
#define  BAUDRATE_com2 B115200
#define  BAUDRATE_com3 B115200

int nread, result;
int max_fd;
int fd_com1, fd_com2, fd_com3;

struct termios oldtio_com1, oldtio_com2, oldtio_com3, newtio_com1, newtio_com2, newtio_com3;
struct timeval timeout;
 
fd_set readfs;
       
fd_com1 = open(SERIALDEVICE_com1,O_RDWR|O_NOCTTY);
fd_com2 = open(SERIALDEVICE_com2,O_RDWR|O_NOCTTY);
fd_com3 = open(SERIALDEVICE_com3,O_RDWR|O_NOCTTY);
  
if(fd_com1<0)
{
    printf("file open error\n");
    perror(SERIALDEVICE_com1);
}
    
if(fd_com2<0)
{
    printf("file open error\n");
    perror(SERIALDEVICE_com2);
}

if(fd_com3<0)
{
    printf("file open error\n");
    perror(SERIALDEVICE_com3);
}
    
tcgetattr(fd_com1,&oldtio_com1);
bzero(&newtio_com1, sizeof(newtio_com1));
newtio_com1.c_cflag= (CS8+BAUDRATE_com1+CREAD+CLOCAL+HUPCL);

newtio_com1.c_lflag &= ~ICANON;
newtio_com1.c_iflag = IGNPAR | ICRNL;
newtio_com1.c_oflag = 0;
	
tcflush(fd_com1, TCIFLUSH);
tcsetattr(fd_com1,TCSANOW,&newtio_com1);
    

tcgetattr(fd_com2,&oldtio_com2);
bzero(&newtio_com2, sizeof(newtio_com2));
newtio_com2.c_cflag= (CS8+BAUDRATE_com2+CREAD+CLOCAL+HUPCL);

newtio_com2.c_lflag &= ~ICANON;
newtio_com2.c_iflag = IGNPAR | ICRNL;
newtio_com2.c_oflag = 0;

tcflush(fd_com2, TCIFLUSH);
tcsetattr(fd_com2,TCSANOW,&newtio_com2);
    
tcgetattr(fd_com3,&oldtio_com3);
bzero(&newtio_com3, sizeof(newtio_com3));
newtio_com3.c_cflag= (CS8+BAUDRATE_com3+CREAD+CLOCAL+HUPCL);

newtio_com3.c_lflag &= ~ICANON;
newtio_com3.c_iflag = IGNPAR | ICRNL;
newtio_com3.c_oflag = 0;
    
tcflush(fd_com3, TCIFLUSH);
tcsetattr(fd_com3,TCSANOW,&newtio_com3);
    

timeout.tv_usec = 0;  /* 0.1milliseconds */
timeout.tv_sec  = 0;    /* seconds */
	
FD_ZERO(&readfs);
FD_SET(fd_com1,&readfs);
FD_SET(fd_com2,&readfs);
FD_SET(fd_com3,&readfs);
 
max_fd = MAX (fd_com1, fd_com2, fd_com3)+1;

result = select(max_fd, &readfs, NULL, NULL, &timeout);
	
switch(result)
{
    case 0:		
        printf("timeout\n");
        break;
	    
    case -1:		
	perror("select");
	exit(1);
	    
    default:
	if(FD_ISSET(fd_com1, &readfs))     
        {
            ioctl(fd_com1,FIONREAD,&nread);
	        
	    nread = read(fd_com1,&rx_buf[i],1);
		   		    
	}
}
   
switch(result)
{
    case 0:		
        printf("timeout\n");
        break;
	    
    case -1:		
	perror("select");
	exit(1);
	    
    default:
	if(FD_ISSET(fd_com2, &readfs))     
        {
            ioctl(fd_com2,FIONREAD,&nread);
	        
	    nread = read(fd_com2,&rx_buf[i],1);
		   		    
	}
}

switch(result)
{
    case 0:		
        printf("timeout\n");
        break;
	    
    case -1:		
	perror("select");
	exit(1);
	    
    default:
	if(FD_ISSET(fd_com3, &readfs))     
        {
            ioctl(fd_com3,FIONREAD,&nread);
	        
	    nread = read(fd_com3,&rx_buf[i],1);
		   		    
	}
}

여기서

max_fd = MAX (fd_com1, fd_com2, fd_com3)+1;

이렇게 정의를 해주는데....

MAX는 어떻게 정의를 해주어야 하는지요??

그리고 서로 다른 com port에서 baudrate설정과 멀티 시리얼 통신 을 하기 위해서 위의 소스와 같이 해주면 되는지...

MAX정의하는데서 에러가 나서 아직 위의 소스가 되는지 안되는지도 모르겠네요...ㅜ ㅜ

cdpark의 이미지

어떻게 정의하셨는데요? 수학의 max와 다르지 않습니다.

cdcmp의 이미지

위의 소스데로 해서 컴파일 하니까 MAX가 정의 되어 있지 않다고 컴파일 에러가 나서요...

수학의 MAX와 다르지 않다면 그게 어떤 의미인지...

에궁....

다시 한번 답변 부탁 드립니다...^^

익명 사용자의 이미지

MAX()는 입력된 모든 정수의 최대값을 구하면 됩니다.
그렇게 작성하세요.
보통 2개의 파라메터로 보이는게(예제등등에서) 대부분이지만, 여기서는 단지 파라메터가 3개일뿐입니다.

int MAX( int a,int b, int c)
{
    register int max;

     max = a > b ? a:b;
     max = max > c ? max : c;
     return max;
}

* 왜? 이런걸 하나? select()함수를 공부하셔야 겠습니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.