Android 串口开发(二) 支持设置奇偶校验、数据位、停止位

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

同样修改后发现居然运行不起来,百度上找了一大堆文章都没能解决问题,想起来之前一位同事说简书要比csdn上的可靠,所以一大早来到公司就上简书搜索,果然不出所料,才看了两篇就找到想要的答案了,就是上面参考的那位大哥的文章,文章不繁琐,结构清晰,做过硬件开发的Android或者玩过串口的朋友一看就知道怎么回事,好了废话不多说,在这里还有两个文件没有贴出来,下面贴一下serial-port.cpp代码

//

// Created by Administrator on 2019\1\29 0029.

//

#include <jni.h>

#include

#include <termios.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include “android/log.h”

static const char *TAG=“serial_port”;

#define LOGI(fmt, args…) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)

#define LOGD(fmt, args…) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)

#define LOGE(fmt, args…) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)

static speed_t getBaudrate(jint baudrate)

{

switch(baudrate) {

case 0: return B0;

case 50: return B50;

case 75: return B75;

case 110: return B110;

case 134: return B134;

case 150: return B150;

case 200: return B200;

case 300: return B300;

case 600: return B600;

case 1200: return B1200;

case 1800: return B1800;

case 2400: return B2400;

case 4800: return B4800;

case 9600: return B9600;

case 19200: return B19200;

case 38400: return B38400;

case 57600: return B57600;

case 115200: return B115200;

case 230400: return B230400;

case 460800: return B460800;

case 500000: return B500000;

case 576000: return B576000;

case 921600: return B921600;

case 1000000: return B1000000;

case 1152000: return B1152000;

case 1500000: return B1500000;

case 2000000: return B2000000;

case 2500000: return B2500000;

case 3000000: return B3000000;

case 3500000: return B3500000;

case 4000000: return B4000000;

default: return -1;

}

}

static void throwException(JNIEnv *env, const char *name, const char *msg)

{

jclass cls = env->FindClass(name);

/* if cls is NULL, an exception has already been thrown */

if (cls != NULL) {

env->ThrowNew(cls, msg);

}

/* free the local ref */

env->DeleteLocalRef(cls);

}

extern “C”

JNIEXPORT jobject JNICALL

Java_com_deemons_serialportlib_SerialPort_open

(JNIEnv *env, jobject instance, jstring path, jint baudrate,jint parity, jint dataBits, jint stopBit, jint flags)

{

int fd;

speed_t speed;

jobject mFileDescriptor;

/* Check arguments */

{

speed = getBaudrate(baudrate);

if (speed == -1) {

throwException(env, “java/lang/IllegalArgumentException”, “Invalid baudrate”);

return NULL;

}

if (parity <0 || parity>2) {

throwException(env, “java/lang/IllegalArgumentException”, “Invalid parity”);

return NULL;

}

if (dataBits <5 || dataBits>8) {

throwException(env, “java/lang/IllegalArgumentException”, “Invalid dataBits”);

return NULL;

}

if (stopBit <1 || stopBit>2) {

throwException(env, “java/lang/IllegalArgumentException”, “Invalid stopBit”);

return NULL;

}

}

/* Opening device */

{

jboolean iscopy;

const char *path_utf = env->GetStringUTFChars(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(path, path_utf);

if (fd == -1)

{

throwException(env, “java/io/IOException”, “Cannot open port”);

return NULL;

}

}

/* Configure device */

{

struct termios cfg;

LOGD(“Configuring serial port”);

if (tcgetattr(fd, &cfg))

{

LOGE(“tcgetattr() failed”);

close(fd);

throwException(env, “java/io/IOException”, “tcgetattr() failed”);

return NULL;

}

cfmakeraw(&cfg);

cfsetispeed(&cfg, speed);

cfsetospeed(&cfg, speed);

/* More attribute set */

switch (parity) {

case 0: break;

case 1: cfg.c_cflag |= PARENB; break;

case 2: cfg.c_cflag &= ~PARODD; break;

}

switch (dataBits) {

case 5: cfg.c_cflag |= CS5; break;

case 6: cfg.c_cflag |= CS6; break;

case 7: cfg.c_cflag |= CS7; break;

case 8: cfg.c_cflag |= CS8; break;

}

switch (stopBit) {

case 1: cfg.c_cflag &= ~CSTOPB; break;

case 2: cfg.c_cflag |= CSTOPB; break;

}

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, “”, “()V”);

jfieldID descriptorID = env->GetFieldID(cFileDescriptor, “descriptor”, “I”);

mFileDescriptor = env->NewObject(cFileDescriptor, iFileDescriptor);

env->SetIntField(mFileDescriptor, descriptorID, (jint)fd);

}

return mFileDescriptor;

}

最后

我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!
以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。

字节高级Android经典面试题和答案


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

网络等。

字节高级Android经典面试题和答案

[外链图片转存中…(img-Bp4xiHrG-1713664923856)]
[外链图片转存中…(img-EsaefVez-1713664923856)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-TuPakO75-1713664923856)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值