시리얼 통신에서 둘 이상의 프로세스가 작동할때의 질문입니다.

cococo의 이미지

글로 설명이 힘든 줄 알지만, 어디를 봐야 할지 짐작가는 데가 전부 없어져서 질문 올려 봅니다.

타겟 보드와 다른 보드 사이에서 RS485 로 시리얼 통신을 하고 있습니다. ( 2선이용. 제어선 없음. 우선은 1:1 통신)
이 시리얼 프로그램은, [다른 보드]를 일정 시간 간격(현재는 1초로 설정 )으로 감시(정해진 패킷을 보내고 그에 대한 데이터를 받음)합니다. 이 시리얼 프로그램 자체는, 혼자 돌 때는 에러 없이 잘 돌아갑니다.

그런데요. Com port를 사용하지 않는, touch pad의 입력을 감시하는 프로그램을 실행시킨 후에 위의 시리얼 통신 프로그램을 실행시키면, 이상하게 4번에 1번 - 7번에 1번정도로 에러가 납니다.
에러가 난다는게.... 감시 프로그램이 보낸 패킷에 대한 답을 수신하는 것이 실패하는 거죠.
근데, 실제로 데이터가 [다른 보드]에서 송신 안 되는 건 아니고, 단지 타겟 보드에서 (데이터가 송신되었음에도 불구하고) 수신을 못 하는 거더라구요.(이건 시리얼 케이블 모니터로 직접 오가는 데이터를 확인했습니다.)
즉, [다른 보드]는 타겟 보드에서 패킷(10-20 byte)을 받아 그에 따른 응답 데이터(10-40byte)를 송신하는데, [타겟 보드]가 막상 수신을 못하더라구요.

그래서....
1. 혹시 [Blocking mode - Non blocking mode] 의 문제가 아닌가...생각해서, 두 개의 프로그램(Touch 감시, RS485 감시)를 blocking / non blocking mode로 해 봤습니다.
근데 결과는 같더군요.
2. 특히 Touch 프로그램의 경우는, touch device를 select()를 써서도 감시해 보고, 단순히 select() 없이 read()만으로 감시하는 것도 해 봤는데, 결과가 같더라구요.

3. 프로세서 파워나 메모리의 문제인가 ... 해서, Touch 감시 프로그램보다 훨씬 무거운 GUI 프로그램 + 시리얼 감시 프로그램 으로 돌려 봤습니다만, 이때는 오히려 문제가 전혀 없었습니다.

일단 touch 프로그램은 시리얼을 전혀 안 쓰니까, 메모리 공유 문제나 뭐 그런 거는 아닐거라고 생각하는데요, 뭐가 문제인지 모르겠네요.

설명이 부족한 건 알지만, 혹시 어디가 문제인 지 짐작가시는 부분이 있으신 분들은, 주저말고 말씀해 주시기 바랍니다. 제 머리에서 짐작가는 부분은 다 건드려 봐서, 어디를 더 뒤져봐야 될 지 모르겠습니다.

혹시나 해서 에러 상황을 조금 더 자세히 설명하면요,
[다른 보드]가 송신하는 데이터는 크게 [ACK + DATA] 로 나뉘는데요. ACK는 1 byte, DATA는 대충 10-40 byte(상황에 따라 다름) 입니다. DATA는 패킷 앞뒤에 stx , etx 있구요. 로그를 보면 ACK까지는 잘 수신하는데, DATA를 수신하지 못해서 Retry 하더라구요. 보통 2번째 try에서는 수신하구요, 3번까지 try하는 경우는 딱 한 번 봤습니다.
속도는 57600 이고, 현재 1초에 한번씩 패킷을 송수신합니다.
전에 [타겟 보드] - [다른 보드]간에 RS485 com port테스트하는 프로그램을 간단히 만들어서(1234567890을 그대로 송수신해서 값이 제대로인지아닌지 ), 그때는 하루종일 돌려도 에러가 없던걸 확인했습니다.

그럼....좋은 하루 되시기 바랍니다.

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