본문 바로가기
코스웨어/15년 스마트컨트롤러

20151207 - 엄민웅 시리얼 통신 Canonical, Non-Canonical, Asynchronous, Multi Flexing

by 알 수 없는 사용자 2015. 12. 7.
728x90
반응형

길에서주은(?) USB에 담긴 프로그램(VSPD) 설치 해서 가상 시리얼 포트 생성 후(안쓰는 포트번호 2개)

vmware(아까 생성한 포트를 메뉴 VM ->세팅에서 시리얼 추가해주고 화면 하단에 두개 추가로 떠있는거에 두번째 포트는 디스커넥트 해준다)에 

소스코드 돌리기고 하이퍼터미널로 데이터 전송해보기 ㅎㅎ



스마트-RS232C 통신.pdf


termios 터미널 입출력 구조체

POSIX운영체제 표준하 UNIX의 내용을 다담고 있다.

Canonical 엔터 치기 전까지 데이터를 전송 X

Non-Canonical 정해진 데이터까지가야 지 전송 

sigaction 시그널 비동기 방식 인터럽트 방식 (언제 나타날지 모르는 실시간)


통신 하는 두곳 사이에다가 중간에 포트를 연결해서 있으면 그 중간 포트를 통해서 통신 내용들 알수도 있다하심.

예로 휴대폰을 핵킹하는것이 아니라 전화국을 핵킹해버리면 다 알 수 있는 것처럼. 




예제 소스.


Canonical

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
#include<sys/types.h>
#include<sys/stat.h>
 
#define SPEED B19200
#define SPORT "/dev/ttyS0"
 
int main()
{
        char cBuff[255];
 
        int iDev = 0;
        int iRet = 0;
 
        struct termios stOldState;
        struct termios stNewState;
 
        iDev = open(SPORT, O_RDWR | O_NOCTTY);
 
 
        if(0 >iDev)
        {
                perror(SPORT);
                exit(-100);
        }
 
        tcgetattr(iDev, &stOldState);
 
 
        bzero(&stNewState, sizeof(stNewState));
 
        stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD;
 
        stNewState.c_iflag = IGNPAR | ICRNL;
        stNewState.c_oflag = 0;
 
        stNewState.c_lflag = ICANON;
        bzero(stNewState.c_cc, NCCS);
        stNewState.c_cc[VMIN] = 1;
 
        tcflush(iDev, TCIFLUSH);
        tcsetattr(iDev, TCSANOW, &stNewState);
 
        iRet = read(iDev, cBuff, 255);
        cBuff[iRet] = 0;
        printf("[%s]:[%d]\n", cBuff, iRet);
 
        tcsetattr(iDev, TCSANOW, &stOldState);
        close(iDev);
 
        return 0;
}
cs



Non-Canonical

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
#include<sys/types.h>
#include<sys/stat.h>
 
#define SPEED B19200
#define SPORT "/dev/ttyS0"
 
int main()
{
        char cBuff[255];
 
        int iDev = 0;
        int iRet = 0;
 
        struct termios stOldState;
        struct termios stNewState;
 
        iDev = open(SPORT, O_RDWR | O_NOCTTY);
 
 
        if(0 >iDev)
        {
                perror(SPORT);
                exit(-100);
        }
 
        tcgetattr(iDev, &stOldState);
 
 
        bzero(&stNewState, sizeof(stNewState));
 
        stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD;
 
        stNewState.c_iflag = IGNPAR | ICRNL;
        stNewState.c_oflag = 0;
 
        stNewState.c_lflag = 0;
        bzero(stNewState.c_cc, NCCS);
 
        stNewState.c_cc[VTIME] = 0;
        stNewState.c_cc[VMIN] = 5;
 
        tcflush(iDev, TCIFLUSH);
        tcsetattr(iDev, TCSANOW, &stNewState);
 
        iRet = read(iDev, cBuff, 255);
        cBuff[iRet] = 0;
        printf("[%s]:[%d]\n", cBuff, iRet);
 
        tcsetattr(iDev, TCSANOW, &stOldState);
        close(iDev);
 
        return 0;
}
cs



Asynchronous

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/signal.h>
 
#define SPEED B19200
#define SPORT "/dev/ttyS0"
 
volatile int iBreak = 0;
 
void Handle_Serial_Sig(int Arg)
{
        printf("Receive SIGIO Singal\n");
        iBreak = 1;
}
 
int main()
{
        char cBuff[255];
        int iDev = 0;
        int iRet = 0;
        struct termios stOldState;
        struct termios stNewState;
        struct sigaction stSigAct;
 
        iDev = open(SPORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
 
        if(0 > iDev)
        {
                perror(SPORT);
                exit(-100);
        }
 
        bzero(&stSigAct, sizeof(stSigAct));
        stSigAct.sa_handler = Handle_Serial_Sig;
        sigaction(SIGIO, &stSigAct, NULL);
 
        fcntl(iDev, F_SETOWN, getpid());
 
        fcntl(iDev, F_SETFL, FASYNC);
 
        tcgetattr(iDev, &stOldState);
        bzero(&stNewState, sizeof(stNewState));
 
        stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD;
 
        stNewState.c_iflag = IGNPAR | ICRNL;
        stNewState.c_iflag = 0;
        stNewState.c_lflag = ICANON;
        stNewState.c_cc[VMIN] = 1;
        stNewState.c_cc[VTIME] = 0;
 
        tcflush(iDev, TCIFLUSH);
        tcsetattr(iDev, TCSANOW, &stNewState);
 
        while(1)
        {
                if(1 == iBreak)
                {
                        iRet = read(iDev, cBuff, 255);
                        cBuff[iRet] = 0;
                        printf("[%s] : [%d]\n", cBuff, iRet);
                        break;
                }
                else
                {
                        sleep(2);
                }
                printf("Go Sleep\n");
        }
 
        tcsetattr(iDev, TCSANOW, &stOldState);
        close(iDev);
 
        return 0;
}
 
cs



Multi Flexing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
#include<stdio.h>
#include<unistd.h>
#include<termios.h>
#include<fcntl.h>
#include<sys/time.h>
#include<sys/types.h>
 
#define SPEED B19200
#define COMPORT1 "/dev/ttyS0"
#define COMPORT2 "/dev/ttyS1"
 
void Input_Incomming(int);
char cBuff[255];
 
int main()
{
    int iMaxFD = 0;
    int iCom1 = 0;
    int iCom2 = 0;
    struct termios stOldSt1;
    struct termios stOldSt2;
    struct termios stNewSt1;
    struct termios stNewSt2;
    fd_set stRFd;
 
    iCom1 = open(COMPORT1, O_RDWR | O_NOCTTY );
 
    if(0 > iCom1)
    {
        perror(COMPORT1);
        exit(-1);
    }
 
    iCom2 = open(COMPORT1, O_RDWR | O_NOCTTY );
 
    if(0 > iCom2)
    {
        perror(COMPORT2);
        exit(-1);
    }
 
    tcgetattr(iCom1, &stOldSt1);
    tcgetattr(iCom1, &stOldSt2);
 
    bzero(&stNewSt1, sizeof(stNewSt1));
    stNewSt1.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD;
    stNewSt1.c_iflag = IGNPAR | ICRNL;
    stNewSt1.c_iflag = 0;
    stNewSt1.c_cc[VMIN] = 1;
 
    stNewSt2 = stNewSt1;
 
    fcflush(iCom1, TCIFLUSH);
    tcsetattr(iCom1, TCSANOW, &stNewSt1);
    fcflush(iCom2, TCIFLUSH);
    tcsetattr(iCom1, TCSANOW, &stNewSt2);
 
    iMaxFD = iCom2 + 1;
 
    while(1)
    {
        FD_ZERO(&stRFd);
        FD_SET(iCom1, &stRFd);
        FD_SET(iCom2, &stRFd);
 
        select(iMaxFD, &stRFd, NULL, NULL, NULL);
 
        if(FD_ISSET(iCom1, &stRFd))
        {
            Input_Incomming(iCom1);
        }
        
        if(FD_ISSET(iCom2, &stRFd))
        {
            Input_Incomming(iCom2);
        }
 
    }
    
    tcsetattr(iCom1, TCSANOW, &stOldSt1);
    tcsetattr(iCom2, TCSANOW, &stOldSt2);
    close(iCom1);
    close(iCom2);
 
    return 0;
}
 
void Input_Incomming(int iPort)
{
    int iRet = read(iPort, cBuff, 255);
 
    cBuff[iRet] = 0;
    printf("[%s] : [%d]\n", cBuff, iRet);
}
cs



728x90