Android 串口编程原理和实现方式附源码
经典的串口调试工具源代码(一)

经典的串口调试助手源代码(一)Dim OutputAscii As BooleanDim InputString As StringDim OutputString As String'=====================================================================================' 变量定义'=====================================================================================Option Explicit ' 强制显式声明Dim ComSwitch As Boolean ' 串口开关状态判断Dim FileData As String ' 要发送的文件暂存Dim SendCount As Long ' 发送数据字节计数器Dim ReceiveCount As Long ' 接收数据字节计数器Dim InputSignal As String ' 接收缓冲暂存Dim OutputSignal As String ' 发送数据暂存Dim DisplaySwitch As Boolean ' 显示开关Dim ModeSend As Boolean ' 发送方式判断Dim Savetime As Single ' 时间数据暂存延时用Dim SaveTextPath As String ' 保存文本路径' 网页超链接申明Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory AsString, ByVal nShowCmd As Long) As LongPrivate Sub CloseCom() '关闭串口On Error GoTo ErrIf MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示mnuconnect.Caption = "断开串口"cmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchoff.Visible = TrueImgSwitchon.Visible = FalseErr:End SubPrivate Sub UpdateStatus()If MSComm.PortOpen ThenStatusBar1.Panels(1).Text = "Connected"mnuautosend.Caption = "自动发送"mnuconnect.Caption = "断开串口"ElseStatusBar1.Panels(1).Text = "断开串口"mnuautosend.Caption = "disautosend"mnuconnect.Caption = "打开串口"End IfStatusBar1.Panels(2).Text = "COM" & mPortStatusBar1.Panels(3).Text = MSComm.SettingsIf (OutputAscii) ThenStatusBar1.Panels(4) = "ASCII"ElseStatusBar1.Panels(4) = "HEX"End If'On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "Dis&autosend"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器Elsemnuautosend.Caption = "autosend"ChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "autosend"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub CmdSendFile_Click() '发送文件On Error GoTo ErrIf MSComm.PortOpen = True Then ' 如果串口打开了,则可以发送数据If FileData = "" Then ' 判断发送数据是否为空MsgBox "发送的文件为空", 16, "串口调试助手" ' 发送数据为空则提示ElseIf ChkHexReceive.Value = 1 Then ' 如果按十六进制接收时,按二进制发送,否则按文本发送MSComm.InputMode = comInputModeBinary ' 二进制发送ElseMSComm.InputMode = comInputModeText ' 文本发送End IfMSComm.Output = Trim(FileData) ' 发送数据ModeSend = True ' 设置文本发送方式End IfElseMsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfErr:End SubPrivate Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer,StopBit As Integer)On Error GoTo ErrorTrap ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.InBufferSize = 1024 ' 设置接收缓冲区为1024字节MSComm.OutBufferSize = 4096 ' 设置发送缓冲区为4096字节MSComm.InBufferCount = 0 ' 清空输入缓冲区MSComm.OutBufferCount = 0 ' 清空输出缓冲区MSComm.SThreshold = 1 ' 发送缓冲区空触发发送事件MSComm.RThreshold = 1 ' 每X个字符到接收缓冲区引起触发接收事件MSComm.OutBufferCount = 0 ' 清空发送缓冲区MSComm.InBufferCount = 0 ' 滑空接收缓冲MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thentxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsetxtstatus.Text = "STATUS:COM Port Cloced" ' 串口没打开时,提示串口关闭状态End IfExit SubErrorTrap: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComCase ElseMsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComEnd SelectErr.ClearEnd SubPrivate Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer,StopBit As Integer)On Error GoTo ErrorHint ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thencmdswitch.Caption = "关闭串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\kai.jpg") ' 显示串口已经打开的图标ImgSwitchoff.Visible = Falsemnuconnect.Caption = "disconnect"ImgSwitchon.Visible = Truetxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsecmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchon.Visible = FalseImgSwitchoff.Visible = Truetxtstatus.Text = "STATUS:COM Port Cloced"End IfExit SubErrorHint: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数Case ElseMsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数End SelectErr.Clear ' 清除Err 对象的属性End SubPrivate Sub Command1_Click()End SubPrivate Sub cbobaudrate_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1),cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbocom_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbodatabit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cboparitybit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbostopbit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub chkautosend_Click()On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "取消自动发送"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器ElseChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "自动发送数据"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub cmdamend_Click()Dim spShell As Object ' 定义存放引用对象的变量Dim spFolder As Object ' 定义存放引用对象的变量Dim spFolderItem As Object ' 定义存放引用对象的变量Dim spPath As String ' 定义存放的变量On Error GoTo Err ' 错误处理,防止取消打开文件夹时报错Const WINDOW_HANDLE = 0Const NO_OPTIONS = 0Set spShell = CreateObject("Shell.Application")Set spFolder = spShell.BrowseForFolder(WINDOW_HANDLE, "选择目录:", NO_OPTIONS,"C:\Scripts")Set spFolderItem = spFolder.SelfspPath = spFolderItem.PathspPath = Replace(spPath, "\", "\") ' Replace函数的返回值是一个字符串txtsavepath.Text = spPath ' 把文件夹路径显示在标签上SaveTextPath = txtsavepath.Text ' 路径暂存Err:End SubPrivate Sub CmdClearCounter_Click()On Error GoTo ErrSendCount = 0 ' 发送计数器清零ReceiveCount = 0 ' 接收计数器清零txtRXcount.Text = "RX:" & 0 ' 接收计数txtTXcount.Text = "TX:" & 0 ' 发送计数Err:End SubPrivate Sub cmdclearrecieve_Click()TxtReceive.Text = ""End SubPrivate Sub cmdclearsend_Click()txtsend.Text = ""End SubPrivate Sub CmdHelp_Click()FrmHelp.ShowEnd SubPrivate Sub CmdQuit_Click()If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭Unload Me ' 卸载窗体,并退出程序EndEnd SubPrivate Sub cmdsavedisp_Click()On Error GoTo Err ' 错误处理SaveTextPath = txtsavepath ' 路径暂存Open txtsavepath & "\1.txt" For Output As #1 ' 打开文件' 不存在的话会创建文件,如已存在会覆盖' output 改为append 为追加' 改为input 则只读Print #1, Year(Date) & "年" & Month(Date) & "月" & Day(Date) & _"日" & Hour(Time) & "时" & Minute(Time) & "分" & Second(Time) & _"秒" & vbCrLf & TxtReceive.Text + vbCrLf ' 把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)' vbcrlf 为回车换行Close #1 ' 关闭文件txtsavepath = "OK,1.txt Save" ' 提示保存成功cmdsavedisp.Enabled = FalseSavetime = Timer ' 记下开始的时间While Timer < Savetime + 5 ' 循环等待5 - 要延时的时间DoEvents ' 转让控制权,以便让操作系统处理其它的事件。
Android串口通信解决方案

Android串口全面解决方案武汉波仕电子公司串口(RS-232/RS-485)主要用于工业测量和控制,计算机以及Windows正在部分被平板和Android代替,计算机串口也在逐步被Android串口取代。
本文介绍了在Android下的几种串口解决方案。
从连接方式上来分,分为无线和有线,无线又分为蓝牙和WiFi,有线分为主板自带和USB口扩展。
从实现方式上来分,分为自带串口的专用设备、对通用设备进行串口扩展。
如果是用于高可靠性要求的工业测控,有线串口是必须的。
因为有线的抗干扰能力远远强于无线。
如果用于日常的测控,无线则更加方便,因为无需布线。
1、蓝牙串口转换器BLU232型蓝牙/串口转换器只有DB-9/DB-9转接头大小,将android智能手机或者平板电脑的蓝牙信号转换出RS-232/RS-485口,无线通信距离10米。
BLU232可以为带蓝牙的Android设备扩展出一个无线串口。
1、将BLU232接上电源,LED灯亮。
2、蓝牙——“添加蓝牙设备”,无线扫描找到蓝牙BOLUTEK,输入配对密码:1234。
3、BLU232默认为从机状态、波特率等格式为(9600,n,8,1)。
在ANDROID下可以使用“蓝牙串口.apk”等软件进行智能手机的串口通信。
2、WiFi串口转换器波仕AP232L型WiFi串口转换器实现无线WiFi与RS-232/RS-485/422串口的转换,这样Android智能设备可以用无线WiFi进行串口通信,无线通信距离50米。
产品本身可通过浏览器进行设置,无须其它任何专用软件或装置。
由于AP232L本身是通过TCP/IP协议来虚拟串口通信的,所以Android智能手机或者平板电脑也可以直接用TCP/IP通信。
先安装TCP-TEST.APK(TCP网络助手),并连接到AP232L 的无线信号。
运行TCP网络助手,选中“tcp client”,键入AP232L默认的IP地址(192.168.1.1)和端口(2001),按“增加”即可。
windows与android usb串口通信原理

windows与android usb串口通信原理一、引言随着移动设备的普及,Android操作系统成为了最为主流的移动操作系统之一。
而在软硬件设备之间进行通信的需求也越来越高。
本文将介绍Windows与Android系统通过USB串口进行通信的原理。
二、USB串口通信概述USB串口通信是将数据通过串口进行传输的一种方式。
USB (Universal Serial Bus)是一种常见的计算机外设接口,而串口作为传统的通信接口之一,在一些设备中仍然得到广泛应用。
通过USB串口通信,可以实现不同设备之间的数据传输和通信。
三、Windows与Android USB串口通信原理1. USB驱动安装:在Windows平台上,如果需要与Android设备进行USB串口通信,首先需要确保系统已经安装了相应的驱动程序。
一般情况下,当连接一个支持USB串口通信的Android设备时,Windows系统会自动安装驱动程序。
但如果系统无法自动安装所需的驱动程序,用户需要手动安装驱动。
2. Android设备USB配置:为了确保Android设备能够以USB串口模式工作,需要在系统设置中进行相应的配置。
用户需要前往设备的设置菜单,并启用“开发者选项”。
在“开发者选项”中,打开“USB调试”和“USB串口调试”选项。
3. 应用程序通信:一旦安装了必要的驱动程序并进行了相关的设备配置,用户可以通过编写应用程序来实现Windows与Android之间的USB串口通信。
在Windows平台上,用户可以使用开发工具如Visual Studio来编写应用程序。
而在Android平台上,用户可以通过Android Studio等工具进行开发。
4. USB设备连接与数据传输:通过USB接口连接Windows计算机与Android设备,并确保设备处于串口调试模式下。
在应用程序中,用户可以使用相应的API来实现USB串口通信。
通过这些API,用户可以完成如打开串口、读取数据、写入数据等操作。
串口分时复用代码

串口分时复用代码【原创版】目录1.串口分时复用概述2.串口分时复用的实现原理3.串口分时复用的代码示例4.总结正文1.串口分时复用概述串口分时复用是一种允许多台设备共享同一条串口通信线路的技术。
通过时分复用技术,可以使得多台设备在共享的串口通信线路上进行数据传输,从而实现设备间的通信。
在电子设备、计算机外设、通信设备等领域,串口分时复用技术得到了广泛的应用。
2.串口分时复用的实现原理串口分时复用的实现原理主要基于时分复用的思想。
时分复用是将时间分为若干个时间段,每个时间段分配给一个设备进行数据传输。
通过轮流使用时间片,各个设备可以在同一条通信线路上进行数据传输。
具体实现时,需要为每个设备分配一个唯一的地址,以便在分时复用时能够正确识别各个设备的数据。
同时,需要设置一个时间片轮转机制,确保各个设备能够按照预定的顺序进行数据传输。
3.串口分时复用的代码示例以下是一个简单的串口分时复用的代码示例,使用 Python 语言编写。
```pythonimport timeimport serial# 配置串口ser = serial.Serial("COM3", 9600, timeout=1)# 定义设备地址列表address_list = [0x01, 0x02, 0x03]# 定义时间片轮转机制time_slice = 1000 # 1000mstime_step = 100 # 每次轮转的时间间隔,单位:ms while True:for addr in address_list:# 判断当前设备是否需要发送数据if addr == 0x01:# 发送数据ser.write(b"Hello, World!")time.sleep(time_slice)elif addr == 0x02:# 发送数据ser.write(b"Hello, Python!")time.sleep(time_slice)elif addr == 0x03:# 发送数据ser.write(b"Hello, Electronics!")time.sleep(time_slice)# 更新时间片轮转time_step -= 1if time_step <= 0:time_step = 100 # 重置时间间隔```4.总结本文介绍了串口分时复用的基本概念和实现原理,并通过一个简单的Python 代码示例进行了演示。
串口分时复用代码

串口分时复用代码摘要:1.串口分时复用简介2.串口分时复用的实现原理3.串口分时复用的代码示例4.总结正文:1.串口分时复用简介串口分时复用是一种允许多台设备通过单个串口进行通信的技术。
在分时复用模式下,每个设备在特定的时间片内独占串口,进行数据传输。
这种技术可以有效地提高串口的利用率,降低硬件成本。
2.串口分时复用的实现原理串口分时复用的实现原理主要基于串口的硬件流控制(Hardware Flow Control,HFC)功能。
通过配置串口控制字节,可以设置数据传输的方向、传输速率以及串口的工作模式。
在分时复用模式下,串口会在不同的时间片内分别接收和发送数据,从而实现多台设备之间的通信。
3.串口分时复用的代码示例以下是一个简单的串口分时复用代码示例,使用Python 语言编写。
假设我们要实现两个设备(设备A 和设备B)之间的通信:```pythonimport serialimport time# 配置串口参数ser = serial.Serial(port="COM1", # 串口名称baudrate=9600, # 波特率bytesize=8, # 数据位parity="N", # 校验位stopbits=1, # 停止位timeout=1 # 超时时间(秒))# 设备A 发送数据def send_data_A():ser.write(b"Hello, device B!")print("设备A 发送数据")# 设备B 发送数据def send_data_B():ser.write(b"Hello, device A!")print("设备B 发送数据")# 设备A 接收数据def receive_data_A():data = ser.read(100) # 读取100 个字节数据print("设备A 接收数据:", data)# 设备B 接收数据def receive_data_B():data = ser.read(100) # 读取100 个字节数据print("设备B 接收数据:", data)# 主循环,实现分时复用while True:send_data_A()time.sleep(1) # 延时1 秒send_data_B()time.sleep(1) # 延时1 秒receive_data_A()time.sleep(1) # 延时1 秒receive_data_B()time.sleep(1) # 延时1 秒```在这个示例中,我们首先导入了Python 的串口模块(serial)和时间模块(time),然后配置了串口的相关参数。
Android串口开发及读取完整数据的解决方法

Android串口开发及读取完整数据的解决方法串口发送实质就是向串口设备写入、读取字节流,和文件的操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴,本文介绍其中一种用法。
一、添加依赖在Module下的 build.gradle 中添加:implementation 'com.aill:AndroidSerialPort:1.0.8'二、检测权限首先要有ROOT权限,而且打开串口时,检测读写权限,当没有权限时,会尝试对其进行授权,默认su路径是/system/bin/su,有些设备su路径是/system/xbin/su:SerialPort.setSuPath("/system/xbin/su");三、串口打开及关闭/*** @param 1 串口路径* @param 2 波特率*@param 3 flags 给0就好*/SerialPort serialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0);//关闭串口serialPort.close();四、往串口中写入数据//从串口对象中获取输出流OutputStream outputStream = serialPort.getOutputStream();//定义需要发送的数据byte[] data = new byte[2];data[0] = 0x01;data[1] = 0x02;//写入数据outputStream.write(data);outputStream.flush();五、读取串口数据读取数据时候会遇到不能一次性读取正确的完整的数据,可以这样解决:1、在开始读取数据前,让读取数据的线程先睡眠一段时间,等待数据都准备好,再开始读取出来,这样应该可以避免大部分的分包情况2、如果是固定的数据长度,循环读取完固定长度的字节数据再退出//从串口对象中获取输入流InputStream inputStream = serialPort.getInputStream();//循环读取数据,放到子线程去,避免堵塞主线程boolean readContinue=true;new Thread(new Runnable() {@Overridepublic void run() {while (readContinue) {if (inputStream.available() > 0) {//等待一段时间再读取数据,基本上大部分情况下都是完整的数据Thread.sleep(50);byte[] buffer = new byte[12];int readCount=0;int availableCount=inputStream.available();//每次接收都是固定长度的字节while (readCount < 12 && availableCount > 0) {readCount += inputStream.read(buffer, readCount, 12 -readCount);Thread.sleep(5);availableCount = inputStream.available();}}}}}).start();3、在实际开发中,有一种应用场景是先发送数据到开发板,开发板再响应返回数据,而且是循环发送读取数据,时间间隔要求极其短,很可能出现了数据错乱情况,可以先在发送数据前判断输入流中有无数据,有数据时先读取完流中的数据。
用c语言实现串口读写程序

用c语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。
在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。
本文将介绍如何使用C语言实现串口读写程序。
二、硬件准备在进行串口通信之前,需要准备好相应的硬件设备。
一般来说,需要一台计算机和一个串口转USB模块(或者直接使用带有串口接口的计算机)。
同时,在单片机端也需要连接一个串口模块。
三、C语言编程实现1. 打开串口在C语言中,可以通过打开文件的方式来打开串口设备。
下面是一个示例代码:```#include <stdio.h>#include <fcntl.h>#include <termios.h>int open_serial_port(const char *device_path, int baud_rate) {int fd;struct termios options;fd = open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror("open_serial_port: Unable to open device");return -1;}fcntl(fd, F_SETFL, 0);tcgetattr(fd, &options);cfsetispeed(&options, baud_rate);cfsetospeed(&options, baud_rate);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;tcsetattr(fd, TCSANOW, &options);return fd;}```在上述代码中,open_serial_port函数用来打开串口设备,并设置相应的参数。
串口的工作原理

串口的工作原理
串口是用于数据传输的通信接口,它通过传递一个字节序列来完成数据的发送和接收。
串口的工作原理主要包括以下几个方面:
1. 传输格式:串口通信采用串行传输方式,即按照比特顺序逐个传输数据位。
常见的传输格式有起始位、数据位、奇偶校验位和停止位组成。
起始位用于同步接收端和发送端的时钟信号,数据位用于传递实际的数据,奇偶校验位用于检测传输过程中发生的位错误,停止位用于表示数据传输结束。
通过这些格式要求可以保证数据的正确传输和接收。
2. 波特率:串口通信采用一种称为波特率(Baud Rate)的指
标来衡量数据传输速率,即每秒传输的比特数。
常见的波特率有9600 bps、115200 bps等。
发送和接收端在通信之前必须事
先约定一个相同的波特率。
3. 缓冲区:串口通信中,发送和接收的数据通过缓冲区进行中转。
发送端将待发送的数据存储在发送缓冲区中,然后根据波特率逐个比特进行数据的发送。
接收端会不断读取接收缓冲区中的数据,然后进行后续的处理。
4. 握手协议:为了保证数据的可靠传输,串口通信中还有一些握手协议,如RTS/CTS(请求发送/清除发送)和DTR/DSR (数据终端就绪/数据设备就绪)。
通过这些握手信号,发送
端和接收端可以进行数据发送的控制和同步。
5. 数据传输协议:串口通信中的数据传输可以采用不同的协议,如RS-232、RS-485等。
这些协议规定了数据传输的电气特性、物理接口和通信规范。
总之,串口通过比特连续传输实现数据的发送和接收,通过传输格式、波特率、缓冲区、握手协议和数据传输协议等机制保证数据的可靠传输和接收。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:。
下面我分别对JNI、以及串口的一些知识点和实现的源码进行分析说明。
这里主要是参考了开源项目android-serialport-api。
串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习。
在Java中如果要实现串口的读写功能只需操作文件设备类:即可,其他的事都由驱动来完成不用多管!当然,你想了解,那就得看驱动代码了。
这里并不打算对驱动进行说明,只初略阐述应用层的实现方式。
(一)JNI:
关于JNI的文章网上有很多,不再多做解释,想详细了解的朋友可以查看云中漫步的技术文章,写得很好,分析也很全面,那么在这篇拙文中我强调3点:
1、如何将编译好的SO文件打包到APK中?(方法很简单,直接在工程目录下新建文件夹libs/armeabi,将SO文件Copy到此目录即可)
2、命名要注意的地方?(在编译好的SO文件中,将文件重命名为:lib即可。
其中是编译好后生成的文件)
3、MakeFile文件的编写(不用多说,可以直接参考package/apps目录下用到JNI的相关项目写法)
这是关键的代码:
[cpp]view plaincopy
(二):
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。
文件描述符的主要实际用途是创建一个包含该结构的或。
这是API的描述,不太好理解,其实可简单的理解为:就是对一个文件进行读写。
(三)实现串口通信细节
1) 建工程:SerialDemo包名:org.winplus.serial,并在工程目录下新建jni和libs两个文件夹和一个org.winplus.serial.utils,如下图:
2) 新建一个类:SerialPortFinder,添加如下代码:
[java]view plaincopy
1.<span style="font-size:18px;">package org.winplus.serial.utils;
2.
3.import java.io.File;
4.import java.io.;
5.import java.io.IOException;
6.import java.io.LineNumberReader;
7.import java.util.Iterator;
8.import java.util.Vector;
9.
10.import android.util.Log;
11.
12.public class SerialPortFinder {
13.
14.private static final String TAG = "SerialPort";
15.
4)新建一个Application 继承android.app.Application,用来对串口进行初始化和关闭串口
5)新建一个继承抽象的Activity类,主要用于读取串口的信息
6)编写string.xml 以及baudrates.xml文件在string.xml文件中添加:
在baudrates.xml文件中添加
7)开始编写界面了:在main.xml布局文件中添加两个编辑框,一个用来发送命令,一个用来接收命令:
8)SerialDemoActivity类的实现:[java]view plaincopy
写到这里,代码基本上写完了。
下面就是要实现JNI层的功能了,要实现JNI,必须首先生成头文件,头文件的生成方式也很简单,我们编译工程,在终端输入javah
org.winplus.serial.utils.SerialPort 则会生成头文件:org_winplus_serial_utils_SerialPort.h,这个头文件的名字可以随意命名。
我们将它命名为:SerialPort.h拷贝到新建的目录jni中,新建SerialPort.c 文件,这两个文件的代码就不贴出来了。
直接到上传的代码中看吧。
(四)串口的应用,可实现扫描头,指纹识别等外围USB转串口的特色应用。