hotzwd 发表于 2015-1-8 14:34:17

QT201安卓开发中的串口设置

在android中使用串口,首先是初始化串口实例,如:
SerialPort mSerialPort = new SerialPort(new File("/dev/s3c2410_serial1"), 19200);

这里我们可以设置设备即那个com口,和波特率,可是实际使用中,还要对奇偶效验停止位元等设置,才能跟特定的接口连上,那该怎么做呢?


首先要明确,在安卓开发中实际还是操作的linux接口,使用的是jni方式来调用,qt210里具体是SerialPort.cpp文件。
data:image/png;base64,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
下面贴出代码,注解里有解释。修改主要在下边这个函数里,其他的没变化。
/*
* Class:   cedric_serial_SerialPort
* Method:    open
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT jobject JNICALL Java_com_embedsky_serialport_SerialPort_open(
                JNIEnv *env, jclass clazz, jstring path, jint baudrate) {
        int fd;
        speed_t speed;
        jobject mFileDescriptor;

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

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

        /* 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);
                cfg.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
                cfg.c_cflag |= CS8;
                //而使能偶校验时:
                cfg.c_cflag |= PARENB;
                cfg.c_cflag &= ~PARODD; /* 清除偶校验标志,则配置为奇校验*/
                cfg.c_iflag |= INPCK;
                //cfg.c_cflag |= CSTOPB; /* 将停止位设置为两个比特 */
                cfg.c_cflag &=~CSTOPB;   /* 将停止位设置为一个比特 */
                //设置最少字符和等待时间
                cfg.c_cc = 0;
                cfg.c_cc = 0;

                tcflush(fd, TCIFLUSH); // TCIFLUSH:对接收到而未被读取的数据进行清空处理。


                if (tcsetattr(fd, TCSANOW, &cfg)) {
                        //LOGE("tcsetattr() failed");
                        close(fd);
                        /* TODO: throw an exception */
                        return NULL;
                }
        }

        /* Create a corresponding file descriptor */
        {
                jclass cFileDescriptor = env->FindClass("java/io/FileDescriptor");
                jmethodID iFileDescriptor = env->GetMethodID(cFileDescriptor, "<init>",
                                "()V");
                jfieldID descriptorID = env->GetFieldID(cFileDescriptor, "descriptor",
                                "I");
                mFileDescriptor = env->NewObject(cFileDescriptor, iFileDescriptor);
                env->SetIntField(mFileDescriptor, descriptorID, (jint) fd);
        }

        return mFileDescriptor;
}


aswan 发表于 2015-2-15 21:56:13

学习学习,谢谢分享//
页: [1]
查看完整版本: QT201安卓开发中的串口设置