728x90
반응형
길에서주은(?) USB에 담긴 프로그램(VSPD) 설치 해서 가상 시리얼 포트 생성 후(안쓰는 포트번호 2개)
vmware(아까 생성한 포트를 메뉴 VM ->세팅에서 시리얼 추가해주고 화면 하단에 두개 추가로 떠있는거에 두번째 포트는 디스커넥트 해준다)에
소스코드 돌리기고 하이퍼터미널로 데이터 전송해보기 ㅎㅎ
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
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
2015-12-07 Linux Serial 통신개인업무일지 - 천정호 (5) | 2015.12.08 |
---|---|
20151207 윤재희 리눅스 시리얼 통신 (5) | 2015.12.07 |
20151207 - 홍준모 Linux 와 Window 간의 시리얼 통신 1일차, 케노니칼, 논 케노니칼 실습 (4) | 2015.12.07 |
20151207 일일업무보고서_박서연_LinuxSerial통신 (6) | 2015.12.07 |
20151207-김재홍-Serial_1일차-리눅스시리얼통신 (5) | 2015.12.07 |
20151202 22번 우대희 업무일지 (7) | 2015.12.03 |
20151202_박서연_일일업무보고서_ARM Assembly, WinSock (5) | 2015.12.03 |
20151202 김태현 개인업무일지 (5) | 2015.12.03 |