| 
 | 
 
在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;
 
 - }
 
  复制代码 
 
 
 |   
 
 
 
 |