간단한 프로그램 질문이요...소스도 함께 올렸습니다....답변 꼭
우선 소스부터요.....Qt를 이용한 시리얼 통신 프로그램인데요..
프로그램이라고 할수도 없지만....^^;
====================송신 프로그램====================
#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, "hihihi");
res = write(fd, buf, (int) strlen(buf));
buf[res] = 0;
printf(":%s :%d\n", buf, res);
tcsetattr(fd,TCSANOW,&oldtio);
}
============수신 프로그램===================
#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;
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 = OPOST | ONLCR;
newtio.c_lflag = ICANON | ECHO;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 5;
while(STOP==FALSE) {
res = read(fd,buf,5);
buf[res] = 0;
p.drawText(10,10,buf);
printf(":%s:%d\n", buf, res);
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();
}
여기저기서 막 보고해서 했습니다.....
제가 원하는게 minicom으로 수신프로그램을 실행해서
PDA에 위젯을 하나띄워놓고
다른 리눅스 터미널에서 송신프로그램을 시키면
송신프로그램에 의해서 전송된 데이터가
PDA의 위젯에 나타나게 하는것...!!!!
근데요..제가 쫌더 괜찮게 만들어 보려고
쪼끔 어떤 부분을 바꿨는데요....
그리고 나서 병원을 갔다왔는데......치료받는게 너무 아팠는지....
어떤 부분을 고쳤는지 기억이 안나요....난감하네요...ㅡ,.ㅡ;;
머가 문제냐면요
처음에 고치기 전에는 송신프로그램을 리눅스에서 실행하면
바로 그데이터가 PDA의 위젯에 떴거든요.....
근데 어딘가를 바꾸고 나서는 바로안뜨고
minicom 화면에 전송된데이터가 나오고 minicom에서
엔터를 쳐야 PDA의 위젯 화면에 뜨더라구요....
아....내가 한것도 모르니......ㅜ.ㅜ
제가 했으니..정말 간단한 소스니까요...
어느부분을 고쳐야 송신프로그램 실행하면
바로 정송된 데이터가 PDA화면의 위젯에
뜰수 있게 하는지 알려주세요....ㅜ.ㅜ
flag부분 아니면 수신 프로그램의while(STOP==FALSE)
flag부분 아니면 수신 프로그램의
while(STOP==FALSE) {
res = read(fd,buf,5);
buf[res] = 0;
p.drawText(10,10,buf);
printf(":%s:%d\n", buf, res);
if(buf[0]=='z') STOP==TRUE;
}
이 부분이 잘못된거 같은데요....
다 고쳐가면서 해봤는데 안되요....ㅜ.ㅜ
[quote]minicom 화면에 전송된데이터가 나오고 minicom에서
만일 위와 같다면, raw mode 와 cooked모드의 차이입니다.
raw mode로 변경하도록 코딩하세요.
non-canonical 모드로 하라는 말씀이시죠?그렇게 했는데도 안
non-canonical 모드로 하라는 말씀이시죠?
그렇게 했는데도 안되네요....ㅜ.ㅜ
댓글 달기