天天看点

QT for Android串口开发思路

QT for Android

  • 思路
    • 一、所用到的头文件
    • 1、打开串口
    • 2、配置串口
    • 3、接收数据
    • 3、发送数据

最近在搞QT for Android开发,在网上搜了下解决方案发现都是需要java库的支持,QT原生接口QSerialPort不支持Android系统的串口开发,因为QT的接口掉的都是标准的接口,而Android都是非标准的,所以用不了,只能自己写

思路

找了网上好多方法,发现都不太适合,然后想起来了我以前自己用Java开发的串口程序,Java是调用的C的代码,使用了NDK进行的串口控制,然后就想起来了用C++直接控制Linux应该也可以,然后开工!!!

qt版本:

QT for Android串口开发思路

一、所用到的头文件

#include <unistd.h>
#include <fcntl.h>//尤其要注意这个 我的这个头文件不知道为什么不完整,需要添加O_NDELAY和O_NOCTTY
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <dirent.h>
#include <termios.h>
#include <errno.h>
#include <stdio.h>
#include <sys/select.h>
#include <string.h>
           

1、打开串口

widget.cpp文件

tty_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
        if(tty_fd == -1){
            qDebug() << "无法打开组件";
            qDebug() << tty_fd;
             qDebug() << strerror(errno);//打印最后一次的故障
        }else{
            qDebug() << "打开组件成功";
        }
           

widget.h头文件

如果不知道自己的串口名字以以下这串代码查找自己的串口名

DIR *p_dir = opendir("/dev");

        while (1) {
            struct dirent *p_ent = readdir(p_dir);
            if (nullptr == p_ent) {
                break;
            }
            qDebug() << "文件名: " << p_ent->d_name;
        }
           

2、配置串口

tcgetattr(tty_fd, &options); //获取原有的串口属性的配置
        if(tcgetattr(tty_fd, &options)<0){
             qDebug() << strerror(errno);
             qDebug() << errno;
        }

        bzero(&options, sizeof(options));
        options.c_cflag|=(CLOCAL|CREAD ); // CREAD 开启串行数据接收,CLOCAL并打开本地连接模式

        options.c_cflag |= CS8; //设置8位数据位

        options.c_cflag &= ~PARENB; //无校验位
        /* 设置9600波特率为B9600
		   如果是115200则为B115200
		 */
        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);
        options.c_cflag &= ~CSTOPB;/* 设置一位停止位; */
        options.c_cc[VTIME] = 1;     // 读取一个字符等待1*(1/10)s
        options.c_cc[VMIN] = 1;        // 读取字符的最少个数为1

        tcflush(tty_fd, TCIOFLUSH);    //清掉串口缓存
        fcntl(tty_fd, F_SETFL, 0);    //串口阻塞  0阻塞1非阻塞

        if (tcsetattr(tty_fd, TCSANOW, &options) != 0)    //激活新设置
        {
            qDebug()<< "激活新设置失败:";
            qDebug() <<  strerror(errno);
        }
           

3、接收数据

widget.cpp文件

widget.h文件

3、发送数据

然后到这就已经完成了,由于是初学C++中间犯了好多基本的错误,搞了两天才搞定,一定要细心细心细心!!!

下载地址