질문있습니다...소스 올려요....제발 답변 좀 부탁드립니다....
간단한 시리얼 통신 프로그램입니다...
리눅스에서 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넣지 않는 방법으로요.....ㅜ.ㅜ
부탁드립니다.
sscanf(buf, "%d",&num);로 해보시지요.
sscanf(buf, "%d",&num);
로 해보시지요.
저는 뭐 프로그래밍은 모르는데 제목중에[quote]....제발 답변
저는 뭐 프로그래밍은 모르는데 제목중에
라는 부분이 있으면 답변이 잘 달릴까 하는 의문이 드네요
딴지 아닙니다. =3
http://kkanari.egloos.com/
Re: 질문있습니다...소스 올려요....제발 답변 좀 부탁드립니다.
아~ 잘못했다.....[quote][color=red]//scan
아~ 잘못했다.....
또한, sscanf()등을 사용할 수 있습니다.그러나, 중요한것은
또한, sscanf()등을 사용할 수 있습니다.
그러나, 중요한것은 read()에서 항상 내가 읽고자 하는 크기만큼 읽혀주지 않는 다는 문제가 있으니, read()의 리턴값을 검사해서, 덜 읽었으면 마저 읽는 루틴을 만들어서 사용해야 합니다.
readn()이란 이름으로 보통 많이 만들어 씁니다. 검색해도 제법나오겠군요.
ㅋㅋㅋㅋㅋㅋ까나리님....답변 3 보고기뻐서 봤는데.....ㅡ,.
ㅋㅋㅋㅋㅋㅋ
까나리님....답변 3 보고
기뻐서 봤는데.....ㅡ,.ㅡ;;;
잘 달리길 바라는 거죠
ㅋㅋㅋㅋㅋㅋ
아...그리고 바로 위에 님....
scanf 안쓰고 num = atoi(buf);
이걸로 했는데요....
송신 프로그램을 한번 실행 하면 됩니다....
근데요 minicom에서 엔터를 쳐야
데이터가 화면에 뜹니다.....ㅜ.ㅜ
minicom을 raw mode로 바꿔서 돌리세요.*수신측에서 rea
minicom을 raw mode로 바꿔서 돌리세요.
*수신측에서 read()의 리턴값을 보고 받은 데이터 수를 잘 계산해서, 버퍼 포인터 조정하는것 잊지말고요.
게시판 공지를 보세요. http://bbs.kldp.org/viewtop
게시판 공지를 보세요. http://bbs.kldp.org/viewtopic.php?t=19100
게시물의 내용보다 제목만 대충 읽는 사람이 많습니다. 제목을 보고, 그 주제에 흥미있는 분들이 답을 달죠.
문제가 발생한 주제와 문제점을 간단히 요약해서 제목으로 하시는게, 빠른 답변을 받는 지름길이라고 생각합니다.
----
아발발다빠따반반나다발딸발발다빠따따맣밤밤따받따발발다따밝다발발다빠따따밤반다빠따다맣밥발
발다따밥다발발다따박다발발다빠따따밞밭밭다따다맣아희
아...네~~^^좋은 충고 감사드립니다~ㅋㅋ
아...네~~^^
좋은 충고 감사드립니다~ㅋㅋ
댓글 달기