RS232 Android获取串口数据

串口

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

定义

串行接口(Serial Interface)是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

由来

串口的出现是在1980年前后,数据传输率是115kbps~230kbps。串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。串口也可以应用于两台计算机(或设备)之间的互联及数据传输。由于串口(COM)不支持热插拔及传输速率较低,部分新主板和大部分便携电脑已开始取消该接口。串口多用于工控和测量设备以及部分通信设备中。

接口划分标准

同步串行接口(英文:Synchronous Serial Interface,SSI)是一种常用的工业用通信接口。
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART是一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含TTL电平的串口和RS232电平的串口。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5+12V为低电平,而-12-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。
串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。

RS-232

也称标准串口,最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“ [1] 数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中25芯插头座已很少采用。
RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。 [2]

RS-422

标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。典型的RS-422是四线接口。实际上还有一根信号地线,共5根线。其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。
RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

RS-485

是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。
RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以在RS-422网络中应用。
RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。 [2]

与并口区别

串口形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。但是并不是说并口快,由于8位通道之间的互相干扰(串扰),传输时速度就受到了限制,传输容易出错。串口没有互相干扰。并口同时发送的数据量大,但要比串口慢。 [3] 串口硬盘就是这样被人们重视的。

应用

交换机的串口

交换机的串口的英文就是trunk;是用来做下一跳路由转换用的。每个VLAN只有通过与TRUNK的路由指向后才能上外网。

电脑主板串口

进行串行传输的接口,它一次只能传输1Bit。串行端口可以用于连接外置调制解调器、绘图仪或串行打印机。它也可以控制台连接的方式连接网络设备,例如路由器和交换机,主要用来配置它们。

在window下模拟串口进行调试

window10下 使用 [串口调试助手3]+[Virtual Serial Port Driver Pro9.0 by Eltima Software]

使用[Virtual Serial Port Driver Pro9.0 by Eltima Software]创建一对连接的串口,不要使用com1和com2创建,可能会出现问题,因为com1可能是物理存在的,创建完成后,可以在此电脑→管理→设备管理器→端口处查看到,虚拟的端口,虚拟的端口是有对应关系的,然后打开两个[串口调试助手3]作为调试端口

ComAssistant V1.1版本参数配置
串口号: /dev/ttyZC1
波特率: 9600
校验位: 无校验
停止位: 1位
解码方式: 文本

Android模拟器访问PC本地串口

创建一对虚拟串口COM2和COM4,COM4作为PC串口使用,将COM2映射到夜神模拟器的串口上
PC: COM2 — COM4
|
Android: /dev/ttyS3

虚拟化后,使用Android Studio自带的Android模拟器创建一个Android系统
使用emulator.exe -list-avds显示所有模拟器,注意不要直接通过Androidstudio启动模拟器
通过emulator.exe -avd Pixel_2_API_27_2 -writable-system -qemu -serial COM2 启动Android模拟器
启动报错,安装NDK相关内容

启动模拟器后,如果进入adb shell时,前缀是类似:@generic_x86:/ $
最后是一个美元符号$,则表示不是以root身份运行。如果前缀是类似:root@generic_x86:/ #
最后是一个井号#,则表示是以root身份运行。
如果没有root,要使用root权限,则需要执行su命令,但执行后出现提示:/system/bin/sh: su: not found

找不到su命令

其实并不是找不到,只是因为没有root权限,也执行不了su命令

那么也就是说,在没有root权限的情况下要切换到root状态也需要root权限,这进入了权限许可逻辑的死循环。

于是,我们要跳出解决权限问题的思维!

解决方法:

我一开是采用的Android Studio安卓模拟器的版本是根据所学习的教程推荐的Android 7.0。

但是,Android 7.0的模拟器是没有root权限的!

所以只需要重新安装一个非Android 7.0版本的模拟器,如Android 6.0,或者连接一台获得了root权限的安卓设备

运行后会发现,当进入adb shell后,命令提示符里前缀就已经变成了:root@generic_x86:/ #

带有root权限的adb shell

那也就不需要su命令了,可以直接访问所有的文件,问题就解决了。

其他问题:

在使用adb的时候,有时候会遇到在命令提示符打不开adb shell的情况,提示:adb sever is out of date.killing

则有可能是你打开了两个adb,Android Studio在运行安卓模拟器时,会自行初始化并打开adb。如果此时你再手动打开adb shell,会出现两个adb抢占5037端口,导致两个都不能使用的问题。

那么我的解决方法比较简单粗暴:

重启电脑再打开Android Studio,并且只用AS里自带的Terminal命令控制符打开adb shell,尚可解决

adb使用命令

adb shell连接默认设备
adb -s 设备名 shell 指定某个设备执行命令
ADB命令用法大全

参考的博客
Android调试串口无法连接串口设备的问题及解决办法
Android模拟器实现windows虚拟串口通信调试
Android模拟器调试串口
Android Windows虚拟串口调试
使用ANDROID模拟器调试串口功能
Android 串口打开失败几种原因及解决办法

连接Android方式

  1. Androidstudio中启动Android模拟器
  2. 使用adb root设置adb为root模式
  3. adb shell setenforce 0 临时关闭selinux防火墙,强制模式, adb shell getenforce,获取当前状态,如果为Enforcing则执行
    组合命令:adb root & adb shell setenforce 0
    adb root & adb shell setenforce 0 & adb shell chmod 777 /dev/tty & adb shell chmod 777 /dev/ttyS0 & adb shell chmod 777 /dev/ttyS1 & adb shell chmod 777 /dev/ttyS2 & adb shell chmod 777 /dev/ttyS3
  4. 进入/dev文件夹
  5. 设置权限chmod 777 ttyS3
    组合命令:adb shell chmod 777 /dev/tty & adb shell chmod 777 /dev/ttyS0 & adb shell chmod 777 /dev/ttyS1 & adb shell chmod 777 /dev/ttyS2 & adb shell chmod 777 /dev/ttyS3
  6. 关闭Android模拟器,使用emulator命令启动模拟器,重新从第2步开始执行
    emulator.exe -avd Pixel_2_API_25 -writable-system -qemu -serial COM2
  7. 使用安卓串口调试工具调试串口,下载安卓8.1版本的串口调试助手,安装root工具Superuser,安装手机端terminal.apk,
    切换为Android 7.1.1,API 25
    注意, 每次重启Android模拟器都需要重新设置adb参数
梳理一下现在市面上常见的CPU架构类型,如下:

1、armeabi-v7a: 第7代及以上的 32位ARM 处理器
2、arm64-v8a: 第8代、64位ARM处理器
3、armeabi: 第5代、第6代的32位ARM处理器,早期的手机在使用,现在基本很少了。
4、x86: Intel 32位处理器,在平板、模拟器用得比较多。
5、x86_64: Intel 64位处理器,在平板、模拟器用得比较多。

  1. 在安卓串口助手上选择可用的串口,点击打开,然后在电脑端点击响应连接的串口,点击打开,如果打开时发现安卓7.1.1的模拟器直接卡死关机,这就说明已经连接上了,这个时候直接上自己开发的Android代码连就行

开发完成后直接真机测试,就不要用模拟器测试了,因为模拟器不清楚是内部什么原因卡死。据说网上飘来的答案说是5.1以上的Android系统不能使用,串口权限没有打开。但是我这里想了一下,我修改了权限了的,而且是在模拟器打开的时候是正常的,
是主机打开串口的时候卡死的,这就说明连接是正常的,也有可能是纯粹不大兼容吧
排查原因,数据位不能超过8位,设置成7位试试,不行…
Android选择4.4版本的,Android API 19再试

收获

了解了大名鼎鼎的串口是啥,究竟是干嘛的,在学习使用RS232协议进行串口通信的过程中,学习了Android开发的部分知识,了解了Java JNI在链接C/C++时发挥的作用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值