linux qt 线程串口数据,转:QT多线程串口操作

多线程+串口读数据

[serial.cpp]

#include

#include

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication a(argc,argv);

MainWindow m;

a.setMainWidget(&m);

m.show();

return a.exec();

}

[mainwindow.h]

#ifndef MAIN_WINDOW_H

#define MAIN_WINDOW_H

#include

class QLabel;

class QPushButton;

class QLineEdit;

class QPixmap;

class SerialThread;

class MainWindow:public QMainWindow {

Q_OBJECT

public:

MainWindow(QWidget * parent = 0, const char * name= 0) ;

~MainWindow(){};

void setCounter(int no);

void setMsgText(char* txt);

public slots:

void serialOperate();

void loadJPEGFile();

protected:

void    paintEvent( QPaintEvent * );

private:

QLineEdit *msg;

QPushButton *btn;

QPushButton *btn2LoadImg;

QPixmap *pix;

QLabel *lab;

SerialThread *a;

int counter;

};

#endif

[mainwindow.cpp]

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "mainwindow.h"

#include "serialthread.h"

void MainWindow::paintEvent( QPaintEvent * )

{

QPainter paint( this );

paint.drawLine( 0,0,500,500 ); // draw line

paint.drawPixmap(0,0,*pix);

}

void MainWindow::loadJPEGFile(){

if(!pix->load("testjpeg")){

//if(!pix->load("circle")){

setMsgText("Load failed");

return;

}

setMsgText("Load success!");

update();

}

void MainWindow::setCounter(int no){

counter = no;

}

void MainWindow::serialOperate(){

a = new SerialThread(this);

a->start();

a->wait();

}

MainWindow::MainWindow(QWidget * parent , const char * name)

:QMainWindow(parent, name)

{

counter = 0;

QVBox *vbox;

vbox = new QVBox(this);

vbox->resize(300,150);

//msg = new QLabel("SERIAL PROGRAMMING",vbox);

msg = new QLineEdit("SERIAL PROGRAMMING",vbox);

msg->resize(300,50);

pix = new    QPixmap();

btn = new QPushButton(vbox);

btn->setText("GO!");

QApplication::connect(btn,SIGNAL(clicked()),this,SLOT(serialOperate()));

btn2LoadImg = new QPushButton(vbox);

btn2LoadImg->setText("LOAD");

lab = new QLabel("before load jpeg",vbox);

QApplication::connect(btn2LoadImg,SIGNAL(clicked()),this,SLOT(loadJPEGFile()));

//btn->resize(100,75);

//vbox->show();

};

void MainWindow::setMsgText(char* txt){

QString msgs(txt);

QString count = QString::number(counter,10);

msgs.append(count);

const     char *re = msgs.ascii ();

//strcat(msgs,);

msg->setText(re);

};\

[my_define.h]

#define BAUDRATE     B115200

#define BLOCK_SIZE     200

#define DEVICE         "/dev/ttyS0"

#define WAIT_TIME    5

#define CHANGE_LINE    0x0a

#define ACK_NUM    3

#ifndef TRUE

#define TRUE 1

#endif

#ifndef FALSE

#define FALSE -1

#endif

[serialthread.h]

#ifndef SERIAL_THREAD_H

#define  SERIAL_THREAD_H

#include

class MainWindow;

class SerialThread: public QThread {

public:

SerialThread(MainWindow *parent);

virtual void run();

private:

MainWindow *parent;

};

#endif

[serialthread.cpp]

#include

#include

#include

#include

#include

#include "my_define.h"

#include "serialthread.h"

#include "mainwindow.h"

int set_nc_mode(int fd)

{

struct termios options;

if  ( tcgetattr( fd,&options)  !=  0){

perror("SetupSerial 1");

return(FALSE);

} /* get current port settings */

bzero(&options, sizeof(options));

options.c_cflag |= BAUDRATE | CS8 | CLOCAL | CREAD;

options.c_cflag &= ~CRTSCTS;

options.c_iflag = IGNPAR;

options.c_oflag &=~OPOST;

//

options.c_lflag = 0;

options.c_cc[VTIME] = WAIT_TIME;

options.c_cc[VMIN] = BLOCK_SIZE;    /* blocking read until 5 chars received */

tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&options);

return(TRUE);

}

int set_c_mode(int fd)

{

struct termios options;

if  ( tcgetattr( fd,&options)  !=  0){

perror("SetupSerial 1");

return(FALSE);

}

bzero(&options, sizeof(options));

tcflush(fd, TCIOFLUSH);

cfsetispeed(&options, BAUDRATE);

cfsetospeed(&options, BAUDRATE);

options.c_cflag |=(CLOCAL|CREAD);

options.c_cflag &= ~CRTSCTS;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS8;

options.c_cflag &= ~PARENB;   /* Clear parity enable,clear control mode flag */

options.c_iflag &= ~INPCK;     /* Disable parity checking ,*/

options.c_cflag &= ~CSTOPB;

options.c_iflag |= IGNBRK;

options.c_lflag |= ICANON;

options.c_lflag &= ~(ECHO | ECHOE | ISIG);

options.c_oflag &= ~(OPOST);

tcflush(fd, TCIOFLUSH);

if (tcsetattr(fd,TCSANOW,&options) != 0){

perror("SetupSerial 3");

return (FALSE);

}

return(TRUE);

}

void send_ack(int fd)

{

char buf[]={'A','C','K',CHANGE_LINE};

write(fd,buf,sizeof(buf));

}

void resend(int fd)

{

char buf[]={'R','S','D',CHANGE_LINE};

write(fd,buf,sizeof(buf));

}

void delay(int i)

{

int j;

for (;i>0;i--)

for(j=0;j<65535;j++);

}

SerialThread::SerialThread(MainWindow *parent){

this->parent = parent;

}

void SerialThread::run()

{

int fd,c, res;

int block_num,last_block;

int i;

char buf[BLOCK_SIZE];

char file_name[32];

FILE *fp;

struct termios oldtio;

block_num=last_block=0;

fd = open(DEVICE, O_RDWR | O_NOCTTY );

parent->setCounter(fd);

parent->setMsgText("opend device fd::::::");

if (fd <0){

perror(DEVICE);

parent->setMsgText("open device failed");

//    exit(-1);

}

tcgetattr(fd,&oldtio);

set_nc_mode(fd);

printf("Changed to nc mode\n");

/*

res=read(fd,( char *)file_name,32);

parent->setCounter(res);

parent->setMsgText("res is ::::::");

*/

/*

if(res>0){

file_name[res-1]='\0';

printf("Received the file name:%s\n",file_name);

}

else

printf("The received file name is error.\n");

fp=fopen(file_name,"wb");

if(fp==NULL){

printf("Can not creat file %s!\n",file_name);

return;

//    exit(-1);

}

else

{

send_ack(fd);

printf("The file %s is created.\nWaitting for the block num and last block size\n",file_name);

}

//set_nc_mode(fd);

//printf("Changed to nc mode\n");

res=read(fd,buf,4);

printf("res=%d\n",res);

printf("Received the block num \n");

for(i=0,block_num=0;i<4;i++){

block_num=block_num*10+buf[i];

printf("buf[%d]=%x\n",i,buf[i]);

}

printf("The number of blocks is %d\n",block_num);

send_ack(fd);

res=read(fd,buf,3);

printf("res=%d\n",res);

printf("Received the last block size \n");

for(i=0,last_block=0;i<3;i++){

last_block=last_block*10+buf[i];

printf("buf[%d]=%x\n",i,buf[i]);

}

printf("The last block size is %d\n",last_block);

send_ack(fd);

printf("Starting receive blocks\n");

for(i=0;i

res=read(fd,buf,BLOCK_SIZE);

if(res!=BLOCK_SIZE){

printf("res=%d,\t Request resend the %d block\n",res,i);

i--;

tcflush(fd, TCIOFLUSH);

resend(fd);

}

else{

fwrite(buf,1,BLOCK_SIZE,fp);

printf("Received the %d block,    res=%d\n",i,res);

printf("Send ack signal complete,waiting to read\n");

send_ack(fd);

}

}

printf("start transporting the last block\n");

if(last_block>0){

send_ack(fd);

res=read(fd,buf,last_block);

printf("res=%d\n",res);

if(res!=last_block){

printf("Request resend the last block\n");

tcflush(fd, TCIOFLUSH);

resend(fd);

}

else

fwrite(buf,1,last_block,fp);

}

send_ack(fd);

printf("The file transports end\n");

fclose(fp);

printf("close the file\n");

tcsetattr(fd,TCSANOW,&oldtio);

close(fd);

printf("close the serial port\n");

*/

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值