시리얼 통신설정에 대해 알고자 합니다.

harisoo의 이미지

다름이 아니라 제가 지금

윈도우 프로그램에서 어떤 장비로 시리얼로 데이터를 전송합니다.

그런데 제가 이걸 리눅스로 포팅하고자 하는데 시리얼 설정을 어떻게

해야할지 모르겟네요..

시리얼 프로토콜도 모르는 막막한 상태에서 인터넷 검색으로

portmon이라는 프로그램을 구햇습니다.

그 프로그램으로 실행시켜보니 설정이랑 데이터가 나오는데 설정부분이

이해가 잘 안되서 질문을 올립니다.

캡쳐화면은 다음과 같습니다.

0.00007543 ADevice.exe IRP_MJ_CREATE Serial1 SUCCESS Options: Open
0.00000922 ADevice.exe IOCTL_SERIAL_SET_WAIT_MASK Serial1 SUCCESS Mask: RXCHAR
0.00000503 ADevice.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial1 SUCCESS InSize: 4096 OutSize: 4096
0.00000670 ADevice.exe IOCTL_SERIAL_PURGE Serial1 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
0.00000419 ADevice.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS
0.00000587 ADevice.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS
0.00000335 ADevice.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS
0.00001173 ADevice.exe IOCTL_SERIAL_SET_BAUD_RATE Serial1 SUCCESS Rate: 9600
0.00000670 ADevice.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial1 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
0.00000419 ADevice.exe IOCTL_SERIAL_SET_CHAR Serial1 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
0.00000670 ADevice.exe IOCTL_SERIAL_SET_HANDFLOW Serial1 SUCCESS Shake:1a Replace:80 XonLimit:2048 XoffLimit:512
0.00000419 ADevice.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS
0.00001173 ADevice.exe IOCTL_SERIAL_SET_BAUD_RATE Serial1 SUCCESS Rate: 9600
0.00000587 ADevice.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial1 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
0.00000419 ADevice.exe IOCTL_SERIAL_SET_CHAR Serial1 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
0.00000587 ADevice.exe IOCTL_SERIAL_SET_HANDFLOW Serial1 SUCCESS Shake:1a Replace:80 XonLimit:2048 XoffLimit:512
0.00000587 ADevice.exe IOCTL_SERIAL_GET_TIMEOUTS Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_SET_TIMEOUTS Serial1 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0
0.00001425 ADevice.exe IOCTL_SERIAL_SET_WAIT_MASK Serial1 SUCCESS Mask: RXCHAR
1.68327883 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00004023 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00004190 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00004107 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003939 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003017 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003855 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003185 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003017 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003855 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003017 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003520 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003520 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00002933 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003771 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003101 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00004358 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00003520 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 1: 0D
0.00000838 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000922 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 0D 4C 49 4E 4B 20 0D 33
0.00000922 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000587 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00806583 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000587 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000670 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 39 30 30 30 30 41 30 30
0.00000670 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00811779 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000587 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 30 30 30 30 30 30 30 30
0.00000670 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000419 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00814293 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000670 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 30 30 30 30 30 30 30 41
0.00000670 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00633432 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000587 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 2: 37 0D
0.00000838 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.02252381 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00005448 ADevice.exe IRP_MJ_WRITE Serial1 SUCCESS Length 13: 31 34 30 33 46 46 31 31 30 30 35 39 0D
0.00001006 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00001173 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 2: 4F 0D
0.00000922 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00001006 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.08776700 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00001006 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00001090 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 32 35 30 30 35 41 30 30
0.00000838 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00805409 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000587 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000670 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 8: 46 30 46 46 46 46 46 46
0.00000670 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00946293 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000587 ADevice.exe IRP_MJ_READ Serial1 SUCCESS Length 5: 46 46 31 35 0D
0.00000670 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1 SUCCESS
0.00000503 ADevice.exe IOCTL_SERIAL_GET_COMMSTATUS Serial1 SUCCESS
0.00000000 ADevice.exe IOCTL_SERIAL_WAIT_ON_MASK Serial1

리눅스로 시리얼 설정을 해야한다면 어떻게 해야할까요?

데이터는 보니까 저게 다인거 같은데..

고수님들의 조언 바랍니다.

suapapa의 이미지

파이썬에서 pyserial(http://pyserial.sourceforge.net/) 라이브러리를 이용해서 윈도에서 위 프로그램을 재 구현하고,
그걸 그냥 리눅스에서 쓰시면 됩니다.
Serial 프로토콜?은 pyserial에서 알아서 처리해 주며, 두 OS간 사용법이 똑같습니다!

사용 예는 위사이트에서 찾아보실수 있고, 조금 소개하자면..

>>> import serial
>>> ser = serial.Serial(0) #포트번호 0
>>> ser
Serial<id=0x13b0670, open=True>(port='COM1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0, dsrdtr=0)

위와 같이 포트번호를 0으로 하면 자동으로 윈도에서는 COM1 포트에 바인딩이 되며 리눅스에서는 /dev/ttyS0 에 바인딩이 됩니다.
(위 예제는 윈도에서의 결과 입니다)

>>> ser.write('\x0d')

harisoo님의 덤프에서 처럼 0x0d를 보내봤습니다. 간단하죠?

받을때는 아래와 같습니다.

>>>> ser.read(8)

연결된 장치에서 8바이트를 받을때까지 기다린 후 받은 값을 리턴합니다.
>>>> ser.readline(eol='\r\n')

연결된 장체에서 한줄을 받을때까지 기다린 후 받은 값을 리턴합니다.
eol을 명시한 이유는 윈도와 리눅스의 eol캐릭터가 달라서.. (제 기억이 맞는지..?)

그럼 만약 장치에서 eol을 안 보내주면 어떻게 될까요? 계속 기다리게 됩니다 -_-;;
그래서 아래와 같이 timeout을 설정해 줍니다.

>>> ser = serial.Serial(0, timeout=1) #포트번호 0 #timeout = 1초

1초가 지날때까지 기다리다 현재까지 받은 데이타를 리턴하게 됩니다.

덤프에서 초반에 '0x0D'를 계속 장치에 보내던데
timeout동안 장치가 답변이 없으므로 또 보내보고, 또 보내보고 이러는 것 같네요 :)

lovemyin의 이미지

아래의 사이트에 링크된 PDF 파일을 확인해 보십시오.
리눅스에서 시리얼 통신을 어떻게 하는지 프로그래밍 소스 코드까지 제공해줍니다.
좋은 자료가 될 수 있을 것 같아 추천해 드립니다.
저도 리눅스에서 시리얼 통신을 많이 하는 편인데 아래의 참고 자료만 보고도 충분히 하실 수 있을 겁니다.

http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/pdf/Serial-Programming-HOWTO.pdf

윈도우/리눅스 시리얼 통신 라이브러리를 같은 인터페이스로 만들어 놓으세요.
매번 귀찮게 다시 코딩하시기 힘들텐데...

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

harisoo의 이미지

파이썬에 그런게 잇었군요..

일단 시도를 해보겟습니다.

파이썬을 할 줄 몰라서.. 좀 헤멜듯 하지만..

다시 한번 감사드리며 혹시 파이썬 가이드나 찾아봐야겟네요 ㅎㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.