시리얼 프로그래밍 에서...

jaeoya의 이미지

시리얼 프로그램을 짜다가 문제가 생겨서 이렇게 글을 올려보네요..
프로그램 도중에 0x0D 라는 문자가 와야 그동안 버퍼에 쌓여있던 것을 읽어올수 있던데. minicom 이라는 프로그램은 0x0D 라는 문자 없이도 버퍼에 있던것을 그냥 읽어오던데.. 이렇게 종료문자가 없어도 수신이 된 데이터를 읽어오는 방법이 없나요... 제가 했던 소스를 올려드립니다.

int main()
{
int serial,result;
fd_set readfs,testfs;
int port=com1;
int size, i, num=0;
char *data="Hello\n";
char ch[20];
unsigned char Buffer[10];
unsigned char Buffer2[10];
struct timeval Timeout; // 블럭킹 모드에서 대기시간 설정
Timeout.tv_usec = 0;
Timeout.tv_sec = 1;
bzero(Buffer,10);
bzero(Buffer2,10);

if((serial=serial_init(port, 4800))<0){
printf("serial port %d set error...\n",port);
return;
}
size = strlen(data);
printf("data:%s\n",data);
printf("Buffer : %02x %02x %02x %02x %02x\n",Buffer[0],Buffer[1],Buffer[2],Buffer[3],Buffer[4]);

Buffer2[0] = 0xFE;
Buffer2[1] = 0x03;
Buffer2[2] = 0x34;
Buffer2[3] = 0x07;
Buffer2[4] =0xCE;
Buffer2[5] = '\0';

while(1) {
serial_send(serial,Buffer2,strlen(Buffer2));
printf("send buffer..\n");
printf("Buffer2 : %x %x %x %x %x\n",Buffer2[0],Buffer2[1],Buffer2[2],Buffer2[3],Buffer2[4]);
while(1){
FD_ZERO(&readfs);
FD_SET(serial,&readfs);
Timeout.tv_usec = 0;
Timeout.tv_sec = 1;

result = select(32,&readfs,NULL,NULL,&Timeout);

if(FD_ISSET(serial,&readfs)){ //-> 이부분에서 문자가 있지만 종료문자가 없어서 데이터를 읽어오지 않음...

serial_read(serial,Buffer,10);
printf("Buffer : %x %x %x %x %x\n",Buffer[0],Buffer[1],Buffer[2],Buffer[3],Buffer[4]);
usleep(100);
bzero(Buffer,10);

}
else {
printf("no rx..\n");
}

}/* while end */
}

printf("END TEST PROG\n");
close(serial);
}

이상이구요... 좀 답변을 부탁드립니다.
혹시 minicom 에 대한 소스가 있으시면 보내주셔도 감사하겠습니다.

mach의 이미지

serial_send(); 
serial_read();

이 부분의 코드를 올려주세요.

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

jaeoya의 이미지

serial_send() 는 write() 함수를 그대로 사용한거구요.
serial_read() 역시 read() 함수를 그대로 사용한거에요..

mooore의 이미지

시리얼 포트를 통해서 입력받는 방법에는 모드가 있는 걸로 알고 있습니다.
serial_init()에서 어떤 모드로 받는지 모르겠지만 아래 문서를 참조하세요.

http://doc.kldp.org/wiki.php/LinuxdocSgml/Serial-Programming-HOWTO

별은 바라보는 자에게 빛을 준다.

jaeoya의 이미지

여러가지 모드를 사용해봤는데..제가 원하는 데로는 잘되지 않네요..
혹시 문자단위로 수신하는 방법을 알고 계신지.요.....

mooore의 이미지

말씀드린 HOWTO의 non-canonical 입력 예제로 테스트해보셨나요?
그 부분이 문자 단위로 입력받을 수 있는 예제인걸로 알고 있습니다.
우선 테스트해보시구요.

select를 사용하신 특별한 이유가 있나요?
멀티입력일때 select를 사용할 수 있지만 지금의 경우에는 select가 필요없을 듯 보입니다만.

FD_ISSET 부분에 있는 usleep()을 사용하신다는게 문제가 될 수도 있지 않을까요?
문자단위로 처리할 때, 즉 non-canonical 모드일때에는 read()가 return되는 시간을 설정할 수 있습니다. 그런데 usleep() 함수가 사용된다면 그런 부분을 주의하셔야 할 듯 한데요?

별은 바라보는 자에게 빛을 준다.

댓글 달기

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