시리얼 프로그래밍 방법에 대한 질문
글쓴이: 은영신랑 / 작성시간: 화, 2004/08/10 - 6:06오후
시리얼로 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]; }
Forums:
저라면...
우선 블락킹 모드로 하지 마시고 넌블락킹 모드로 하시고
새로운 read 함수를 구현해 보세요.
read(fd, buf, n, timeout) 이런 행태의 함수를 만드셔서...
(n=내가 받고 싶은 데이터 수)
처음에 2바이트를 받고싶으시면
read(fd, buf, 2, 3);
이런식으로 구현하심 3초 안에 2 바이트를 받을때까지는 계속 루프를 돌면서
데이터를 받는겁니다.
그리고 기본적으로 블락킹 모드로 짜셨다 하더라도 데이터를 무조건 한바이트씩만 읽지는 않을텐데요... 시리얼 통신에서 termios 세팅을 할때 받을 데이터를 1바이트로 하셨나보네요...
도움이 되었을런지는 잘 모르겠지만... 제가 보게엔 serial howto 문서를 먼저보시고 구현하심이 어떨런지 합니다..
그럼 즐프하세요
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
시리얼 통신 ,제가 프로그램할때 쓰는 루틴 입니다. 참고 하세요
시리얼 버퍼에서 데이터 읽어들이는 함수임.(스트링)
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 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
댓글 달기