시리얼통신 프로그래밍 문제 답변좀 부탁드립니다.

최수영의 이미지

시리얼 하우투에 보면, canonical과 non-canonical이 있던데.
무슨 뜻인지요? canonical은 줄단위로 처리하고, non-canonical은
단어 단위로 처리하는 건가요?
그리고, 송신측에서 수신측의 버퍼를 생각하지 않고 보내니까 수신측에서
문제가 생기는데, 어떻게 제대로 처리할 수 있는 방법은 없는지요?
송신속도가 수신측의 처리속도보다 더 빨라서 생기는 문제 같습니다.
약 250바이트 정도는 제대로 받는데, 그다음은 이상한 값을 받는 문제가 발생하는데, 처리방법이 어렵네요...
시리얼통신은 쉬운듯 하면서도 어렵네요... 쩝...
아시는 분 답글좀 부탁드릴께요...

mach의 이미지

cannonical vs. raw(non-canonical)을 구분하기 위한
예를 들어보지요.

$ ls -l
이라는 명령을 치고 싶었다.
그런데, 오타가 났다.
ls-l (즉, 공백을 빼먹었다.)
이를 고쳐서 명령으로 인식하게 하고 싶다.
고치는 방법은?
방법1.지우는 문자를 몇개 보내고(BS:backspace등)
다시 입력한다.
예에서는 "BS:2개, 공백, -, l, 엔터" ==> 총 6문자입력이겠습니다.
또는 화살표키를 핸들링하게 하여 입력을 다소 편하게 할 수 있겠지만,
이를 처리하는 로직이 복잡해지겠지요.

이럴때, 사용되는 것이 cannonical mode입니다.

기본적으로 시리얼입력장치는 한바이트 입력에대해
한바이트전송을 수행합니다. 이렇게 전송된 데이터는
아무런 가공없이 수신측에 도착됩니다.
그런데, 때로는 어떤 입력에 대해 위의 예와 같이 일부 또는
전체를 수정해야만 하는 경우가 있습니다.
주로 복잡한 입력 유형을 가지는 장치로 부터의 입력인
경우인데요, 텔넷, 시리얼터미널등의 프로그램이 그 사례입니다.
이 경우에 서버사이드에서 주로 이 버퍼를 관리하는
루틴을 만들어 주게 됩니다. 임시버퍼에 쌓게 하고
엔터키(CR)등의 입력이 오면 이를 실제 처리로직에
전달하게 하는 식으로요.

반면 마우스(시리얼마우스)와 같이 아주 단순한 입력
만을 수행하는 경우에는 cannonical mode가 필요없는
경우가 대부분입니다. 즉, 버튼이 눌리건 마우스가
움직이건 그 입력이 즉시 반영되기를 기대하는 경우
입니다. (물론, 더블클릭등 시간등의 파라메터가 추가
된다면 다소 테크닉이 필요합니다.) 주로 이것은
단순 센서등에서 사용하게 되겠지요.

버퍼문제에 대해.
시리얼 통신은 통신속도가 예측되며, 전송량도 소량에
해당됩니다. 버퍼에 대한 처리는 주로 프로그래머에게
책임으로 넘겨지는데, 위에서 언급하신 내용은
flow control에 대한 얘기로 보입니다. (질문하신 분의 내용으로
봐서는 overrun등의 에러는 아닌듯 해서 말씀드립니다)
이 경우 해결책은 2가지정도 언급할 수 있는데,
첫째, 버퍼를 크게(!, 16KB~32KB면 크지요 아주) 잡는다.
둘째, ARQ를 사용한다.
이 두가지 입니다.
버퍼를 시리얼 전송속도에 비해 충분한 크기로 잡아준다.(circula
buffer구조를 사용하는 것도 좋습니다)
또는 프로토콜로 해결하는 방법입니다. 즉, 전송후 잘 받았는지,
확인응답을 수행하는것입니다.(ARQ)

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.