SW 개발

QT / 예제소스 / 간단소스 / QT3 기반 시리얼 제어 프로그램

. . . 2011. 4. 25. 11:37
반응형

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를 확인한후 적절한 분기를 한다.

예제소스코드 압축..

ucos_ctrl_qt.tar.gz

반응형