天嵌 ARM开发社区

 找回密码
 注册
查看: 3165|回复: 1

QT201安卓开发中的串口设置

[复制链接]
hotzwd 发表于 2015-1-8 14:34:17 | 显示全部楼层 |阅读模式
在android中使用串口,首先是初始化串口实例,如:
SerialPort mSerialPort = new SerialPort(new File("/dev/s3c2410_serial1"), 19200);

这里我们可以设置设备即那个com口,和波特率,可是实际使用中,还要对奇偶效验停止位元等设置,才能跟特定的接口连上,那该怎么做呢?
首先要明确,在安卓开发中实际还是操作的linux接口,使用的是jni方式来调用,qt210里具体是SerialPort.cpp文件。

下面贴出代码,注解里有解释。修改主要在下边这个函数里,其他的没变化。
  1. /*
  2. * Class:     cedric_serial_SerialPort
  3. * Method:    open
  4. * Signature: (Ljava/lang/String;)V
  5. */
  6. JNIEXPORT jobject JNICALL Java_com_embedsky_serialport_SerialPort_open(
  7.                 JNIEnv *env, jclass clazz, jstring path, jint baudrate) {
  8.         int fd;
  9.         speed_t speed;
  10.         jobject mFileDescriptor;

  11.         /* Check arguments */
  12.         {
  13.                 speed = getBaudrate(baudrate);
  14.                 if (speed == 0) {
  15.                         /* TODO: throw an exception */
  16.                         //LOGE("Invalid baudrate");
  17.                         return NULL;
  18.                 }
  19.         }

  20.         /* Opening device */
  21.         {
  22.                 jboolean iscopy;
  23.                 const char *path_utf = env->GetStringUTFChars(path, &iscopy);
  24.                 //fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);
  25.                 fd = open(path_utf, O_RDWR);
  26.                 //LOGE("open() fd = %d", fd);
  27.                 //LOGE("errno = %d", errno );
  28.                 env->ReleaseStringUTFChars(path, path_utf);
  29.                 if (fd == -1) {
  30.                         /* Throw an exception */
  31.                         //LOGE("Cannot open port");
  32.                         /* TODO: throw an exception */
  33.                         return NULL;
  34.                 }
  35.         }

  36.         /* Configure device */
  37.         {
  38.                 struct termios cfg;
  39.                 //LOGD("Configuring serial port");
  40.                 if (tcgetattr(fd, &cfg)) {
  41.                         //LOGE("tcgetattr() failed");
  42.                         close(fd);
  43.                         /* TODO: throw an exception */
  44.                         return NULL;
  45.                 }

  46.                 cfmakeraw(&cfg);
  47.                 cfsetispeed(&cfg, speed);
  48.                 cfsetospeed(&cfg, speed);
  49.                 cfg.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
  50.                 cfg.c_cflag |= CS8;
  51.                 //而使能偶校验时:
  52.                 cfg.c_cflag |= PARENB;
  53.                 cfg.c_cflag &= ~PARODD; /* 清除偶校验标志,则配置为奇校验*/
  54.                 cfg.c_iflag |= INPCK;
  55.                 //cfg.c_cflag |= CSTOPB; /* 将停止位设置为两个比特 */
  56.                 cfg.c_cflag &=  ~CSTOPB;   /* 将停止位设置为一个比特 */
  57.                 //设置最少字符和等待时间
  58.                 cfg.c_cc[VTIME] = 0;
  59.                 cfg.c_cc[VMIN] = 0;

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


  61.                 if (tcsetattr(fd, TCSANOW, &cfg)) {
  62.                         //LOGE("tcsetattr() failed");
  63.                         close(fd);
  64.                         /* TODO: throw an exception */
  65.                         return NULL;
  66.                 }
  67.         }

  68.         /* Create a corresponding file descriptor */
  69.         {
  70.                 jclass cFileDescriptor = env->FindClass("java/io/FileDescriptor");
  71.                 jmethodID iFileDescriptor = env->GetMethodID(cFileDescriptor, "<init>",
  72.                                 "()V");
  73.                 jfieldID descriptorID = env->GetFieldID(cFileDescriptor, "descriptor",
  74.                                 "I");
  75.                 mFileDescriptor = env->NewObject(cFileDescriptor, iFileDescriptor);
  76.                 env->SetIntField(mFileDescriptor, descriptorID, (jint) fd);
  77.         }

  78.         return mFileDescriptor;
  79. }
复制代码



aswan 发表于 2015-2-15 21:56:13 | 显示全部楼层
学习学习,谢谢分享//
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-16 22:09 , Processed in 2.046448 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表