반응형
QT3 기반 시리얼 제어
일반적으로 QT 에서 시리얼을 제어하는것은 일반 Unix 에서의 코드와 비슷하다.
단 처리방식의 문제인데..
block 형태로 열어놓고, 해당 receive 때마다 메인 폼으로 커스텀 이벤트를 쏴주고, 해당 메인폼에서는 그 이벤트를 적당히 처리해주면된다. 이 개념은 windows 에서의 MFC와 유사한데.. 그에 맞춰서 시리얼 클래스를 따로 만들어서 코딩하였다.
(단, 이때... 코딩을 막 시작한때 작성한 코드라.. 개판오분전입니다. 그냥 참고만 하시면 감사하겠습니다.
serialapp.h
#ifndef _SERIAL_APP_H
#define _SERIAL_APP_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <qthread.h>
#include <qevent.h>
#include <qapplication.h>
int serial_fd;
char char_buf;
char cmd_buf[128];
int i=0;
/*
* ======================================================================
* ======================================================================
*/
class Serial_App : public QThread
{
int auto_flag;
private:
QObject * owner;
public:
Serial_App(QObject*);
~Serial_App();
int Serial_Write(const char * string);
void auto_mode_start() { auto_flag = 1;}
void auto_mode_end(){ auto_flag = 0; }
virtual void run();
// void test();
};
Serial_App::~Serial_App()
{
printf("app end\n");
close(serial_fd);
}
Serial_App::Serial_App(QObject *parent=0)
{
owner = parent;
//======= flag init ==========//
auto_flag=0;
printf("app init\n");
struct termios newtio;
serial_fd = open( "/dev/tts/1", O_RDWR | O_NOCTTY );
printf("serial fd is [%d]\n",serial_fd);
// memset( &newtio, 0, sizeof(newtio) );
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = B57600;
newtio.c_cflag |= CS8;
newtio.c_cflag |= CLOCAL;
newtio.c_cflag |= CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;
tcflush (serial_fd, TCIFLUSH );
tcsetattr(serial_fd, TCSANOW, &newtio );
char * s_uart_init = "uart2 init complete!!!\n";
write(serial_fd, s_uart_init ,strlen(s_uart_init));
}
int Serial_App::Serial_Write(const char * string)
{
printf("this is Serial_Write function\n");
return write(serial_fd,string,strlen(string));
}
void Serial_App::run()
{
printf("thread init!!! ==================\n");
while(1)
{
while(1)
{
read(serial_fd,&char_buf,1);
printf("uart1 receive char is ====> [%c]\n",char_buf);
if(char_buf==13) // \r
{
cmd_buf[i]='\0';
i=0;
break;
}
cmd_buf[i++]=char_buf;
}
printf("input cmd is [%s]\n",cmd_buf);
if(!strcmp(cmd_buf,"in"))
{
QCustomEvent * event1 = new QCustomEvent(1001);
QApplication::postEvent( owner, event1);
if(auto_flag)
write(serial_fd,"on\n",3);
}
else if (!strcmp(cmd_buf,"out"))
{
QCustomEvent * event2 = new QCustomEvent(1002);
QApplication::postEvent( owner, event2);
if(auto_flag)
write(serial_fd,"off\n",4);
}
}
}
#endif
위에서 보면 QThread 클래스를 상속받아서 쓰래드를 생성한후 쓰고있다.
개념은 MFC와 비슷하다!!!
실제 구현부...(메인폼)
#include "serial_app.h"
#include <qprocess.h>
#define QT_THREAD_SUPPORT 1
Serial_App* serial;
QStringList commandAndParameters;
QProcess myProcess ;
....
void main_form::customEvent(QCustomEvent* e)
{
if(e->type() == 1001)
{
M_Label1->setPaletteBackgroundColor(red);
printf("event receive!!\n");
}
if(e->type() == 1002)
{
M_Label1->setPaletteBackgroundColor(white);
printf("event receive!!\n");
}
}
간단히 커스텀 이벤트로 정의하고... 해당 커스텀 이벤트의 id를 확인한후 적절한 분기를 한다.
예제소스코드 압축..
반응형