美文网首页
Android移植谷歌官方串口库

Android移植谷歌官方串口库

作者: 97690CE50CC872D | 来源:发表于2018-11-22 16:57 被阅读3次

    关于安卓设备上使用串口,谷歌官方在github上有提供代码实例,里面有JNI的代码和串口API的java。将谷歌官方串口库项目下载后发现只支持设置串口号及波特率,
    需求需要增加支持校验位、数据位、停止位、流控等串口配置项,此记录步骤。

    在native代码里添加修改

    1. 检验参数合法性

    /* Check arguments */
        {
            speed = getBaudrate(baudrate);
            if (speed == -1) {
                /* TODO: throw an exception */
                LOGE("Invalid baudrate");
                return NULL;
            }
        }
    

    2. 打开串口

    
        /* Opening device */
        {
            jboolean iscopy;
            const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
            LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
            fd = open(path_utf, O_RDWR | flags);
            LOGD("open() fd = %d", fd);
            (*env)->ReleaseStringUTFChars(env, path, path_utf);
            if (fd == -1) {
                /* Throw an exception */
                LOGE("Cannot open port");
                /* TODO: throw an exception */
                return NULL;
            }
        }
    

    3.配置波特率

        /* Configure device */
        {
            struct termios cfg;
            LOGD("Configuring serial port");
            if (tcgetattr(fd, &cfg)) {
                LOGE("tcgetattr() failed");
                close(fd);
                /* TODO: throw an exception */
                return NULL;
            }
    
            cfmakeraw(&cfg);
            cfsetispeed(&cfg, speed);
            cfsetospeed(&cfg, speed);
    

    4.配置数据位

            cfg.c_cflag &= ~CSIZE;
            switch (dataBits) {
                case 5:
                    cfg.c_cflag |= CS5;    //使用5位数据位
                    break;
                case 6:
                    cfg.c_cflag |= CS6;    //使用6位数据位
                    break;
                case 7:
                    cfg.c_cflag |= CS7;    //使用7位数据位
                    break;
                case 8:
                    cfg.c_cflag |= CS8;    //使用8位数据位
                    break;
                default:
                    cfg.c_cflag |= CS8;
                    break;
            }
    

    5.配置校验位

     switch (parity) {
                case 0:
                    cfg.c_cflag &= ~PARENB;    //无奇偶校验
                    break;
                case 1:
                    cfg.c_cflag |= (PARODD | PARENB);   //奇校验
                    break;
                case 2:
                    cfg.c_iflag &= ~(IGNPAR | PARMRK); // 偶校验
                    cfg.c_iflag |= INPCK;
                    cfg.c_cflag |= PARENB;
                    cfg.c_cflag &= ~PARODD;
                    break;
                default:
                    cfg.c_cflag &= ~PARENB;
                    break;
            }
    

    6.配置停止位

     switch (stopBits) {
                case 1:
                    cfg.c_cflag &= ~CSTOPB;    //1位停止位
                    break;
                case 2:
                    cfg.c_cflag |= CSTOPB;    //2位停止位
                    break;
                default:
                    break;
            }
    

    7.配置流控

     switch (flowCon) {
                case 0:
                    cfg.c_cflag &= ~CRTSCTS;    //不使用流控
                    break;
                case 1:
                    cfg.c_cflag |= CRTSCTS;    //硬件流控
                    break;
                case 2:
                    cfg.c_cflag |= IXON | IXOFF | IXANY;    //软件流控
                    break;
                default:
                    cfg.c_cflag &= ~CRTSCTS;
                    break;
            }
    

    完整Demo演示

    完整Demo演示

    源码地址 https://github.com/xmaihh/Android-Serialport
    Demo演示APK 下载地址

    相关文章

      网友评论

          本文标题:Android移植谷歌官方串口库

          本文链接:https://www.haomeiwen.com/subject/zuglqqtx.html