Dev/C, C++

Serial-port 관련 자료 정리

newtype 2014. 8. 29. 21:43

centos 에서 Serial-Port를 이용한 파일전송 모듈을 개발하면서 정리한 자료 입니다.

시리얼 포트 상태 확인

장치 확인

$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:930342833 rx:215304 brk:145317 RTS|CTS|DTR|DSR
1: uart:16550A port:000002F8 irq:3 tx:1090 rx:0 RTS|CTS|DTR|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3

커널에서 시리얼 드라이버 load 되었는지 확인

$ dmesg | grep tty

정상적인 경우

serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

예외 상황

Xen virtual console succefully installed as ttyS0
  • Xen에서 가상콘솔을 사용하는 듯.
  • 출처: https://kldp.org/node/91683
  • 해결 방안: 부팅 관리자에서 Xen이 없는 것으로 부팅(default값 수정 Xen이 없는 것으로 부팅 '0' 시작 Index)
  • $vi /boot/grub/grub.conf default = 1

포트 확인

간략한 포트 확인

$ setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
  Baud_base: 115200, close_delay: 50, divisor: 0
  closing_wait: 3000
  Flags: spd_warp skip_test

조금 더 자세한 포트 확인

$ stty -F /dev/ttyS0
speed 115200 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>;
rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>; min = 0; time = 100;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

상세한 포트 확인

stty -a < /dev/ttyS0
speed 115200 baud; rows 0; columns 0; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
min = 0; time = 100;
-parenb -parodd cs8 -hupcl -cstopb cread clocal crtscts -cdtrdsr
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

시리얼 포트 설정 변경 및 복구

시리얼 포트 자동 설정 하기

setserial /dev/ttyS0 -v autoconfig

시리얼 포트 기본 설정으로 복구 하기

stty sane < /dev/ttyS0

시리얼 포트 속도 변경 하기

stty 115200 < /dev/ttyS0

장치 이름이 지워진 경우 복구하기

mknod -m 666 /dev/ttyS0 c 4 64

시리얼 포트로 접속 테스트

가장 간단한 방법

수신측

cat /dev/ttyS0

송신측

date > /dev/ttyS0

진보된 방법

screen 유틸 사용

minicom 유틸 사용 (시스템 권한 필요)

minicom -s

OSX 에서 시리얼 포트 테스트 방법

  • 시리얼 포트가 없으므로 USB2Serial 젠더나 케이블이 필요하다.
  • 터미널에서 screen 유틸 사용
    • GUI에서 SerialTools 유틸 사용(AppStore에 있음) - 연결 상태를 눈으로 확인 할 수 있어서 추천함.

시리얼 포트 통신 프로그래밍

시리얼 통신 특이사항

  • BAUDRATE을 높게 잡아도 특정 수치 이후로는 속도가 같다.
    • null cable 사용시 11,531 byte per sec 정도 나옴.
  • 버퍼를 255 이상 잡으면 짤려서 전송된다.
    • 송/수신시 나눠서 전송 할 필요가 있다.
  • 전송중에 케이블을 빼도 상태를 알수가 없다.
    • 프토토콜을 정의할 필요가 있다.
  • non-canonical, x초(0.1초이상) 동안 입력이 없으면, timeout 처리 되록 하는것이 최적인듯 하다.
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 100;
newtio.c_cc[VMIN] = 0;

시리얼 포트로 터미널 접속 셋팅(서버측)

/etc/inittab 에 ttyS0 추가

s0:2345:respawn:/sbin/agetty 57600 ttyS0

/etc/securetty 에 ttyS0 추가

참고 문서

반응형