이렇게 하드디스크를 따로 사면 전부 선을 연결하고 하드웨어적으로 해야하는 것들을 가상으로 이런식으로 소프트웨어적으로도 가능한 것이다.
명령어 ls -al /dev/ttyS* 까지 치게되면 시리얼 포트가 굉장히 많은 것을 확인할 수 있다. 하지만 이건 전부 진짜가 아니다. 진짜 시리얼 포트는
이런식으로 시리얼 포트를 추가해줘야 한다.
저기 저 커넥트는
내부에서 시리얼을 연결할 수 있기 때문에 해도되고 안해도 된다.
컴퓨터에 시리얼포트가 이제 없어도 된다.
리눅스안에 예를 들어 COM1이 생성되었으면 이건 밖으로 못빠져나온다. '가상' 이기 때문에,
1.커넥트하고 Finish하면 그 시리얼 포트가 우리 컴퓨터의 COM1과 연결되는 것인 것이다.
2.체크 안하면 리눅스와 우리 컴퓨터가 아예 별개가 되는 것이다.
내컴퓨터에 COM이 하나도 없으면 그 가상컴퓨터에서 존재하는 데이터들을 주고받을 수가 없다. 방법이 없다.
이럴때 우리 윈도우와 리눅스와 연결하려면 COM이 존재해야 하기에 우리도 윈도우에서 가상 시리얼을 만들면 된다.
<!!>
이제 리눅스와 시리얼 통신을 할 준비가 끝났다.
이렇게 컴포트를 만들수 있다.
시리얼포트리스트, 만들거나 없앨 수 있는
이 프로그램은 시리얼포트를 두개씩 만든다.
왼쪽에 피지컬로 진짜 시리얼이 존재한다면 뜬다.
내부적으로 Pair를 누르면 연결시켜준다.
COM1에서 데이터를 보내면 COM2 로 나가는 것을 Pair 라고 한다.
이런건 어떨때 쓰이냐. 우리가 Win32로 COM1과 COM2를 연결해 놓는다. COM1 에 어떤 장치, COM2에 어떤장치를 연겷나다.
그럼 Win32의 역활은 일종의 패킷캡쳐 처럼 데이터를 중간에서 해킹할 수 있는? 것이다. 전화선을 도청하면되는것이다.
EX) 아이폰 어플 : 대화할 때 암호화하는 어플이 존재한다. 도청을 해도 알아 들을 수 없다.
해독이 불가능 하게끔.
암호문이 실제로는 고대 언어 에서 유래됬다. 고대 언어를 해독하다 보니 그 고대 언어 자체가 암호문 이 였던 것이다.
이런 것 처럼 중간에 그 데이터 자체를 암호화 할 수 있는 것이다. Win32로 , 아마 이것을 할 것 같다.
도청 프로그램이 존재한다. 카톡 사건 처럼.
서로 연계시키는 작업을 하게 될 것이다.
이런 식으로 이것을 회사가서 써먹을 수 있다. 유용한 프로그램
어떨 때도 사용되냐?
우리 컴퓨터가 있고 , 바코드 리더기를 샀다고 치자. 프로그램에 미사일 하면 pc 에 미사일이라고 뜬다.
유에스비 연결할 때마다 COM 이 생긴다면 100퍼센트 시리얼 통신 인 것이다.
우리 나가는 COm 이 하나밖에 없으면 PC에서 COm1에 연결될 것이고, 외부 리더기도 COM1 에 연결 될 것이다.
여기서 이 가상 시리얼 7 번을 만들고 PC에서 7번으로 연결한다.
서로 끊겨 있다 여기까지는.
여기서 시리얼 프로그램을 짠다.
Z. 라는 프로그램.
중간에 Z가 끼면 데이터를 다 볼 수 있따.
이때 가상으로 6, 2 번을 만들고 6, 7 과 Pair, 1, 2 와 Pair 를 시킨다.
Z가 6, 2 를 연다.
Z가 읽어 들인 데이터를 그대로 PC에만 보여주고 로그로 남은 데이터를 우리가 구워 삶을 수 있는 것이다.
중간에서 Cut 시켜서 조작질을 할 수 있게 되는 것이다.
도청이 가능 하다라는 것은 수정도 가능 하다라는 것이다. 중간에 끼면 무슨 짓이던 가능 하다라는 것이다.
네크워크도 이런 것이 있다. 오는 데이터를 패킷 캡쳐로 하면 가능하다.
보내는 것은 가짜로 만들어서 보내면 되는 것이고,
즉, 리더기에 데이터가 들어오면 1->2->z->7->6->pc 로 가게 되는 것이다.
리눅스와 Com1과 매칭이 되었다 친다. 이때 Com2로 돌려버리고 COm2는 하이퍼 터미널로 받게끔 해버리면 데이터가 왔다갔다 할 수 있는 것이다.
중복으로 열수가 없다. 누가 내부로 COm1과 연결되어있다면 이 COm1은 반드시 밖으로 나가야 되는 형태가 되어야 하는 것이다.
이제 하이퍼 터미널로 이와 같은 테스트를 해 볼 것이다.
완벽한 시리얼 포트 드라이버로 동작하게 된다.
피지컬 반드시 안 써도 된다.
재부팅 해도 그대로 살아있다. 가상 포트는.
VM 웨어를 껐다 켜야 인식한다
이제 하이퍼 터미널로 리눅스에서 보내는 데이터를 받아서 화면에 띄울 수 있게 된다.
vm 웨어를 껐다 켜야 이와 같이 정상으로 띄워준다. 가상 컴포트였기 때문에 VM 웨어가 아직 인식을 못하는 것이였다.
리눅스 입장에서는 첫번째 것이 ttyS0 가 되는 것이고 두번째는 ttyS1이 되는 것이다.
둘다 연결하면 내부적으로 몬연다. 그래서 하나를 꺼줘야 한다.
내부에서 연결이 불가능 한 것이다. 둘다 연결해놓으면 연결할 방도가 없어진다.
S0만 열어놨으니 케노니컬의 디파인 ttyS 값을 수정해 줘야 한다. ttyS1 -> ttyS0
테스트할 준비가 끝났고 PDF를 보자.
터미널 io 스트럭쳐 라는 뜻이다.
시리얼 포트의 입출력을 담당하는 구조체 라는 뜻이다.
이 구조체는 채팅할 때 셋팅하는 구조체랑 똑같다., 한번 쓰면 버려지는 애다.
POSIX가 이 정도 되야 하는 것이 POSIX 고, ->(POSIX가 인정했다. 라는 말은 그만큼 안정적인 운영체제라는 뜻이다.)
struct termio
구조체 내부의 '군'이다.
구조체의 제일 첫번쨰 항목을 설명하고 있따.
리눅스책에 아쉬운것. 터미널에 대해서 적혀있는것은 다른 내용이 부실. 다른 내용이 탄탄 터미널 내용이 부실 하다. 그래서 주쌤이 직접 쓴것.
제어
얘도 직접 bit 셋팅할 수 있다,
select() 가 멀티플렉싱 이다.
어싱크로노스 비동기 방식.
한 줄 단위로 통신하는 것이 케노니컬이라 한다. -> 엔터. 즉, 도스가 케노니칼 방식인 것이다. 엔터키 입력전까지는 데이터를 안보내는 것이다.
C 에서는 NULL 이 한줄 인 것이다. 개념상으로 여기서는 EOL 이 되겟따.(크기 고정 불가능)
특정한 크기가 정해져서 그 데이터 크기가 다 오지 않왔다면 데이터가 다 온것이다 아니다. 이걸 논-케노니칼 이라고 한다.(크기 고정)
즉, 언제 끝날지를 정해주는 것이다.
어싱크로노스는 케노니컬, 논 케노니컬에서 좀더 부가적으로 어떤 상황이 벌어지지 더해진 것이다.
멀티 플렉스는 앞에서쓴거랑 별개다.?
#define SPEED B19200
속도 앞에 대문자 B를 적어줘야 한다. 뒤에 숫자 값은 서로서로 틀린 것 같다.
Old, New 형태로 되어 있다 백업을 위한 것임을 예측한다.
open() 로 저수준으로 읽고 쓴다 라는 것도 예측,
open 에서 O_NOCTTY 이 모드는, 프로그래밍하다가 ctrl + C 눌렀을때 처리를 담당한다. 만약 제어문자를 우리 프로그램 안에서만 처리하게끔 되어 있지 않다면 제어문자가 상대방에게 전송되어 그쪽에서 제어가 작동될 것이다. 그러므로 이 처리를 반드시 해줘야 한다.
tcgetattr() -> 터미널 컨트롤 이다. 가져오겠다. attr 어트리 뷰트 속성을 가져오겠다. 방금 연 장치를 가져오겠다. Old 에 가져오겠다.
get 반대말은 set이다. 나중에 Old를 set 함수로 복귀를 시켜주겠다 도 예측이 가능하다.
bzero() 할 필요 없다.
Old 를 New에 덮어씌우고 해야한다.
8비트 모드, 시로칼, c리드 등.. -> 컨트롤 플래그
->인풋 플래그
그대로 쓴다. ->출력 플래그
케노니컬 모드 설렉트->로컬
방금 셋팅한 구조체를 set 써서 다시 적용
케노니컬이 최소 한 개 치고 엔터칠때까지 정지
이제 컴파일 후 실행 해 보자.
<정리>
내부 COM2 <-> COM3 연결
리눅스 : COM2 , 하이퍼 터미널 : COM3
데이터가 잘 읽혀지는 것을 확인 할 수 있다.
내부적으로 한번만 읽고 close() 시키므로 한번 읽고 나면 종료 되는 것을 볼 수 있다.
VMIN 이 >0 ,TIME 이 0 이면 블로킹 상태,(무한 대기)
(시간제한이 걸림, 블로킹이 풀림, 읽었다고 간주하고 밑으로 내려간다, 열때 열리는 것이 아니고 read 함수가 블로킹이냐 아니냐? read 함수를 호출하면 )
우리가 정한 숫자보다 넘어야 문자수신, 시간 제한 넘으면 거기 까지 리턴 된다.
굉장히 빨리 리턴한다. 블로킹 없고 실시간 없이 아무 글자 없을 때 쓰레기 값을 리턴 할 것이다.
5글자 받을 때까지 블로킹.
즉, 무한대기 에서 5글자 이상을 치게 되면 바로 리턴 된다.
volatile 이 붙어 있는걸로 봐서 실시간으로 체킹한다 라는것을 유추
소프트웨어 인터럽트를 쓴다.
<현재 우리가 데이터를 읽어들이는 모드 정리 3가지>
첫번째 시간제한 갯수 제한 없이 입력
두번째 시간제한, 갯수 제한 입력
세번째 소프트웨어 인터럽트 방식. (어싱크로노스 == 언제 일어날지 모르는 비 동기 방식)
SIG IO <- io 가 일어날때 핸들러 인터럽트 함수 호출이 되게끔 설정 sigaction() 로 써 설정.
getpid() 의 실행하는 번호를 넣어준다.
리눅스에 장치가 있고, 이 장치는 아무 프로세스가 다 접근할 수 있고, fcntl()로 엮을 수 있는 것이란 것이다.
io로 발생하면 신호가 내부
★케노니칼 이냐 논케노니칼 이냐는 반드시 명시가 필요하다.
케노니컬을 ~ 인터럽트 처리~
논 케노니컬을 ~ ''
무조건 이 두개가 붙는다.
평소에는 자고 있다가
핸들러 함수에 의해서 플래그 값인 iBreak 변수 값이 1로 바뀌면 read()를 호출하여 데이터를 읽어 들인다.
즉, 이 시스템은 go sleep , go sleep ~read() 하기 전까진 계속 출력할 것이다.
input_incomming() 는 선택적으로 화면에 읽어들여서 뿌려주는 역활을 한다.
간단한 프로그램을 만들때는 케노니컬을 만들어 기초 셋팅한 다음 그런식으로 만들면 되는 것이다.
화면에 저장되는 값을 win32로 그래프로 찍어버리면( 점을 찍으면) 될 것이다.
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151207 리눅스 시리얼 통신 이량경_ (4) | 2015.12.08 |
---|---|
20151207 임현수 업무일지 리눅스 시리얼통신 (4) | 2015.12.08 |
2015-12-07 Linux Serial 통신개인업무일지 - 천정호 (5) | 2015.12.08 |
20151207 윤재희 리눅스 시리얼 통신 (5) | 2015.12.07 |
20151207 일일업무보고서_박서연_LinuxSerial통신 (6) | 2015.12.07 |
20151207 - 엄민웅 시리얼 통신 Canonical, Non-Canonical, Asynchronous, Multi Flexing (4) | 2015.12.07 |
20151207-김재홍-Serial_1일차-리눅스시리얼통신 (5) | 2015.12.07 |
20151202 22번 우대희 업무일지 (7) | 2015.12.03 |