|
在android中使用串口,首先是初始化串口实例,如:
SerialPort mSerialPort = new SerialPort(new File("/dev/s3c2410_serial1"), 19200);
这里我们可以设置设备即那个com口,和波特率,可是实际使用中,还要对奇偶效验停止位元等设置,才能跟特定的接口连上,那该怎么做呢? 首先要明确,在安卓开发中实际还是操作的linux接口,使用的是jni方式来调用,qt210里具体是SerialPort.cpp文件。

下面贴出代码,注解里有解释。修改主要在下边这个函数里,其他的没变化。
- /*
- * 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[VTIME] = 0;
- cfg.c_cc[VMIN] = 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;
- }
复制代码
|
|