Uart 통신간 read, write 문제

hyun119의 이미지

지금 Uart 통신을 하고 있는데 데이타를 주고 받는 중에 실시간으로 받고 실시간으로 보내야하는데 어떻게 짜야 할지 모르겠습니다.
현재 Uart를 Open으로 열어서 Tx는 write로 Rx는 read로 하고 있습니다.
문제는 Tx는 무한 루프를 돌려고 데이타가 있을 때만 보낼 수 있겠는데
Rx는 무한 루프를 돌리면 데이타가 없을 때는 계속해서 그쪽에 멈춰 있는 겁니다.
그래서 다시 Tx로 돌아가지 못하고 데이타가 있을 때까지 기다리다가 받고 무한 루프니깐
다시 또 데이타를 기다리는 형식으로 밖에 안됩니다.
혹시 Rx를 할 때 데이타가 없으면 다시 Tx로 가고 Tx 데이타가 없으면 Rx로 가는 이런 무한 루프를
돌릴 방법이 없는 것입니까?
read에서 데이타가 없는 것을 검출 할 수 있는 방법이 있습니까?
도와주십시오.

익명 사용자의 이미지

1) nonblocking mode라는 것이 있습니다.

특성은, read기준으로 설명하면,
- 데이터가 있거나, 없거나 즉시 리턴한다.
- 당연히 데이터가 있을 경우 읽고서 그 길이를 (바이트 수) 리턴한다.(실데이터야 버퍼에 넣어서 주고....)
- 데이터가 없다면, -1을 리턴한다. (**** 중요, 리턴값에 아주 유의해야 한다.)

non-blocking모드로 세팅해서 read하면 되겠습니다.

방법은 fcntl(), non blocking 으로 검색하면 많은 예제가 나오리라고 봅니다.

** 주의: blocking모드와 non-blocking모드는 리턴값의 의미가 다소 상이하므로 모드에 따른 리턴값 체크를 잘~ 해야할것이다.

2) 방법 2
읽을 데이터가 있는지 검사하고 있다면, read()를 호출
쓸수 있는 상태(운영체제 디바이스 드라이버의 출력버퍼가 비어졌다면...)를 검사하고, 쓸 수 있다면, write()를 호출

이렇게 할 수 있는데, 이러한 읽기, 쓰기등의 상태를 검사해 보고 실제 IO를 행할 수 있겠지요.
검사하는 시스템호출로 select()를 사용할 수 있습니다. (참고로, select말고도, poll, epoll등이 리눅스에서는 가능합니다, 운영체제별로 다소 차이가 있을 수 있으나, select와 poll은 모든 *nix 운영체제에서 지원됩니다.)

3) 방법 3
멀티쓰레드 또는 멀티 프로세스로 프로그래밍한다.

당연히 읽기만 열심히, 쓰기만 열심히 하면 됩니다.
어려운 점은 두 프로세스/쓰레드간에 자료의 교환 및 동기화 메카니즘이 좀 걸리지요.

---- 즐~

hyun119의 이미지

3가지의 방법이나 적어주셔서 정말로 감사합니다
방법 3은 생각 안해 본건 아니지만 쓰레드를 써본적이 1~2번이라서 왠만해서는 피할라고 했거든요
그래도 2가지 방법이 더 있으니 열심히 해보겠습니다.
답변 진심으로 감사드립니다. 즐거운 추석 보내십시오.

hyun119의 이미지

3가지의 방법이나 적어주셔서 정말로 감사합니다
방법 3은 생각 안해 본건 아니지만 쓰레드를 써본적이 1~2번이라서 왠만해서는 피할라고 했거든요
그래도 2가지 방법이 더 있으니 열심히 해보겠습니다.
답변 진심으로 감사드립니다. 즐거운 추석 보내십시오.

댓글 달기

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