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串口通信解决方案

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串口通信原理

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串口开发及读取完整数据的解决方法串口发送实质就是向串口设备写入、读取字节流,和文件的操作很相似,安卓官方已经提供了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语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。

在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。

本文将介绍如何使用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等。

这些协议规定了数据传输的电气特性、物理接口和通信规范。

总之,串口通过比特连续传输实现数据的发送和接收,通过传输格式、波特率、缓冲区、握手协议和数据传输协议等机制保证数据的可靠传输和接收。

串口通信原理及操作流程

串口通信原理及操作流程

2.3 RS-485接口
RS-485是RS-422A的变型 :RS-422A用于全双工,而 RS-485则还可用于半双工。 RS-485是一种多发送器标准 ,在通信线路上最多可以使用 32 对差分驱动器/接收器。 RS-485的信号传输采用 两线间的电压来表示逻辑1和逻 辑0。由于发送方需要两根传输 线,接收方也需要两根传输线 。传输线采用差动信道,所以 它的干扰抑制性极好,又因为 它的阻抗低,无接地问题,所 以传输距离可达1200米,传 输速率可达1Mbps。
典型应用: PC + 直连电缆 + Modem
TXD 计 RXD 算 机 甲
TXD RXD 计 算 机 乙
计 算 机 甲
TXD RXD 4 5 6 20
TXD RXD 4 计 5 算 6 机 20 乙
近程通信连接
RS-232C接口存在的问题
1
2
3
传输距离短 ,传输速率 低
有电平偏移
抗干扰能力 差
第六讲串口通信原理及操作流程
曾铁军
主要内容
1 2
串行通信基础知识
串行通信总线标准及其接口
3 4
MCS-51的串行接口
51单片机串口应用举例
实例1
信息编码:文字 信息载体:文字、 纸张 信息传送方式: 邮递员
实例2
第一步 第二步 提问 说出同学A的名字或学号
课堂上老师先让同学A、 再让同学B回答问题的 过程?
串行通信 通信距离 远
并行通信 近
抗干扰能力
传输速度 成本

慢 低

快 高
异步通信与同步通信
1.异步通信 异步通信是指通信的发送与接收设备使 用各自的时钟控制数据的发送和接收过程。 为使双方的收发协调,要求发送和接收设 备的时钟尽可能一致。

基本串口通信程序设计

基本串口通信程序设计

基本串口通信程序设计串口通信是指通过串行接口进行数据传输的一种通信方式。

串口通信通常用于短距离的数据传输,具有稳定性强、传输速率低的特点。

本文将介绍串口通信的基本原理和程序设计。

一、串口通信基本原理串口通信是通过串行接口将数据一位一位地传输的通信方式。

串口通信的基本原理是使用两根信号线进行通信:一根是传输数据的信号线(TX),负责向外发送数据;另一根是接收数据的信号线(RX),负责接收外部发送过来的数据。

二、串口通信程序设计步骤1. 打开串口:首先需要通过操作系统提供的串口接口函数,打开需要使用的串口。

在Windows系统中,可以使用CreateFile函数打开串口;在Linux系统中,可以使用open函数打开串口。

3. 发送数据:使用WriteFile函数(Windows系统)或write函数(Linux系统),向串口发送需要传输的数据。

4. 接收数据:使用ReadFile函数(Windows系统)或read函数(Linux系统),从串口接收数据。

5. 关闭串口:数据传输完成后,需要关闭串口,使用CloseHandle函数(Windows系统)或close函数(Linux系统)即可关闭串口。

三、串口通信程序设计示例(Windows系统)下面是一个简单的串口通信程序设计示例,实现了从串口接收数据并将接收的数据原样返回的功能。

#include <iostream>#include <windows.h>int mainHANDLE hSerial;DCB dcbSerialParams = {0}; // 串口参数hSerial = CreateFile("COM1", GENERIC_READ , GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 打开串口dcbSerialParams.DCBlength = sizeof(dcbSerialParams);std::cout << "Error getting serial port state\n";return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;std::cout << "Error setting serial port state\n";return 1;}return 1;}char buffer[100];DWORD bytesRead;while (1)if (ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0)std::cout << "Received data: " << buffer << std::endl;DWORD bytesWritten;if (!WriteFile(hSerial, buffer, bytesRead, &bytesWritten, NULL))std::cout << "Error writing to serial port\n";return 1;}}}CloseHandle(hSerial); // 关闭串口return 0;以上程序打开串口COM1,设置波特率为9600,数据位为8位,停止位为1位。

串口传输实验原理

串口传输实验原理

串口传输实验原理串口传输是一种常见的数据传输方式,它通过串行通信的方式将数据从一个设备传输到另一个设备。

串口传输通常用于连接计算机和外部设备,例如打印机、调制解调器、传感器等。

本文将介绍串口传输的原理和实验方法。

一、串口传输的原理串口传输是一种基于异步通信的数据传输方式。

异步通信是指数据传输时没有固定的时钟信号,而是通过发送和接收方之间的协议来确定数据的传输速率和传输时序。

串口传输通常使用RS-232协议进行通信,该协议定义了数据传输的格式和电气特性。

串口传输的数据传输格式通常包括起始位、数据位、校验位和停止位。

起始位用于标识数据传输的开始,通常为逻辑0。

数据位用于传输实际的数据,通常为8位或9位。

校验位用于检测数据传输的正确性,通常为奇偶校验或循环冗余校验。

停止位用于标识数据传输的结束,通常为逻辑1。

串口传输的电气特性包括信号电平、波特率和数据位宽。

信号电平通常为±12V或±5V,波特率通常为9600bps或115200bps,数据位宽通常为8位或9位。

这些参数需要在发送和接收方之间进行协商,以确保数据传输的正确性和稳定性。

二、串口传输的实验方法为了验证串口传输的原理,我们可以进行一些简单的实验。

下面是一个基于Arduino的串口传输实验。

1. 实验材料- Arduino UNO开发板- USB数据线- 串口调试助手软件2. 实验步骤(1)将Arduino UNO开发板连接到计算机上,并打开Arduino IDE软件。

(2)在Arduino IDE软件中,打开“串口接收器”示例程序,并将波特率设置为9600bps。

(3)将Arduino UNO开发板通过USB数据线连接到计算机上,并上传“串口接收器”示例程序到开发板中。

(4)打开串口调试助手软件,并将波特率设置为9600bps。

在串口调试助手软件中,选择正确的串口号和数据位宽。

(5)在串口调试助手软件中,输入一些字符或数字,并点击“发送”按钮。

串口通信源代码

串口通信源代码
// txtest.cpp : 定义控制台应用程序的入口点。
//
#include "tdafx.h"
#include <iostream>
// #include <cv.h>
// #include <highgui.h>
/*#include <cstring>*/
#include<windows.h>
//myDCB.fBinary = TRUE;
//myDCB.fParity = FALSE;
myDCB.ByteSize = 8;
myDCB.Parity = NOPARITY;
myDCB.StopBits = ONESTOPBIT;
SetCommState(hCom, &myDCB);
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB myDCB;
GetCommState(hCom, &myDCB);
myDCB.BaudRate = 9600;
ReceiveData(hCom, rdata);
cout << (BYTE)(rdata[0]) <<"%%%%%%%"<< (BYTE)(rdata[1]) << endl;
cout << "收到数据!" << endl;
if(i>=250 ) break;

模拟串口的三种方法及C语言

模拟串口的三种方法及C语言

模拟串口的三种方法及C语言模拟串口是软件中模拟实现串口通信的一种方法,它是在电脑上通过软件模拟两个串口之间的传输,用来测试、调试串口相关的应用程序。

本文将介绍三种常见的模拟串口的方法,并提供C语言代码示例。

1.使用虚拟串口软件虚拟串口软件是一种用于模拟串口通信的应用程序。

它创建了虚拟的串口设备,使其在电脑上模拟出真实的串口通信环境。

通过虚拟串口软件,可以实现串口的模拟收发数据,可以连接到串口测试工具、串口调试工具或者自己编写的串口通信程序上。

以下是一个使用虚拟串口软件模拟串口通信的C语言代码示例:```c#include <stdio.h>#include <windows.h>int mai//打开虚拟串口//检测串口是否成功打开printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口return 0;```在这个示例中,我们使用了Windows操作系统的函数`CreateFile`来打开一个虚拟串口,这里的串口名称是"COM1"。

然后可以调用相关函数进行串口通信操作,最后用`CloseHandle`函数关闭串口。

2.使用串口驱动模拟在一些情况下,可以通过修改电脑的串口驱动程序来模拟串口通信。

这种方法需要更深入的了解操作系统的底层机制,并进行驱动程序的开发和修改。

通过修改串口驱动程序,可以模拟出一个虚拟的串口设备,通过这个设备进行串口通信。

以下是一个简单的C语言代码示例,用于修改串口驱动程序来模拟串口通信:```c#include <stdio.h>#include <fcntl.h>#include <unistd.h>int maiint fd;//打开串口设备fd = open("/dev/ttyS0", O_RDWR);//检测串口是否成功打开if (fd < 0)printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口设备close(fd);return 0;```在这个示例中,我们使用了Linux操作系统的函数`open`来打开一个串口设备,这里的设备名称是"/dev/ttyS0"。

串口电路原理

串口电路原理

串口电路,即串行通信接口电路,是一种用于数据传输的电子电路设计,通常指的是RS-232、RS-422、RS-485等标准的串行通信接口。

这些接口主要用于计算机、嵌入式系统以及其他电子设备之间的数据交换。

基本原理:
1. 信号格式:
串行通信是指数据一位接一位地按照时间顺序进行传输,而不是像并行通信那样同时发送多位数据。

在串口电路中,数据通常包括起始位、数据位(一般为5至9位)、奇偶校验位(可选)、停止位(1或2位)。

2. 电平转换:
RS-232标准规定了TTL电平到RS-232电平的转换要求。

TTL电平是逻辑器件常用的0V和+5V(或者3.3V),而RS-232电平则采用了负电压表示逻辑“1”,正电压表示逻辑“0”的非对称方式,例如-12V代表逻辑"1",+12V代表逻辑"0"。

3. 通信协议:
串口电路还包括握手信号线(如RTS/CTS、DTR/DSR等)以实现设备间的控制和同步。

通过设置合适的波特率(每秒
传输的位数)、数据格式以及握手协议,确保数据正确无误地在两台或多台设备间进行收发。

4. 电气特性:
串口电路需要满足特定的电气规范,如最大数据传输速率、信号的最大电压摆幅、最小接收器输入阈值等。

在实际应用中,串口电路通常由一个UART(通用异步收发传输器)控制器芯片和必要的电平转换电路组成,能够将CPU处理的数据转化为适合电缆传输的电信号,并且可以接收来自电缆的信号并转换回CPU可以理解的数字信号。

windows与android usb串口通信原理

windows与android usb串口通信原理

windows与android usb串口通信原理USB串口通信是一种常见的通信方式,它通过USB接口来实现计算机与外部设备的通信。

在Windows操作系统和Android操作系统中,USB串口通信都是非常常用的技术。

本文将介绍Windows和Android中USB串口通信的原理。

一、Windows中的USB串口通信在Windows中,USB串口通信是通过Windows驱动程序来实现的。

Windows驱动程序包括USB控制器驱动程序和串口通信驱动程序。

USB控制器驱动程序负责管理USB接口,将USB数据传输转换为串口数据传输。

串口通信驱动程序负责与外部设备通信,将串口数据传输转换为计算机可以理解的数据格式,并将计算机的数据传输给外部设备。

在Windows中,串口通信通常使用异步通信方式,即一个线程负责发送数据,另一个线程负责接收数据。

当计算机需要与外部设备通信时,它会创建一个串口通信线程,并打开相应的串口。

串口通信线程会不断地读取外部设备的响应数据,并将其传递给应用程序。

二、Android中的USB串口通信在Android中,USB串口通信的实现方式与Windows有所不同。

在Android 中,USB串口通信是通过Android驱动程序和Android操作系统来实现的。

Android驱动程序包括USB控制器驱动程序和串口通信驱动程序。

Android中的串口通信通常使用同步通信方式,即应用程序和外部设备之间直接进行通信,不需要通过其他线程或进程。

当应用程序需要与外部设备通信时,它会打开相应的串口,并直接与外部设备进行数据传输。

在Android中,USB串口通信的实现需要使用Android USB开发框架。

开发者可以使用Java语言编写应用程序,并通过Android USB开发框架来访问外部设备的数据接口。

开发者需要了解Android USB开发框架中的相关API和数据格式,以便正确地与外部设备进行通信。

串口编程的一般步骤及相关函数讲解

串口编程的一般步骤及相关函数讲解

串口编程的一般步骤及相关函数讲解串口编程是指通过串口与外部设备进行通信的程序设计。

一般步骤包括串口初始化、设置串口参数、打开串口、发送数据、接收数据和关闭串口等。

1. 串口初始化:首先需要导入串口编程相关的库文件,如pyserial 库。

然后通过serial.Serial(函数创建一个串口对象,指定串口号、波特率、停止位、数据位等参数,如:``````这里将串口号设置为/dev/ttyUSB0,波特率设置为9600,超时时间设置为1秒。

2.设置串口参数:通过串口对象的相关方法设置串口参数,如:```serial_port.setBaudrate(9600)serial_port.setParity(serial.PARITY_NONE)serial_port.setStopbits(serial.STOPBITS_ONE)serial_port.setByteSize(serial.EIGHTBITS)```这里设置了波特率为9600,无奇偶校验位,1位停止位,8位数据位。

3. 打开串口:使用串口对象的open(方法打开串口,如:serial_port.open```注意,打开串口之前要确保串口没有被其他程序占用。

4. 发送数据:使用串口对象的write(方法向串口发送数据,如:```data = 'Hello, World!'serial_port.write(data.encode()```这里将字符串'Hello, World!'转码为字节型数据并发送到串口。

5. 接收数据:使用串口对象的read(方法从串口读取数据,如:```received_data = serial_port.read(10)print(received_data.decode()```这里从串口读取10字节的数据,并将其解码为字符串输出。

6. 关闭串口:使用串口对象的close(方法关闭串口,如:```serial_port.close在程序结束时,记得关闭串口以释放资源。

android串口通信实例分析

android串口通信实例分析

android串口通信实例分析置顶] android串口通信实例分析分类: android 2012-05-21 23:31 118人阅读评论(4) 收藏举报android 串口通信实例分析,用的时开源的android-serialport-api这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖~~~~~~~~~先说jni接口吧,原本文件太多,其实只需要SerialPort.c和Android.mk就可以实现Serialport.c[java]view plaincopy?1.#include <stdio.h>2.#include <stdlib.h>3.#include <unistd.h>4.#include <sys/types.h>5.#include <sys/stat.h>6.#include <fcntl.h>7.#include <termios.h>8.#include <errno.h>9.#include <jni.h>10.#include <android/log.h>11.12.#define LOGI(...) ((void)__android_log_print(ANDROID_ LOG_INFO, "", __VA_ARGS__))//在logcat上打印信息用13.//#define LOGD(fmt, args...) __android_log_print(ANDR OID_LOG_DEBUG, TAG, fmt, ##args)14.//#define LOGE(fmt, args...) __android_log_print(ANDR OID_LOG_ERROR, TAG, fmt, ##args)15.16.static speed_t getBaudrate(jint baudrate)17.{18.switch(baudrate) {19.case 0: return B0;20.case 50: return B50;21.case 75: return B75;22.case 110: return B110;23.case 134: return B134;24.case 150: return B150;25.case 200: return B200;26.case 300: return B300;27.case 600: return B600;28.case 1200: return B1200;29.case 1800: return B1800;30.case 2400: return B2400;31.case 4800: return B4800;32.case 9600: return B9600;33.case 19200: return B19200;34.case 38400: return B38400;35.case 57600: return B57600;36.case 115200: return B115200;37.case 230400: return B230400;38.case 460800: return B460800;39.case 500000: return B500000;40.case 576000: return B576000;41.case 921600: return B921600;42.case 1000000: return B1000000;43.case 1152000: return B1152000;44.case 1500000: return B1500000;45.case 2000000: return B2000000;46.case 2500000: return B2500000;47.case 3000000: return B3000000;48.case 3500000: return B3500000;49.case 4000000: return B4000000;50.default: return -1;51.}52.}53.54./*55.* Class: com.huangcheng.serial.SerialPort56.* Method: open57.* Signature: (Ljava/lang/String;II)Ljava/io/FileDescripto r;58.*59.* 用于打开串口,配置串口参数,包括的参数有path(需要打开的串口设备文件路径),baudrate(波特率),flags(打开串口的参数,如O_NONBLOCK之类的,可以随不同情况设置)60.* 其串口数据的读取是用FileDescriptor来实现的61.*62.*/63.JNIEXPORT jobject JNICALL Java_com_huangcheng_se rial_SerialPort_open64.(JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)65.{66.int fd;67.speed_t speed;68.jobject mFileDescriptor;69.70./* Check arguments */71.{72.speed = getBaudrate(baudrate);73.if (speed == -1) {74./* TODO: throw an exception */75.LOGI("Invalid baudrate");76.return NULL;77.}78.}79.80./* Opening device */81.{82.jboolean iscopy;83.const char *path_utf = (*env)->GetStringUTFChars(env , path, &iscopy);84.LOGI("Opening serial port %s with flags 0x%x", path_u tf, O_RDWR | flags);85.fd = open(path_utf, O_RDWR | flags);86.LOGI("open() fd = %d", fd);87.(*env)->ReleaseStringUTFChars(env, path, path_utf);88.if (fd == -1)89.{90./* Throw an exception */91.LOGI("Cannot open port");92./* TODO: throw an exception */93.return NULL;94.}95.}96.97./* Configure device */98.{99.struct termios cfg;100.LOGI("Configuring serial port");101.if (tcgetattr(fd, &cfg))102.{103.LOGI("tcgetattr() failed");104.close(fd);105./* TODO: throw an exception */106.return NULL;107.}108.109.cfmakeraw(&cfg);110.cfsetispeed(&cfg, speed);111.cfsetospeed(&cfg, speed);112.113.if (tcsetattr(fd, TCSANOW, &cfg))114.{115.LOGI("tcsetattr() failed");116.close(fd);117./* TODO: throw an exception */118.return NULL;119.}120.}121.122./* Create a corresponding file descriptor */123.{124.jclass cFileDescriptor = (*env)->FindClass(env, "java/io /FileDescriptor");125.jmethodID iFileDescriptor = (*env)->GetMethodID(en v, cFileDescriptor, "<init>", "()V");126.jfieldID descriptorID = (*env)->GetFieldID(env, cFileDe scriptor, "descriptor", "I");127.mFileDescriptor = (*env)->NewObject(env, cFileDescri ptor, iFileDescriptor);128.(*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint)fd);129.}130.131.return mFileDescriptor;132.}133.134./*135.* Class: com.huangcheng.serial.SerialPort136.* Method: close137.* Signature: ()V138.*139.* 用于串口关闭140.*/141.JNIEXPORT void JNICALL Java_com_huangcheng_serial _SerialPort_close142.(JNIEnv *env, jobject thiz)143.{144.jclass SerialPortClass = (*env)->GetObjectClass(env, th iz);145.jclass FileDescriptorClass = (*env)->FindClass(env, "jav a/io/FileDescriptor");146.147.jfieldID mFdID = (*env)->GetFieldID(env, SerialPortCla ss, "mFd", "Ljava/io/FileDescriptor;");148.jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");149.150.jobject mFd = (*env)->GetObjectField(env, thiz, mFdID );151.jint descriptor = (*env)->GetIntField(env, mFd, descrip torID);152.153.LOGI("close(fd = %d)", descriptor);154.close(descriptor);155.}Android.mk[plain]view plaincopy?1.LOCAL_PATH := $(call my-dir)2.3.include $(CLEAR_VARS)4.5.LOCAL_MODULE := serial_port6.LOCAL_SRC_FILES := SerialPort.c7.8.LOCAL_LDLIBS := -llog9.include $(BUILD_SHARED_LIBRARY)然后,直接在目录下ndk-build一下,便可得到我们需要的lib库文件。

Android串口通信解决方案

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),按“增加”即可。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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转串口的特色应用。

相关文档
最新文档