主题 : 有没有人做过qtopia2.2的串口编程 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 16209
精华: 0
发帖: 70
金钱: 350 两
威望: 70 点
综合积分: 140 分
注册时间: 2010-03-15
最后登录: 2010-10-25
楼主  发表于: 2010-03-18 16:22

 有没有人做过qtopia2.2的串口编程

       最近参照eddylau大神的例子学习。感觉有了一定的进步,能编写一些简单的qt程序了。

现在想通过eddyLau大神的模板编写一个qt上的串口通讯程序,实现简单的串口读写功能。我看了一些

关于QT串口编程的程序,发现很多都不是基于designer来规划程序的,现在我想通过Qt的designer来编写,并且

采用大家认为可取的多线程方式通讯。现在的问题是贴程序的人很多,但是贴的很乱,程序都没有解释,对于菜鸟

来说看的也乱,我想知道其中的读写串口的原理,如果有高人编写过这样的程序,请提供相关的思路。如果有例子那就

更好了。
  
  
级别: 新手上路
UID: 12882
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2010-01-15
最后登录: 2010-11-04
1楼  发表于: 2010-03-19 08:11
Qt没有串口对应的类,只能通过调用系统API的方式实现。Linux和windows有不同的方法。不知道你用那个系统
级别: 侠客
UID: 16209
精华: 0
发帖: 70
金钱: 350 两
威望: 70 点
综合积分: 140 分
注册时间: 2010-03-15
最后登录: 2010-10-25
2楼  发表于: 2010-03-19 10:09
我用的是linux系统    编好后要下载到arm板上去的
级别: 新手上路
UID: 16384
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-03-17
最后登录: 2011-03-01
3楼  发表于: 2010-03-19 21:56
不知楼上的,做的怎么样了?我想做串口编程啊!我还不知道怎么做呢,程序都调几天了,就是收不到数据!
级别: 新手上路
UID: 12882
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2010-01-15
最后登录: 2010-11-04
4楼  发表于: 2010-03-19 22:24
一个在linux下的串口程序例子    用于mini2440与周立功非接触式ic卡模块的通信

头文件
#include <QThread>

#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>


class Cardreader : public QThread
{
    Q_OBJECT

public:
    Cardreader();
    int fd_port;
    int open_port(int comport);
    int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);
    int initcardreader(int fd_port);
    unsigned int checkcard(int fd_port);
    unsigned int readcardid (int fd_port);
    int beep(int fd_port);
    void autorun(void);
    void sendmessage(int data);




signals:
    void message(QString);

protected:


private:


};
级别: 新手上路
UID: 12882
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2010-01-15
最后登录: 2010-11-04
5楼  发表于: 2010-03-19 22:25
cpp文件

#include "cardreader.h"

Cardreader::Cardreader()
{

}

int Cardreader::open_port(int comport)
{
        /* 打开端口 成功返回文件描述符 失败返回0*/
        /*open COM Port*/
        /* comport=1 open COM1 comport=2 open COM2 comport=3 open COM3*/
        //char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
        long  vdisable;
        int fd;
        if (comport==1)
        {    fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
                if (0 == fd)
                {
                    emit message("Open port error 1");

                        return(0);
               }
        }
        else if(comport==2)
        {    fd = open( "/dev/ttySAC1", O_RDWR|O_NOCTTY|O_NDELAY);
                if (0 == fd)
            {
                     emit message("Open port error 1");
                        return(0);
                    }
        }
        else if (comport==3)
        {
                fd = open( "/dev/ttySAC2", O_RDWR|O_NOCTTY|O_NDELAY);
                if (0 == fd)
                {
                     emit message("Open port error 1");
                        return(0);
                    }
        }
        if(fcntl(fd, F_SETFL, 0)<0)
        {
             emit message("Open port error 2");
                return(0);
            }
        if(isatty(STDIN_FILENO)==0)
        {
             emit message("Open port error 3");
           // return(0);
        }

        return fd;
}

int Cardreader::set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
        /* 端口设置,成功返回1,失败返回0 */
        /*set patmeter of COM port*/
        /*fd:file descript of COM port
        nSpeed:baut rate
        nBits:unmber of data bits
        nEven:PARE mode O:odd E:even N:none
        nStop:stop bits*/

        struct termios newtio,oldtio;
        if  ( tcgetattr( fd,&oldtio)  !=  0)
                return 0;

        bzero( &newtio, sizeof( newtio ) );
        newtio.c_cflag  |=  CLOCAL | CREAD;
        newtio.c_cflag &= ~CSIZE;

        switch( nBits )
        {
        case 7:
                newtio.c_cflag |= CS7;//7 bits data
                break;
        case 8:
                newtio.c_cflag |= CS8;//8 bits data
                break;
        }

        switch( nEvent )
        {
        case 'O'://odd
                newtio.c_cflag |= PARENB;
                newtio.c_cflag |= PARODD;
                newtio.c_iflag |= (INPCK | ISTRIP);
                break;
        case 'E': //even
                newtio.c_iflag |= (INPCK | ISTRIP);
                newtio.c_cflag |= PARENB;
                newtio.c_cflag &= ~PARODD;
                break;
        case 'N': //none
                newtio.c_cflag &= ~PARENB;
                break;
        }

switch( nSpeed )
        {
        case 2400:
                cfsetispeed(&newtio, B2400);
                cfsetospeed(&newtio, B2400);
                break;
        case 4800:
                cfsetispeed(&newtio, B4800);
                cfsetospeed(&newtio, B4800);
                break;
        case 91000:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        case 571000:
                cfsetispeed(&newtio, B57600);
                cfsetospeed(&newtio, B57600);
                break;
        case 115200:
                cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                break;
        default:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        }
        if( nStop == 1 )
                newtio.c_cflag &=  ~CSTOPB;
        else if ( nStop == 2 )
        newtio.c_cflag |=  CSTOPB;
        newtio.c_cc[VTIME]  = 0;
        newtio.c_cc[VMIN] = 0;
        tcflush(fd,TCIFLUSH);
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)
                return 0;

        return 1;
}

int Cardreader::initcardreader(int fd_port)
{
        /* 读卡器初始化,成功返回1,失败返回0 */
        unsigned char buffer[32];
        int readnum;
        unsigned int timer;

        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0

        //发送开始符 0x20
        buffer[0]=0x20;
        write(fd_port,buffer,1);

        //等待0x06回应 否则出错退出
        usleep(40*1000);//等待40ms
        timer=0;
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x06)
                return 0;


        //发送 0x00 0x52 0x00 0xad 0x03
        //usleep(40*1000);//等待40ms
        buffer[0]=0x00;buffer[1]=0x52;buffer[2]=0x00;buffer[3]=0xad;buffer[4]=0x03;
        write(fd_port,buffer,5);

        //等待0x20回应 否则出错退出
        usleep(40*1000);//等待50ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1500)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x20)
                return 0;

        //发送0x06
        buffer[0]=0x06;
        write(fd_port,buffer,1);

        //等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);

        if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
                return 0;

        //发送开始符 0x20
        buffer[0]=0x20;
        write(fd_port,buffer,1);

        //等待0x06回应 否则出错退出
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x06)
                return 0;

        //发送 00 4c 08 00 00 ff ff ff ff ff ff bb 03
        buffer[0]=0x00;buffer[1]=0x4c;buffer[2]=0x08;buffer[3]=0x00;buffer[4]=0x00;buffer[5]=0xff;buffer[6]=0xff;
        buffer[7]=0xff;buffer[8]=0xff;buffer[9]=0xff;buffer[10]=0xff;buffer[11]=0xbb;buffer[12]=0x03;
        write(fd_port,buffer,13);

        //等待0x20回应 否则出错退出
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x20)
                return 0;

        //发送0x06
        buffer[0]=0x06;
        write(fd_port,buffer,1);

        //等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);

        if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
                return 0;
        return 1;
}

unsigned int Cardreader::checkcard(int fd_port)
{
        /* 检查天线范围内有无卡,有返回1,无或失败返回0 */
        unsigned char buffer[32];
        int readnum;
        unsigned int timer;

        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0

        //发送开始符 0x20
        buffer[0]=0x20;
        write(fd_port,buffer,1);

        //等待0x06回应 否则出错退出
        usleep(40*1000);//等待40ms
        timer=0;
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                { //emit message("card found error 1");
                        return 0;
                    }
        } while (readnum==0);
        if (buffer[0]!=0x06)
        {
            emit message("card found error 2");
                return 0;
            }

        //发送 00 41 01 01 be 03
        buffer[0]=0x00;buffer[1]=0x41;buffer[2]=0x01;buffer[3]=0x01;buffer[4]=0xbe;buffer[5]=0x03;
        write(fd_port,buffer,6);

        //等待0x20回应 否则出错退出
        usleep(40*1000);//等待50ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x20)
        {
            emit message("card found error 3");
                return 0;
            }
        //发送0x06
        buffer[0]=0x06;
        write(fd_port,buffer,1);

        //等待0x00 0x00 0x02 0x04 0x00 0xf9 0x03回应
        usleep(50*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                {
                    emit message("card found error 4");
                        return 0;
                    }
        } while (readnum==0);

        if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x02)||(buffer[3]!=0x04)||(buffer[4]!=0x00)||(buffer[5]!=0xf9)||(buffer[6]!=0x03))
        {
            //emit message("card found error 5");
            return 0;
        }
        return 1;

}

unsigned int Cardreader::readcardid (int fd_port)
{
        /* 读取卡id号码,成功返回32位整数,无或失败返回0 */
        unsigned char buffer[32];
        int readnum;
        unsigned int timer;
        unsigned int result;

        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0

        //发送开始符 0x20
        buffer[0]=0x20;
        write(fd_port,buffer,1);

        //等待0x06回应 否则出错退出
        usleep(40*1000);//等待40ms
        timer=0;
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x06)
                return 0;

        //发送 00 71 02 00 00 8c 03
        buffer[0]=0x00;buffer[1]=0x71;buffer[2]=0x02;buffer[3]=0x00;buffer[4]=0x00;buffer[5]=0x8c;buffer[6]=0x03;
        write(fd_port,buffer,7);

        //等待0x20回应 否则出错退出
        usleep(40*1000);//等待50ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x20)
                return 0;

        //发送0x06
        buffer[0]=0x06;
        write(fd_port,buffer,1);

        //等待0x00 0x00 0x04 0x04 .... 0x03回应
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);

        if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x04)||(buffer[8]!=0x03))
                return 0;
        result=0;
        result=buffer[3];
        result+=buffer[4]<<8;
        result+=buffer[5]<<16;
        result+=buffer[6]<<24;
        return result;
}

int Cardreader::beep(int fd_port)
{
        /* 蜂鸣器响,成功返回32位整数,无或失败返回0 */
        unsigned char buffer[32];
        int readnum;
        unsigned int timer;
        unsigned int result;

        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0

        //发送开始符 0x20
        buffer[0]=0x20;
        write(fd_port,buffer,1);

        //等待0x06回应 否则出错退出
        usleep(40*1000);//等待40ms
        timer=0;
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x06)
                return 0;


        //发送 00 60 04 0a 19 19 01 90 03
        buffer[0]=0x00;buffer[1]=0x60;buffer[2]=0x04;buffer[3]=0x0a;buffer[4]=0x19;buffer[5]=0x19;buffer[6]=0x01;buffer[7]=0x90;buffer[8]=0x03;
        write(fd_port,buffer,9);

        //等待0x20回应 否则出错退出
        usleep(40*1000);//等待50ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);
        if (buffer[0]!=0x20)
                return 0;

        //发送0x06
        buffer[0]=0x06;
        write(fd_port,buffer,1);

        //等待0x00 0x00 0x00 0xff 0x03回应
        usleep(40*1000);//等待40ms
        memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
        timer=0;
        do
        {
                readnum=read(fd_port,buffer,sizeof(buffer));
                usleep(100);
                timer++;
                if (timer>1000)//等待超时则退出
                        return 0;
        } while (readnum==0);

        if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
                return 0;
        return 1;
}

void Cardreader::autorun()
{
    int newid,oldid;
    fd_port=open_port(1);
    set_opt(fd_port,57600, 8, 'N', 1);
    initcardreader(fd_port);
    for (int i=0;i<20;i++)
   {
        usleep(200*1000);
        if (checkcard(fd_port))
       {
          newid=readcardid(fd_port);
          if (oldid!=newid)
          {
              sendmessage(newid);
              oldid=newid;
              beep(fd_port);

          }

      }
   }
}

void Cardreader::sendmessage(int data)
{
    emit  message(QString::number(data,16));
}
级别: 新手上路
UID: 16384
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-03-17
最后登录: 2011-03-01
6楼  发表于: 2010-03-20 09:43
呵呵,学习了!
级别: 侠客
UID: 10318
精华: 0
发帖: 63
金钱: 320 两
威望: 67 点
综合积分: 126 分
注册时间: 2009-10-31
最后登录: 2012-03-18
7楼  发表于: 2010-05-05 19:53
我做过QT直接调用linux的串口
char *dev ="/dev/ttyS1";
fd = OpenDev(dev);
nwrite = write(fd,buff,5);
close(fd);
用的linux思路。可以实现串口发送和接收。
可以作为一个参考