질문있습니다...소스 올려요....제발 답변 좀 부탁드립니다....

leo~~~~의 이미지

간단한 시리얼 통신 프로그램입니다...

리눅스에서 Qt써서 했구요...

Qt부분은 많지 않습니다...

Qt부분은 송신 프로그램에서 아래에서는 "140"

이라는 문자열을 보내면 수신 프로그램에서

"140"이라는 문자열을 int형의 num에 scanf로 받아서

저장하고 좌표 10, 20, num(140), 20의 선을 그리는건데요...

수신 프로그램은 PDA에 전송해서 minicom을 이용해

PDA화면에 창을 띄워 놓구요.....

그리고 다른 리눅스 터미널을 실행 시켜서

송신프로그램을 실행 시키면 그 데이터가

시리얼을 통해서 PDA로 전송해서 창에 선을 그리는 것입니다...

근데요...송신 프로그램을 실행시키면 minicom화면에만

140이라는 숫자가 찍힙니다....송신프로그램을 두번 실행 시키고

minicom화면에는 140140이 찍히고 그떄 엔터키를 쳐야

PDA 화면의 창에 선을 그리더군요......

그리고 송신프로그램에서 140뒤에 \n을 넣어주면

minicom에서 엔터를 안쳐도 되기는 하지만

송신프로그램을 두번 실행 해야 선을 그립니다.....

아....정말 이거때문에.....3일째.....ㅡ,.ㅡ;;;

도와주세요......

====================수신 프로그램====================

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <qapplication.h>
#include <qpainter.h>

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttySA0"
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

class mywid:public QWidget
{
public:
mywid();
private:
void paintEvent(QPaintEvent*);
};

mywid::mywid()
{
setCaption("hi");
}

void mywid::paintEvent(QPaintEvent*)
{
QPainter p(this);

int fd, res, num=0, len=0;
struct termios oldtio, newtio;
char buf[5];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
if(fd<0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd, &oldtio);
bzero(&newtio, sizeof(newtio));

newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD | CRTSCTS;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;

while(STOP==FALSE) {
res = read(fd,buf,5);
buf[res] = 0;
scanf("%d",&num);
p.drawLine(10, 20, num, 20);
if(buf[0]=='z') STOP==TRUE;

tcsetattr(fd, TCSANOW, &oldtio);
}
}

int main(int argc, char **argv)
{
QApplication app(argc, argv);
mywid mw;

app.setMainWidget(&mw);
mw.show();

return app.exec();
}

==============송신 프로그램=============================

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
int fd, res;
struct termios oldtio, newtio;
char buf[5];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
if(fd<0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd, &oldtio);
bzero(&newtio, sizeof(newtio));

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;;
newtio.c_oflag = 0;
newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;

tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);

strcpy(buf, "140");
res = write(fd, buf, (int) strlen(buf));
buf[res] = 0;
printf(":%s :%d\n", buf, res);

tcsetattr(fd,TCSANOW,&oldtio);

}

어떻게 하면 송신프로그램을 한번 실행하면
바로 데이터가 뜨게 할수 있나요.....
가능하다면 \n이나 \r넣지 않는 방법으로요.....ㅜ.ㅜ
부탁드립니다.

doldori의 이미지

sscanf(buf, "%d",&num);

로 해보시지요.

까나리의 이미지

저는 뭐 프로그래밍은 모르는데 제목중에

Quote:
....제발 답변 좀 부탁드립니다....

라는 부분이 있으면 답변이 잘 달릴까 하는 의문이 드네요

딴지 아닙니다. =3

익명 사용자의 이미지

leo~~~~ wrote:

while(STOP==FALSE) {
res = read(fd,buf,5);
buf[res] = 0;
scanf("%d",&num);
p.drawLine(10, 20, num, 20);
if(buf[0]=='z') STOP==TRUE;

tcsetattr(fd, TCSANOW, &oldtio);
}

leo~~~~ wrote:

while(STOP==FALSE) {
res = read(fd,buf,5);
buf[res] = 0;
//scanf("%d",&num); // 이건 tty가 아닌 로컬에서 문자를 읽는법
// 구지 이를 쓰려면, close(), dup()을 사용해서 할 수 있습니다만.
num = atoi(buf); // buf에 숫자가 아닌 값이 오는 경우를 처리하세요.
p.drawLine(10, 20, num, 20);
if(buf[0]=='z') STOP==TRUE;

tcsetattr(fd, TCSANOW, &oldtio);
}

익명 사용자의 이미지

아~ 잘못했다.....

Quote:

//scanf("%d",&num); // 이건 tty가 아닌 로컬에서 문자를 읽는법
// 구지 이를 쓰려면, close(), dup()을 사용해서 할 수 있습니다만.
num = atoi(buf); // buf에 숫자가 아닌 값이 오는 경우를 처리하세요.
익명 사용자의 이미지

또한, sscanf()등을 사용할 수 있습니다.

그러나, 중요한것은 read()에서 항상 내가 읽고자 하는 크기만큼 읽혀주지 않는 다는 문제가 있으니, read()의 리턴값을 검사해서, 덜 읽었으면 마저 읽는 루틴을 만들어서 사용해야 합니다.
readn()이란 이름으로 보통 많이 만들어 씁니다. 검색해도 제법나오겠군요.

leo~~~~의 이미지

ㅋㅋㅋㅋㅋㅋ
까나리님....답변 3 보고
기뻐서 봤는데.....ㅡ,.ㅡ;;;
잘 달리길 바라는 거죠
ㅋㅋㅋㅋㅋㅋ
아...그리고 바로 위에 님....
scanf 안쓰고 num = atoi(buf);
이걸로 했는데요....
송신 프로그램을 한번 실행 하면 됩니다....
근데요 minicom에서 엔터를 쳐야
데이터가 화면에 뜹니다.....ㅜ.ㅜ

익명 사용자의 이미지

minicom을 raw mode로 바꿔서 돌리세요.
*수신측에서 read()의 리턴값을 보고 받은 데이터 수를 잘 계산해서, 버퍼 포인터 조정하는것 잊지말고요.

아빠곰의 이미지

게시판 공지를 보세요. http://bbs.kldp.org/viewtopic.php?t=19100

게시물의 내용보다 제목만 대충 읽는 사람이 많습니다. 제목을 보고, 그 주제에 흥미있는 분들이 답을 달죠.

문제가 발생한 주제와 문제점을 간단히 요약해서 제목으로 하시는게, 빠른 답변을 받는 지름길이라고 생각합니다.

----
아발발다빠따반반나다발딸발발다빠따따맣밤밤따받따발발다따밝다발발다빠따따밤반다빠따다맣밥발
발다따밥다발발다따박다발발다빠따따밞밭밭다따다맣아희

leo~~~~의 이미지

아...네~~^^
좋은 충고 감사드립니다~ㅋㅋ

댓글 달기

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