시리얼 프로그래밍 방법에 대한 질문

은영신랑의 이미지

시리얼로 10개의 문자를 보내는 프로그램을 작성해 보았는데요,
우선 2개는 STARTBIT로 정해놓은 것이고 꼭 이 비트들을 우선 확인해야 합니다.그 뒤에는 쭉 받으면 되는데요,
read를 먼전 실행하면 버퍼에 data가 없기 때문에 블락킹이 되고, 그때는 한바이트씩 읽더라구요.
버퍼에 데이터가 있을때는 한번에 모두 읽지만요.
하나의 배열에 읽력받은 데이터를 정렬하려고 하려고 하다가
아래 방법을 생각해보았습니다.
동작은 잘 합니다. 하지만 그리 좋지많은 않은것 같아서 이렇게
소스 올려봅니다.
그리고 char 형이 아닌 구조체를 시리얼로 보낸다면 어떤 식으로들
보내시는지요?

수정, 보완, 조언 부탁드립니다.

do {
		read(fd, buf, 1);
		if(buf[0]==HEAD_1){
			data[0]=buf[0];
			read(fd, buf, 1);
			if(buf[0]==HEAD_2){
				data[1]=buf[0];
				break;
			}
		}
	}while(1);
	
	written=2;
	while(length){
		
		nBytes = read(fd, pbuf, length);
		if(nBytes <=0){
			printf("read error.\n");
			break;
		}
		length -= nBytes;
				
		for(i=0; i<nBytes; i++)
			data[written++] = pbuf[i];
	}
lovemyin의 이미지

우선 블락킹 모드로 하지 마시고 넌블락킹 모드로 하시고
새로운 read 함수를 구현해 보세요.

read(fd, buf, n, timeout) 이런 행태의 함수를 만드셔서...
(n=내가 받고 싶은 데이터 수)

처음에 2바이트를 받고싶으시면
read(fd, buf, 2, 3);
이런식으로 구현하심 3초 안에 2 바이트를 받을때까지는 계속 루프를 돌면서
데이터를 받는겁니다.

그리고 기본적으로 블락킹 모드로 짜셨다 하더라도 데이터를 무조건 한바이트씩만 읽지는 않을텐데요... 시리얼 통신에서 termios 세팅을 할때 받을 데이터를 1바이트로 하셨나보네요...

도움이 되었을런지는 잘 모르겠지만... 제가 보게엔 serial howto 문서를 먼저보시고 구현하심이 어떨런지 합니다..
그럼 즐프하세요

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

GENIUS의 이미지

시리얼 버퍼에서 데이터 읽어들이는 함수임.(스트링)

int readline(int fd,char *ptr,int maxlen){

int n,rc;
unsigned char c;

for(n=1;n< maxlen;n++){

if((rc=read(fd,&c,1))==1)
{
*ptr++=c;
}
else if(rc==0)
{
if(n==0)
return(0);
else
break;
}

}//for

*ptr='\0';

return (n);
}//

리턴값으로 데이터의 길이 와 외부 스트링 변수에 데이터 저장.

unsigned char buf[30];


bzero(buf,sizeof(buf));// init

if((n=readline(fd,buf,sizeof(buf)) > 0)
{

printf("%s",buf);
}

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

댓글 달기

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