signal handler and termios

2018. 4. 9. 11:50IT

반응형
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
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <stdlib.h>
 
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/pts/15"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
 
volatile int STOP=FALSE;
 
void signal_handler_IO (int status);
int wait_flag=TRUE;
 
 
int main() {
    int fd, c, res, write_res, count = 0;
    struct termios oldtio, newtio;
    struct sigaction saio;
    char buf[255];
 
    fd = open(MODEMDEVICE, O_RDWR | O_NONBLOCK);
    if(fd < 0) {perror(MODEMDEVICE); exit(-1);}
 
    saio.sa_handler = signal_handler_IO;
 
    //saio.sa_mask = 0;
    sigemptyset(&saio.sa_mask);
    sigaddset(&saio.sa_mask, 0);
 
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO, &saio, NULL);
 
    fcntl(fd, F_SETOWN, getpid());
    fcntl(fd, F_SETFL, FASYNC);
    tcgetattr(fd, &oldtio);
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR | ICRNL;
    newtio.c_oflag = 0;
    newtio.c_lflag = ICANON;
    newtio.c_cc[VMIN] = 1;
    newtio.c_cc[VTIME] = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);
 
 
    while(STOP == FALSE) {
        printf("., %d\n", count); usleep(500000);
        count++;
 
        if(wait_flag == FALSE && count < 10) {
            res = read(fd, buf, 255);
            buf[res] = 0;
            printf(":%s:%d\n", buf, res);
            if(res ==1) { STOP = TRUE; }
            wait_flag = TRUE;
        }
        if(count == 10) {
            char *buf2 = "Answer me!";
            write_res = write(fd, buf2, strlen(buf2));
            sleep(3);
            if(write_res >= 0)
                printf("Send message succeed.");
            sleep(3);
            count = 0;
        }
    }
    tcsetattr(fd, TCSANOW, &oldtio);
}
 
void signal_handler_IO(int status) {
    printf("received SIGIO signal. \n");
    wait_flag = FALSE;
}
 
cs


socat -d -d pty pty 로 임시 serial port open 하고

이 소스로.. 저기 위에 포트만 변경해주고. send write 하고 signal 로 인터럽트 잡고. minicom으로 열어서 데이터 들어오나 확인하고



728x90
반응형

'IT' 카테고리의 다른 글

SNORT  (0) 2018.05.10
find command  (0) 2018.05.10
undefined reference to 'pthread_create/join'  (0) 2018.03.26
시리얼통신  (0) 2018.03.22
우분투 자동업데이트 끄기 / 메모리풀 커널이미지 정리  (0) 2018.03.22