SerialPort_app

合集下载

中星9号升级破解46台软件工具讲解

中星9号升级破解46台软件工具讲解

引子:中星9号接收机全4类芯片:海尔(Hi2023,Hi2023E),华亚HTV903(F),国芯(GX3001,GX6121 ),阿里(ALiM3330E)的,等.为了避免刷成砖头,请认真参考以下内容!硬件准备:万用电表。

串口刷机板(TTL转接板。

可以自制,现成的也需要自制各种联机插线),标准串口延长线(用于使用标准9芯串口的接收机)万用电表:世人皆知。

用于判断各类接收机升级数据接口各引脚功能。

与电脑连接硬件:如果是标准9芯串口插头,直接使用标准串口延长线。

如果是4线或5线插排,请使用TTL转接板接入电脑的串口。

串口刷机板:自制的(成本6元左右,一个串口插头,max232集成电路,电解等),网上也有卖(大约12元钱+运费),自制电路图纸网上随便就可以找到,就是一个max232芯片以及一些辅助原件。

刷机板自身工作电源无法像图纸上那样从串口获得,可以从5线数据线的4脚得到14V然后经过78L05稳压供给。

但4线的数据接口标称3.3V(有些好像标5V的,未测),故本人从USB端口供电,直供5V,未使用耦合电路也是成功的,建议大家从USB端口直接供电。

只要找到一个退休的USB鼠标或摄像头剪下插头即可,非常实用。

该板连接接收机最终是3根线:公用地线,读数据,写数据。

用万用表判断4线或5线的数据接口:地线:不用说了吧?就是和高频头外壳直通的那根!呵呵!电源线:无论是多高的电压,电源相对于任何数据引脚都有相对较小的对地电阻,对地反向二极管导通性更明显。

数据读写线:两个引脚靠在一起,万用表实测电压为3.3V,而且紧靠接地脚。

至于哪个是输入那个是输出,应该看板子上的标注。

当然有些板子没有标注。

本人没动脑筋!做了两个数据插头(接地线总归在边上),通吃所有4或5线数据口。

刷机工具软件:海尔芯片2023或2023E使用ABS_Flasher_V1.6。

HTV903芯片使用serial(备份使用serial_dump,升级使用serial_app)。

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、在实际开发中,有一种应用场景是先发送数据到开发板,开发板再响应返回数据,而且是循环发送读取数据,时间间隔要求极其短,很可能出现了数据错乱情况,可以先在发送数据前判断输入流中有无数据,有数据时先读取完流中的数据。

SerialPort控件的使用

SerialPort控件的使用

ms-help://MS.VSCC.v80/MS.MSDN.v80/DE‎V FX.v20.chs/cpref‎8/html/T_Sys‎t em_I‎O_P or‎t s_Se‎r ialP‎o rt_M‎e mber‎s.htm//串口控件一.概述在Visu‎a l Studi‎o 6.0中编写串‎口通讯程序‎,一般都使用‎M icro‎s oft Commu‎n icat‎i on Contr‎o l(简称MSC‎o mm)的通讯控件‎,只要通过对此控件‎的属性和事‎件进行相应‎编程操作,就可以轻松‎地实现串口‎通讯。

但在Mic‎r osof‎技术‎广泛应用的‎今天,Visua‎l Studi‎没有‎将此控件加‎入控件库,所以人们采‎用了许多方‎法在Vis‎u al Studi‎来编‎写串口通讯‎程序:第一种方法‎是通过采用‎V isua‎l Studi‎o 6.0中原来的‎M SCom‎m控件这是‎最简单的,最方便的方‎法,但需要注册‎;第二种方法‎是采用微软‎在.NET推出‎了一个串口‎控件,基于.NET的P‎/Invok‎e调用方法‎实现;第三种方法‎是自己用A‎P I 写串口‎通信,虽然难度高‎,但可以方便‎实现自己想‎要的各种功‎能。

现在微软推‎出了最新版‎本的Vis‎u al Studi‎o 2005开‎发工具,可以不再采‎用第三方控‎件的方法来‎设计串口通‎讯程序。

NET Frame‎w ork 2.0 类库包含了‎S eria‎l Port‎类,方便地实现‎了所需要串‎口通讯的多‎种功能,为了使MS‎C omm 编‎程方法快速‎转换到以S‎e rial‎P ort类‎为核心的串‎口通讯的设‎计方法,本文着重讨‎论了Vis‎u al Studi‎o 6.0的MSC‎o mm控件‎和Seri‎a lPor‎t类设计方法‎的异同点。

二.Seria‎l Port‎常用属性、方法和事件‎1.命名空间Syste‎m.IO.Ports‎命名空间包‎含了控制串‎口重要的S‎e rial‎P ort类‎,该类提供了‎同步I/O 和事件驱动‎的I/O、对管脚和中‎断状态的访‎问以及对串‎行驱动程序‎属性的访问‎,所以在程序‎代码起始位‎置需加入U‎s ing Syste‎m.IO.Ports‎。

Java串口通信编程指导

Java串口通信编程指导

Java串口通信编程指导Java串口通信编程概述在java中,利用Java Communication包能够操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,只是在XP下还能使用。

另外,也能够用开源的Rxtx实现串口通信,那个地点仅以Java Communication包,在Windows平台实现串口通信进行讲明。

前期预备下载Java Communication包下载地址如下:/Jolt/javacomm20-win32.zip。

配置解压缩javacomm20-win32.zip把win32com.dll拷贝到{JA V A_HOME}\jre\bin把comm.jar拷贝到{JA V A_HOME}\jre\lib\extset CLASSPATH={JA V A_HOME}\jre \lib\ext \comm.jar;%classpath%实现过程要紧步骤包括:获得串口标识打开串口设置串行端口通讯参数猎取输入(出)流进行读写操作获得串口标识指定串口的端口号,生成串口的标识类的实例。

a. 通过驱动决定通讯端口是可用的。

b. 打开通讯端口为了I/O操作。

c. 决定端口的拥有者。

d. 解析端口拥有者的争夺。

e. 治理事件显示在端口拥有者的中的状态改变。

示例代码如下:代码:打开串口示例代码如下:代码:5000(毫秒)是超时时刻。

设置串行端口通讯参数设置串口传输的波特率、数据位、停止位、奇偶校验等参数。

示例代码如下:代码:try {// 通信条件の設定// 通信速度 9600 baud// データビット 8bit// ストップビット 1bit// パリティなし// フローコントロールの設定// 無制御を使用port.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);} catch (UnsupportedCommOperationException ex) {ex.printStackTrace();System.exit(1);}猎取输入(出)流利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。

SerialPort与MSComm 详解

SerialPort与MSComm 详解

VB,C# MSComm控件的用法与详细介绍MSComm 是控件MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。

MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API 函数,而且在VC、VB、Delphi与C#等语言中均可使用。

Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。

具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。

1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。

在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。

在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。

OnComm 事件还可以检查和处理通讯错误。

所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。

在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。

这种方法的优点是程序响应及时,可靠性高。

每个MSComm 控件对应着一个串行端口。

如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。

1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。

在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。

如果应用程序较小,并且是自保持的,这种方法可能是更可取的。

例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。

c++中的serialport用法

c++中的serialport用法

C++中的SerialPort用法一、概述在C++编程中,SerialPort(串口)是一种常用的通信方式。

它可以用于连接各种外部设备,进行数据传输和通信。

本文将详细介绍在C++中如何使用SerialPort,并且通过实例演示其用法。

二、SerialPort的基本概念1. 串口是一种通过串行通信接口进行数据传输的设备,它通过一根线缆(串口线)进行数据传输。

2. 串口通信有多种标准,如RS-232、RS-485等,不同的标准有不同的电气特性和数据传输速率。

3. 在C++中,可以使用串口库来实现串口通信,常见的串口库有Boost.Asio、Qt SerialPort等。

三、使用Boost.Asio进行串口通信Boost.Asio是一个开源的C++库,用于实现异步I/O操作。

它提供了丰富的网络和串口通信功能,可以方便地进行串口通信开发。

1. 安装Boost库在使用Boost.Asio之前,首先需要安装Boost库。

可以从Boost全球信息站(网络协议sxxx)下载最新版本的Boost库,并按照全球信息站提供的安装说明进行安装。

2. 创建SerialPort对象在C++中使用Boost.Asio库进行串口通信,首先需要创建一个SerialPort对象,并指定串口名称、波特率等参数。

```c++#include <boost/asio.hpp>using namespace boost::asio;// 创建SerialPort对象io_service io;serial_port serial(io, "COM1"); // 指定串口名称serial.set_option(serial_port::baud_rate(9600)); // 设置波特率```3. 读写串口数据创建好SerialPort对象之后,即可通过它进行串口数据的读写操作。

```c++// 向串口写入数据std::string write_data = "Hello, SerialPort!";write(serial, buffer(write_data));// 从串口读取数据char read_data[100];size_t len = read(serial, buffer(read_data, 100));```4. 异步串口通信Boost.Asio库支持异步串口通信,可以通过回调函数处理串口数据的读写操作。

SerialPort类的用法与示例

SerialPort类的用法与示例

SerialPort类的⽤法与⽰例Microsoft .Net框架SerialPort类的⽤法与⽰例从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,⽤户可以⾮常简单地编写少量代码就完成串⼝的信息收发程序。

本⽂将介绍如何在PC端⽤C# .Net 来开发串⼝应⽤程序。

1. 串⼝硬件信号定义DB9 Connector 信号定义针脚信号定义作⽤1DCD载波检测Received Line Signal Detector(Data Carrier Detect)2RXD接收数据Received Data3TXD发送数据Transmit Data4DTR数据终端准备好Data Terminal Ready5SGND信号地Signal Ground6DSR数据准备好Data Set Ready7RTS请求发送Request To Send8CTS清除发送Clear To Send9RI振铃提⽰Ring Indicator2. 串⼝端⼝号搜索⼀个最简单的办法:string[] portList = System.IO.Ports.SerialPort.GetPortNames();for (int i = 0; i < portList.Length; i++){string name = portList[i];comboBox.Items.Add(name);}还有⼀种通过调⽤API的⽅法来获取实现,可以获取详细的完整串⼝名称,对于USB-to-COM虚拟串⼝来说特别适⽤。

通过下⾯程序可以获取到与设备管理器中⼀样的名字,例如“Prolific USB-to-Serial Comm Port(COM34)”,⽽上⾯的⽅法只能获取到“COM34”。

/// <summary>/// 枚举win32 api/// </summary>public enum HardwareEnum{// 硬件Win32_Processor, // CPU 处理器Win32_PhysicalMemory, // 物理内存条Win32_Keyboard, // 键盘Win32_PointingDevice, // 点输⼊设备,包括⿏标。

serial_port 用法

serial_port 用法

一、什么是串口串口是计算机与外部设备进行数据通信的一种接口,通过串口可以实现计算机与外部设备之间的数据传输。

通常情况下,串口包括一个发送线路和一个接收线路,用于传输数据。

串口通信可以通过物理连接或虚拟连接进行,常见的物理连接方式包括RS232,RS422和RS485等,而虚拟连接方式则包括USB转串口、蓝牙串口等。

二、串口的使用场景1. 工业控制领域在工业控制领域,串口被广泛应用于PLC(可编程逻辑控制器)、传感器、仪器仪表等设备的数据通信中。

通过串口,这些设备可以向主控计算机发送数据,或者接收主控计算机发送的控制指令,实现自动化控制。

2. 嵌入式系统开发在嵌入式系统开发中,串口通信也扮演了重要的角色。

开发人员可以通过串口与嵌入式设备进行通信,进行程序烧录、调试、数据传输等操作,方便对嵌入式设备进行控制和管理。

3. 通信设备通信设备如调制解调器、路由器等网络设备,也常使用串口进行数据传输和控制,例如通过串口进行配置、升级、诊断等操作。

4. 数据采集与监控在数据采集与监控系统中,串口可以连接各种传感器和监控设备,实现实时数据的采集和监控。

气象站、环境监测站的数据采集设备,通过串口与上位机进行数据传输。

三、串口的基本使用方法1. 串口的配置在使用串口进行通信之前,首先需要对串口进行配置,如波特率、数据位、停止位、奇偶校验等。

这些配置需要与通信的外部设备保持一致,才能够确保正常的数据传输。

2. 串口的打开和关闭在进行串口通信时,需要打开串口以建立通信连接,并在通信结束后关闭串口以释放资源,避免资源的浪费和冲突。

3. 串口的数据收发在串口通信中,数据的发送和接收是必不可少的部分。

通过串口发送数据时,需要将待发送的数据写入串口缓冲区,然后通过串口发送功能将数据发送出去;而在接收数据时,则需要通过串口接收功能从串口缓冲区中读取数据。

4. 串口的事件处理除了常规的数据收发操作,串口通信还需要处理一些事件,如串口接收到数据的事件、串口发送完成的事件等。

serialport 使用方法

serialport 使用方法

serialport 使用方法(原创版3篇)目录(篇1)1.引言2.serialport 的定义和作用3.serialport 的使用方法4.serialport 的常见问题及解决方法5.结论正文(篇1)一、引言在电子设备和计算机之间的通信中,串行通信是一种常见的通信方式。

而在 Python 中,我们可以使用 pyserial 库中的 serialport 模块来实现串行通信。

本文将为大家介绍 serialport 的使用方法。

二、serialport 的定义和作用serialport,即串行端口,是计算机上的一个硬件设备,负责实现串行通信。

在 Python 中,我们可以通过 pyserial 库来操作 serialport,从而实现与外部设备的通信。

三、serialport 的使用方法1.导入库首先,我们需要导入 pyserial 库。

在命令行中输入以下命令:```pip install pyserial```然后在 Python 代码中加入以下导入语句:```pythonimport serial```2.创建串行对象使用`serial.Serial()`方法创建一个串行对象,其中参数`port`表示串行端口号,`baudrate`表示波特率,`parity`表示校验方式,`stopbits`表示停止位,`bytesize`表示数据位。

```pythonser = serial.Serial(port="COM3", baudrate=9600,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)```3.打开串行端口使用`ser.open()`方法打开串行端口。

如果端口打开成功,`ser.isOpen()`方法将返回 True。

```pythonif ser.isOpen():print("串行端口已打开")else:ser.open()```4.读写数据使用`ser.read()`方法从串行端口读取数据,使用`ser.write()`方法向串行端口发送数据。

SerialPort类的常用属性及方法.

SerialPort类的常用属性及方法.

SerialPort类的常用属性及方法.一、 SerialPort类的常用属性三、数据发送示例Private Sub fasong()serialPort1.PortName = "COM1"serialPort1.BaudRate = 9600serialPort1.Open()Dim data As Byte() = Encoding.Unicode.GetBytes(textBox1.Text)Dim str As String = Convert.ToBase64String(data)serialPort1.WriteLine(str)MessageBox.Show("数据发送成功!", "系统提示")End Sub四、接受示例Private Sub jieshou()Dim data As Byte() = Convert.FromBase64String(serialPort1.ReadLine())textBox2.Text = Encoding.Unicode.GetString(data)serialPort1.Close()MessageBox.Show("数据接收成功!", "系统提示")End Sub五、通过串口关闭对方计算机(1)新建一个项目,命名为Ex13_02,默认窗体为Form1。

(2)在Form1窗体中,主要添加两个Button控件,分别用于打开通信串口和关闭对方计算机。

(3)主要程序代码。

Private Sub button1_Click(sender As Object, e As EventArgs) '打开串口serialPort1.PortName = "COM1"serialPort1.Open()button1.Enabled = Falsebutton2.Enabled = TrueEnd Sub'数据接收事件,等待接收关机命令Private Sub serialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)Dim data As Byte() = Convert.FromBase64String(serialPort1.ReadLine())Dim str As String = Encoding.Unicode.GetString(data)serialPort1.Close()If str = "关机" ThenDim p As New Process()p.StartInfo.FileName = "cmd.exe"eShellExecute = Falsep.StartInfo.RedirectStandardInput = Truep.StartInfo.RedirectStandardOutput = Truep.StartInfo.RedirectStandardError = Truep.StartInfo.CreateNoWindow = Truep.Start()p.StandardInput.WriteLine("shutdown /s")p.StandardInput.WriteLine("exit")End IfEnd Sub'发送关机命令Private Sub button2_Click(sender As Object, e As EventArgs) If button2.Text = "关闭计算机" Then'发送关机命令数据Dim data As Byte() = Encoding.Unicode.GetBytes("关机") Dim str As String = Convert.ToBase64String(data) serialPort1.WriteLine(str)button2.Text = "取消关机"Elsebutton2.Text = "关闭计算机"button1.Enabled = Truebutton2.Enabled = False'取消关机Dim p As New Process()p.StartInfo.FileName = "cmd.exe"eShellExecute = Falsep.StartInfo.RedirectStandardInput = Truep.StartInfo.RedirectStandardOutput = Truep.StartInfo.RedirectStandardError = Truep.StartInfo.CreateNoWindow = Truep.Start()p.StandardInput.WriteLine("shutdown /a")p.StandardInput.WriteLine("exit")End If End Sub。

英创应用程序助手AppHelper使用说明

英创应用程序助手AppHelper使用说明

英创应用程序助手AppHelper使用说明为保证系统稳定运行,系统CPU应避免长时间满负荷运作,应用程序CPU占用不宜过高。

客户需要在调试阶段监测应用程序各个进程线程占用情况,对占用过高的进程线程进行优化。

因CE自身不带进程线程系统占用查看工具,我们增加了AppHelper助手工具方便客户使用。

在之前的技术文章《CE应用程序助手简介》中简单介绍过英创AppHelper应用程序助手,本文将详细介绍AppHelper的使用方法。

AppHelper查看方法客户在自制底板上只要引出了网络,USBOTG,DEBUG调试串口,或板子其它串口任意之一便可以查看AppHelper信息。

网络方式通过telnet登录上板子,运行命令sysinfo,即可获得AppHelper打印的进程线程信息。

telnet模式打印示例图USBOTG方式使用AHC工具(使用方法见本文下一节)配置AppHelper输出为COM1。

连接上板子USBOTG 口,板子将以虚拟串口形式被PC识别。

使用任意串口工具向该串口输出任意三个字符(任意波特率),即可获得AppHelper打印的进程线程信息。

USBOTG,DEBUG及其它串口打印示例图DEBUG调试串口方式使用AHC工具(使用方法见本文下一节)配置AppHelper输出为DEBUG。

连接板子的DEBUG串口,PC端使用任意串口工具,设置波特率115200,向DEBUG口输出任意三个字符,即可获得AppHelper打印的进程线程信息。

串口方式将底板上引出,且客户应用程序未使用的串口连接上PC。

使用AHC工具(使用方法见本文下一节)配置好串口号及波特率。

PC端使用任意串口工具,用设定的波特率向该串口输出任意三个字符,即可获得AppHelper打印的进程线程信息。

AHC工具使用介绍AHC工具即AppHelper Config工具,用于设置AppHelper打印信息的输出位置。

有两种办法进行设置。

serialport_datareceived用法

serialport_datareceived用法

serialport_datareceived用法使用串口数据接收是在开发中经常遇到的一种情况。

无论是使用串口与外部设备进行通信,还是与其他设备进行数据交换,SerialPort类都是非常常用的工具之一。

在这篇文章中,我们将会一步一步地回答关于串口数据接收的问题,帮助读者全面了解这个主题。

第一步:了解SerialPort类在开始之前,我们首先需要对SerialPort类进行一个简单的介绍。

SerialPort 类是.NET框架提供的一个用于串行通信的类库,主要用于直接通过串口与外设进行数据交换。

通过SerialPort类,我们可以方便地发送和接收数据,监测串口的状态,并对串口进行各种设置。

第二步:初始化SerialPort对象在开始接收数据之前,我们需要首先初始化一个SerialPort对象。

我们可以通过以下步骤来完成初始化:1. 引入命名空间:在代码文件的开头,我们需要引入命名空间System.IO.Ports,这个命名空间提供了SerialPort类的定义。

2. 创建SerialPort对象:我们可以使用关键字new来实例化一个SerialPort对象,并指定串口号和波特率等参数。

3. 配置串口参数:通过SerialPort对象的属性,我们可以对串口进行各种设置,如波特率、数据位、停止位、奇偶校验等。

第三步:设置数据接收事件接下来,我们需要设置一个数据接收事件,以便在接收到数据时进行相应的操作。

在SerialPort类中,有一个名为DataReceived的事件,它会在接收到数据时触发。

通过订阅这个事件,我们就可以在数据到达时执行自定义的处理函数。

1. 创建事件处理函数:首先,我们需要创建一个事件处理函数,用于处理接收到的数据。

这个函数可以是一个无返回值的方法,接受两个参数:一个是触发事件的对象,另一个是包含事件数据的EventArgs对象。

2. 订阅DataReceived事件:通过将事件处理函数与DataReceived事件进行绑定,我们可以在数据接收到时自动触发事件处理函数。

串口类serialport的头文件和cpp文件详细代码

串口类serialport的头文件和cpp文件详细代码

DECLARE_DYNAMIC(CSerialPort)
};
#endif //__SERIALPORT_H__
/*
Module : SERIALPORT.CPP
Purpose: Implementation for an MFC wrapper class for serial ports
void CancelIo();
//Configuration Methods
void GetConfig(COMMCONFIG& config);
static void GetDefaultConfig(int nPort, COMMCONFIG& config);
void SetConfig(COMMCONFIG& Config);
void GetStatus(COMSTAT& stat);
void GetState(DCB& dcb);
void SetState(DCB& dcb);
void Escape(DWORD dwFunc);
void ClearDTR();
void ClearRTS();
Created: PJN / 31-05-1999
History: PJN / 03-06-1999 1. Fixed problem with code using CancelIo which does not exist on 95.
2. Fixed leaks which can occur in sample app when an exception is thrown
PJN / 29-09-1999 1. Fixed a simple copy and paste bug in CSerialPort::SetDTR

SerialPort控件的详细用法

SerialPort控件的详细用法

serialport控件的详细用法1、简介随着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地方,如U盘、相机、打印机等。

除了USB这种较为奢侈的串口外,在工控和嵌入式行业,大量被使用的是另一种古老的串口协议,RS-232串口。

RS-232是一种非常简洁的低速串口通讯接口,它可以同时进行数据接收和发送的工作。

2、.NET 2.0对串口的支持.NET 2.0提供了对串口通信功能的支持,有关类可以在命名空间System.IO.Ports下找到,这其中最为重要的是SerialPort类。

通过创建一个新的SerialPort 对象,我们就可以在.NET程序中控制串口通讯的全过程。

3、使用SerialPort 设置串口属性进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。

串口属性主要包括.PortName 串口名称,COM1, COM2等。

.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。

Parity 奇偶校验。

可以选取枚举Parity中的值.DataBits 数据位.StopBits 停止位,可以选取枚举StopBits中的值.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值4、打开与关闭串口在创建一个SerialPort 对象,设置串口属性后,可以通过Open()方法打开串口。

数据读写完成后,可以通过Close()方法关闭串口。

根据经验,对于有些系统,在打开串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。

5、读写行数据双方通讯时,一般都需要定义通讯协议,即使最简单的通过串口发送文本聊天的程序。

通常是在当一方按下回车时,将其所数据的文本连同换行符发给另一方。

VC串口小程序(用SerialPort类)

VC串口小程序(用SerialPort类)

VC串口小程序(用SerialPort类)分类:C/C++程序2010-07-16 21:57 3463人阅读评论(2) 收藏举报button编程c先建立一个基于对话框的小程序,做好界面有串口号,打开串口按钮,关闭串口按钮,发送按钮,接收数据区和发送数据区。

然后给串口号即组合框添加变量CComboBoxm_ctrlComPort;给接收数据编辑框添加关联变量CString m_strRxMsg;给发送数据编辑框添加关联变量CString m_strTxMsg;然后将SerialPort类的头文件和C++文件复制到工程中区,然后将它们添加到工程中去,将SerialPort的头文件包含到对话框中文件中去。

在对话框头文件中定义一个布尔变量,用来表示标志串口是否打开,再定义一个对象用来调用SerialPort类中的函数。

源码BOOL m_bPortOpen; //定义一个布尔变量标志串口是否打开;CSerialPort m_SerialPort; //定义一个串口类的对象。

然后开始编辑代码,在SerialPort类中有多个串口事件可以响应,在一般串口编程中,只需要处理WM_COMM_RXCHAR消息就可以了,该类所有的消息处理都需要人工添加消息处理函数。

将处理函数名字定义为OnComm()。

首先向对话框头文件中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区中有一个字符)的消息响应声明:// Generated message map functions//{{AFX_MSG(CSmSerialPortDlg)afx_msg LONG OnComm(WPARAM ch,LPARAM port);//串口字符接收消息(WM_ONCOMM_RXCHAR)(串口接收缓冲区内有一个字符)的响应函数然后再向对话框CPP文件中添加WM_ONCOMM_RXCHAR的消息映射BEGIN_MESSAGE_MAP(CSmSerialPortDlg, CDialog)//{{AFX_MSG_MAP(CSmSerialPortDlg)ON_MESSAGE(WM_COMM_RXCHAR, OnComm)//消息映射接着,在对话框CPP文件中加入函数OnComm()的实现//字符接收消息响应函数LONG CSmSerialPortDlg::OnComm(WPARAM ch,LPARAM port){m_strRxMsg+=ch; //将接收到的字符存入编辑框对应的变量中UpdateData(FALSE); //将接收到的字符显示在接受编辑框中return 0;}每当串口接收缓冲区中有一个字符时,就会产生一个WM_ONCOMM_RXCHAR消息,触发OnComm()函数,这时就可以在函数中进行数据处理,所以这个消息就是整个程序的发动机。

Android 串行接口(serial port)编程

Android 串行接口(serial port)编程

Android 串行接口(serial port)编程本例子来自实际的出租车项目,背景:客户下载Android/iOS客户端订车系统,出租车司机的Driver系统接受订单后,驾驶至目的地,客户上车,计价器off/on,客户下车。

Android程序需要读取计价器的off/on状态,进行后继处理。

解决方案:利用开源的android-serialport-api项目(/p/android-serialport-api/),重新连接usb线到Adapter(USB to RS232 adapters,参考/p/android-serialport-api/wiki/android_to_rs232_guideline?tm=6。

),连接后如下图: n nn n 编码: android-serialport-api项目包装了串行接口的通讯,因此我们不需要关心jni的调用等一系列的过程。

自带的sample实例,演示了怎样读取串行口的信号码,代码也比较简单,稍微修改拿过来使用即可。

直接上代码SerialApplication.java [java]n package com.whyonly.serial; n nn nn nn importjava.io.File; n import java.io.IOException; n import java.security.InvalidParameterException; n nn nn import android.app.Application; n import android.content.SharedPreferences; n import android.location.Location; n import android.preference.PreferenceManager; n importandroid.util.Log; n import android_serialport_api.SerialPort; n importandroid_serialport_api.SerialPortFinder; n nn public class SerialApplication extends Application { n n n private static final String TAG = "SerialApplication"; n n n private SharedPreferences mPrefs; n nn nn n n @Override n n n public void onCreate(){ n n n n n Log.d(TAG,"load...."); n n n n n super.onCreate(); n n n n n //will save the values to Preference later. n n n n n mPrefs = PreferenceManager.getDefaultSharedPreferences(this); n n n } n n n nn n n nn n n nn n n public SharedPreferences getmPrefs() { n n n n n return mPrefs; n n n } n nn nn nn n n public String getUserId() { n n n n n // TODO Auto-generated method stub n n n n n return null; n n n } n n n nn n n nn n n //for serial port n n n public SerialPortFinder mSerialPortFinder = new SerialPortFinder(); n n n private SerialPort mSerialPort = null; n nn n n public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException { n n n n n if (mSerialPort == null) { n n n n n n n /* Read serial port parameters */ n n n n n nn //SharedPreferences sp = getSharedPreferences("android_serialport_api.sample_preferences", MODE_PRIVATE); n n n n n n n SharedPreferences sp = ((SerialApplication)this.getApplicationContext()).getmPrefs(); n n n n n n n String path = sp.getString("DEVICE", ""); n n n n n n n int baudrate = Integer.decode(sp.getString("BAUDRATE", "-1")); n nn n n n n n n /* Check parameters */ n n n n n n n if ( (path.length() == 0) || (baudrate == -1)) { n n n n n n n n n throw new InvalidParameterException(); n n n n n n n } n nn n n n n n n /* Open theserial port */ n n n n n n n mSerialPort = new SerialPort(new File(path), baudrate, 0); n n n n n } n n n n n return mSerialPort; n n n } n nn n n public void closeSerialPort() { n n n n n if (mSerialPort != null) { n n n n n n n mSerialPort.close(); n n n n n n n mSerialPort = null; n n n n n } n n n } n nn nn nn n n nn } n n MainActivity.java n [java] n package com.whyonly.serial; n nn nn import android.os.Bundle; n import android.app.Activity; n import android.util.Log; n import android.view.Menu; n nn public class MainActivity extends Activity { n nn n n private static final String TAG = "MainActivity"; n n n nn n n private USBSerialHelper usbSerialHelper; n nn n n @Override n n n protected void onCreate(Bundle savedInstanceState) { n n n n nsuper.onCreate(savedInstanceState); n n n n n setContentView(yout.activity_main); n n n n n usbSerialHelper = new USBSerialHelper(MainActivity.this); n n n } n nn n n @Override n n n public boolean onCreateOptionsMenu(Menu menu) { n n n n n // Inflate the menu; this adds items to the action bar if it is present. n n n n n getMenuInflater().inflate(R.menu.main, menu); n n n n n return true; n n n } n nn n n public void flag(int onoff) { n n n n n //the message returned from serial port, do anything you want. n n n n n Log.d(TAG,"onoff:"+onoff); n n n n n nn n n } n n n nn n n @Override n n n protected void onDestroy() { n n n n n super.onDestroy(); n n n n n Log.d (TAG,"onDestroy()"); n n n n n stopUSBSerial(); n n n } n n n nn n n private void stopUSBSerial() { n n n n n if(usbSerialHelper != null){ n n n n n n n usbSerialHelper.onDestroy(); n n n n n } n n n n n nn n n } n nn } n n USBSerialHelper.java n [java] n package com.whyonly.serial; n nn import java.io.IOException; n import java.io.InputStream; n import java.io.OutputStream; n import java.security.InvalidParameterException; n nn nn import android_serialport_api.SerialPort; n nn nn nn nn public class USBSerialHelper { n n n nn n n private MainActivity activity; n n n protected SerialApplication mApplication; n n n protected SerialPort mSerialPort; n n n protected OutputStream mOutputStream; n n n private InputStream mInputStream; n n n private ReadThread mReadThread; n n n nn n n public USBSerialHelper(final MainActivity mActivity){ n n n n nthis.activity = mActivity; n n n n n mApplication = (SerialApplication) mActivity.getApplication (); n n n n n Preferences.saveUSBSetting(mActivity); n n n n n start(); n n n } n n n nn n n public void start(){ n n n n n try { n n n n n n n mSerialPort = mApplication.getSerialPort(); n n n n n n n mOutputStream = mSerialPort.getOutputStream(); n n n n n n n mInputStream = mSerialPort.getInputStream(); n nn n n n n n n /* Create a receiving thread */ n n n n n n n mReadThread = new ReadThread(); n n n n n n n mReadThread.start(); n n n n n } catch (SecurityException e) { n n n n n n n DisplayError(R.string.error_security); n n n n n } catch (IOException e) { n n n n n n n DisplayError(R.string.error_unknown); n n n n n } catch (InvalidParameterException e) { n n n n n n n DisplayError(R.string.error_configuration); n n n n n } n n n } n n n nn n n private void DisplayError(int resourceId) { n n n n nDialogUtil.showWarningDialog(activity, resourceId); n n n } n n n nn n n private String lastStatus = "";//1:flag off;2:flag on;0 power off n nn n n private void onDataReceived(final byte[] buffer, final int size) { n n n n n activity.runOnUiThread(new Runnable() { n n n n n n n public void run() { n n n n n n n n n //receive serial number from usb serial device. n n n n n n n n n String signal = new String(buffer, 0, size); n n n n n n n n n if(signal.length()>0){ n n n n n n n n n n n String status = signal.substring(0,1); n n n n n n n n n n n if(!status.equals ("0") && !lastStatus.equals(status)){ n n n n n n n n n n n n n lastStatus = status; n n n n n n n n n n n n n if(status.equals("1")){//flag on status n n n n n n n n n n n n n n n activity.flag (1); n n n n n n n n n n n n n }else if(status.equals("2")){//flag off status n n n n n n n n n n n n n n n activity.flag(0); n n n n n n n n n n n n n } n n n n n n n n n n n } n n n n n n n n n } n n n n n n n } n n n n n }); n n n } n n n nn n n public void onDestroy() { n n n n n if (mReadThread != null) n n n n n n n mReadThread.interrupt(); n n n n nmApplication.closeSerialPort(); n n n n n mSerialPort = null; n n n } n n n nn n n private class ReadThread extends Thread { n nn n n n n @Override n n n n n public void run() { n n n n n n n super.run(); n n n n n n n while(!isInterrupted()) { n n n n n n n n n int size; n n n n n n n n n try { n n n n n n n n n n n byte[] buffer = new byte[64]; n n n n n n n n n n n if (mInputStream == null) return; n n n n n n n n n n n size = mInputStream.read(buffer); n n n n n n n n n n n if (size > 0) { n n n n n n n n n n n n n onDataReceived(buffer, size); n n n n n n n n n n n } n n n n n n n n n } catch (IOException e) { n n n n n n n n n n n e.printStackTrace(); n n n n n n n n n n n return; n n n n n n n n n } n n n n n n n } n n n n n } n n n } n } n n Preferences.java n [java]n package com.whyonly.serial; n nn import android.content.Context; n import android.content.SharedPreferences; n import android.content.SharedPreferences.Editor; n nn public class Preferences { n n n public static void saveUSBSetting(Context activity){ n n n n n SharedPreferences pref = getAppPrefs(activity); n n n n n Editor editor = pref.edit(); n n n n n editor.putString("DEVICE", "/dev/ttyUSB0"); n n n n n editor.putString("BAUDRATE", "9600"); n n n n n mit(); n n n n n } nn n n nn n n public static SharedPreferences getAppPrefs (Context context) { n n n n n return ((SerialApplication)context.getApplicationContext()).getmPrefs(); n n n } n } n n DialogUtil.java [java] n package com.whyonly.serial; n nn nn nn import android.app.AlertDialog; n import android.content.Context; n importandroid.content.DialogInterface; n nn public class DialogUtil { n n n nn n n public static void showWarningDialog(Context context,int messageid){ n n n n n showWarningDialog(context,context.getResources().getString(messageid)); n n n } n n n nn n n public static void showWarningDialog(Context context,String message){ n n n n n String warningTitle =context.getResources().getString(R.string.defaultWarningTitle); n n n n n String warningButtonName = context.getResources().getString(R.string.defaultWarningButton); n n n n n showWarningDialog(context,warningTitle,message,warningButtonName); n n n } n n n nn n n private static void showWarningDialog(Context context,String title,String message,String positive){ n n n n n final AlertDialog.Builder builder = new AlertDialog.Builder(context); n n n n nbuilder.setTitle(title).setMessage(message); n n n n n builder.setPositiveButton(positive, new DialogInterface.OnClickListener() { n n n n n n n n public void onClick(DialogInterface dialog, int which) { n n n n n n n n n dialog.dismiss(); n n n n n n n n } n nn n n n n n n}); n n n n n builder.create().show(); n n n } n nn } n n strings.xml [html] n <?xml version="1.0"encoding="utf-8"?> n <resources> n nn n n <string name="app_name">serial</string> n n n <string name="action_settings">Settings</string> n n n <string name="hello_world">Hello world!</string> n n n <string name="defaultWarningTitle">Taxi Driver</string> n n n <stringname="defaultWarningButton">Yes</string> n n n <string name="error_configuration">Please configure your serial port first.</string> n n n <string name="error_security">You do not have read/write permission to the serial n n n n n port.</string> n n n <stringname="error_unknown">The serial port can not be opened for an unknown n n n n n reason.</string> n nn </resources> n n。

SerialPort控件的详细用法

SerialPort控件的详细用法

serialport控件的详细用法1、简介随着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地方,如U盘、相机、打印机等。

除了USB这种较为奢侈的串口外,在工控和嵌入式行业,大量被使用的是另一种古老的串口协议,RS-232串口。

RS-232是一种非常简洁的低速串口通讯接口,它可以同时进行数据接收和发送的工作。

2、.NET 2.0对串口的支持.NET 2.0提供了对串口通信功能的支持,有关类可以在命名空间System.IO.Ports下找到,这其中最为重要的是SerialPort类。

通过创建一个新的SerialPort 对象,我们就可以在.NET程序中控制串口通讯的全过程。

3、使用SerialPort 设置串口属性进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。

串口属性主要包括.PortName 串口名称,COM1, COM2等。

.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。

Parity 奇偶校验。

可以选取枚举Parity中的值.DataBits 数据位.StopBits 停止位,可以选取枚举StopBits中的值.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值4、打开与关闭串口在创建一个SerialPort 对象,设置串口属性后,可以通过Open()方法打开串口。

数据读写完成后,可以通过Close()方法关闭串口。

根据经验,对于有些系统,在打开串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。

5、读写行数据双方通讯时,一般都需要定义通讯协议,即使最简单的通过串口发送文本聊天的程序。

通常是在当一方按下回车时,将其所数据的文本连同换行符发给另一方。

android串口调试

android串口调试

android串⼝调试在Androidstudio调试安卓串⼝的⼀个demo⼯程,第⼀次接触安卓串⼝,记录⼀下调试过程的坑。

⾸先,需要编译出串⼝的so。

打开⼯程,在AndroidSerialPort-master\app\src\main\jni可以看到源代码SerialPort.c。

电脑已经配置过ndk的话,打开cmd,cd到这个⽂件夹,运⾏ndk-build就可以编译出so。

需要注意的是,SerialPort.c中函数的包名需要和你的android⼯程的包名⼀致。

android⼯程:SerialPort.c:编译:直接这样编译的话,在api⼤于19的时候可能会出现tcsetattr failed,需要替换termios.h。

下载新的termios.h放⼊jni⽬录,修改SerialPort.c中#include <termios.h> ---> include "termios.h",再编译。

app⽬录下,新建⼀个libs⽬录,libs内新建armeabi⽬录,编译得到的so放在armeabi⽬录。

安卓⼯程的build.grandle修改如下:apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "29.0.2"defaultConfig {applicationId "com.android.serialport"minSdkVersion 15targetSdkVersion 23}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}}sourceSets {main {jniLibs.srcDirs = ['libs']}}compileOptions {sourceCompatibility = 1.7targetCompatibility = 1.7}//⾃定义apk安装包名android.applicationVariants.all {variant ->variant.outputs.all {//这⾥修改apk⽂件名outputFileName = "AndroidSerial.apk"}}}dependencies {//noinspection GradleCompatibleimplementation 'com.android.support:appcompat-v7:23.4.0'implementation files('libs/portlibrary.jar')}其次,编译得到apk,使⽤模拟器和虚拟串⼝测试。

vs2019串口编程实例

vs2019串口编程实例

vs2019串口编程实例English Answer:1. Serial Port Programming in VS2019 Using C#。

Prerequisites:Visual Studio 2019 or later..NET Framework 4.7.2 or later.A physical or virtual serial port.Steps:1. Create a new C# console application project in Visual Studio.2. Add the `System.IO.Ports` namespace to your project.3. Define the serial port settings:Port name (e.g., "COM1")。

Baud rate (e.g., 9600)。

Parity (e.g., None)。

Data bits (e.g., 8)。

Stop bits (e.g., One)。

4. Create a `SerialPort` object and open the port.5. Send data to the port using the `Write()` method.6. Receive data from the port using the `Read()` method.7. Handle any exceptions or errors that may occur.Example Code:c#。

using System.IO.Ports;namespace SerialPortConsoleApp.{。

class Program.{。

static void Main(string[] args)。

{。

const string portName = "COM1"; const int baudRate = 9600;// Create a serial port object.SerialPort serialPort = new SerialPort(portName, baudRate);// Open the port.serialPort.Open();// Send data to the port.string data = "Hello world!";serialPort.Write(data);// Receive data from the port.string receivedData =serialPort.ReadExisting();Console.WriteLine($"Received data: {receivedData}");// Close the port.serialPort.Close();}。

QT绿米QTA协议(二)AS

QT绿米QTA协议(二)AS

QT绿⽶QTA协议(⼆)AS ⼀.PowerUpdate1.1.UIactivity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="7"android:gravity="center"android:orientation="horizontal"><ScrollViewandroid:id="@+id/sv_send"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="5"android:background="@drawable/bg_white_stroke"><TextViewandroid:id="@+id/tv_send"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="@string/receive_hint"android:padding="@dimen/margin_small"android:textColor="@android:color/black"android:textSize="@dimen/text_tv" /></ScrollView><ScrollViewandroid:id="@+id/sv_result"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="5"android:background="@drawable/bg_white_stroke"><TextViewandroid:id="@+id/tv_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="@string/receive_hint"android:padding="@dimen/margin_small"android:textColor="@android:color/black"android:textSize="@dimen/text_tv" /></ScrollView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.5"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_start"style="@style/average_vertical_widget"android:text="@string/start_test" /><Buttonandroid:id="@+id/btn_close"style="@style/average_vertical_widget"android:text="@string/close_port" /></LinearLayout></LinearLayout>styles.xml<resources><!--font Style--><style name="average_vertical_widget"><item name="android:layout_width">0dp</item><item name="android:layout_height">match_parent</item><item name="android:layout_weight">1</item><item name="android:gravity">center</item><item name="android:textSize">@dimen/text_size</item><item name="android:textColor">@android:color/black</item></style></resources>1.2.android_serialport_api 串⼝⼯具类package android_serialport_api;import android.util.Log;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class SerialPort {private static final String TAG = "SerialPort";/** Do not remove or rename the field mFd: it is used by native method close();*/private FileDescriptor mFd;private FileInputStream mFileInputStream;private FileOutputStream mFileOutputStream;public SerialPort(File device, int baudrate, int dataBits, int stopBits, char parity) throws SecurityException, IOException { /* Check access permission */if (!device.canRead() || !device.canWrite()) {try {/* Missing read/write permission, trying to chmod the file */Process su;su = Runtime.getRuntime().exec("/system/bin/su");String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"+ "exit\n";su.getOutputStream().write(cmd.getBytes());if ((su.waitFor() != 0) || !device.canRead()|| !device.canWrite()) {throw new SecurityException();}} catch (Exception e) {e.printStackTrace();throw new SecurityException();}}mFd = open(device.getAbsolutePath(), baudrate, dataBits, stopBits, parity);if (mFd == null) {Log.e(TAG, "native open returns null");throw new IOException();}mFileInputStream = new FileInputStream(mFd);mFileOutputStream = new FileOutputStream(mFd);}// Getters and setterspublic InputStream getInputStream() {return mFileInputStream;}public OutputStream getOutputStream() {public OutputStream getOutputStream() {return mFileOutputStream;}public void Write_Rs485_Length(int count) {write_rs485_length(count);}// JNI(调⽤java本地接⼝,实现串⼝的打开和关闭)/**串⼝有五个重要的参数:串⼝设备名,波特率,检验位,数据位,停⽌位其中检验位⼀般默认位NONE,数据位⼀般默认为8,停⽌位默认为1*//*** @param path 串⼝设备的据对路径* @param baudrate 波特率* @param dataBits 数据位* @param stopBits 停⽌位* @param parity 校验位*/private native static FileDescriptor open(String path, int baudrate, int dataBits, int stopBits, char parity); public native void close();public native void write_rs485_length(int count);static {//加载jni下的C⽂件库Log.i(TAG, "loadLibrary..............gatsby");System.loadLibrary("serial_port");}}⼆.qtcreator -> AS2.1.UartTestpackage com.lvmi.powerupdate;import android.content.Context;import android.os.Handler;import android.os.Looper;import android.util.Log;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android_serialport_api.SerialPort;public class UartTest {private final Context mContext;byte[] Save_Data; // 保存的载⼊数据byte[] Temp_file_Data; // 临时⽂件数据byte[] file_arry; // ⽂件数据byte[] Send_Data; // 发送数据byte Data_Number; // 数据编码int flag_EOT; // 结束命令标记int file_ChkData; // ⽂件校验int NAck_Cnt; // NAck次数int Ack_Cnt; // Ack次数private OnSerialListener mOnSerialListener;public String DEV_TTYS4 = "/dev/ttyS4";private boolean isOpened = false;private OutputStream mOutputStream;private InputStream mInputStream;private final ExecutorService mThreadPoolExecutor = Executors.newCachedThreadPool();public UartTest(Context mContext) {super();this.mContext = mContext;}}public void StartUartTest() {openSerialPort(DEV_TTYS4);Btn_Open_File();Btn_Sand_Data();//启动}//打开⽂件public void Btn_Open_File() {int val;file_arry = getBytesByFile(mContext, "QT573-LVMI-APP.bin");val = file_arry.length % 128;if (val != 0) {val = 128 - val;//最后⼀包数据补24个0byte[] chrVal2 = new byte[val];for (int i = 0; i < val; i++) {chrVal2[i] = (byte)0;}file_arry = addBytes(file_arry, chrVal2);file_ChkData = Dev_CRC16(file_arry);//must F229Log.d("gatsby", "file_ChkData -> " + Integer.toHexString(file_ChkData)); }}//启动public void Btn_Sand_Data() {// 清除计数接收⽂本保存数据NAck_Cnt = 0;Ack_Cnt = 0;Save_Data = null;// 开始接收数据isOpened = true;// 开始发送进⼊编译环境Data_Number = 0; // 重新发送计数flag_EOT = 0; // 发送结束标记位重置Sand_Data((byte) 0x93); // 发送}//发送数据public void Sand_Data(byte cmd) {//StringBuilder ba = new StringBuilder();byte[] ba = new byte[133];int ChkData;//0xffffbyte val;//0xffString sendData = null;if (cmd == 0x01) {byte[] data;ba[0] = cmd;Log.d("gatsby", "Data_Number ->" + Data_Number);val = (byte) ~Data_Number;ba[1] = (byte) Data_Number;ba[2] = (byte) val;for (int i = 0; i < Send_Data.length; i++) {ba[i + 3] = (byte) Send_Data[i];}//System.arraycopy(Send_Data, 0, data, 0, Send_Data.length);data = Send_Data;Log.d("gatsby", "data->" + data.length);// 数据校验// 数据校验ChkData = CRC16(data, 128);Log.d("gatsby", "ChkData->" + ChkData);val = (byte) (ChkData & 0xff);ba[Send_Data.length + 3] = (byte) val;val = (byte) ((ChkData >> 8) & 0xff);ba[Send_Data.length + 4] = (byte) val;//打印看发送数据是否正确// for (int i = 0; i < ba.length; i++) {// Log.d("gatsby", "i--> " + (i) + " ba ->"+ Integer.toHexString(ba[i] & 0xff));// }sendSerialPort(ba);if (flag_EOT == 0) {Log.d("gatsby", "Sand Packet " + Data_Number);sendData = "Send Packet " + Data_Number;}// 发送校验else if (flag_EOT == 1) {Log.d("gatsby", "Sand Check");sendData = "Send Check";}if (mOnSerialListener != null) {mOnSerialListener.onSendData(sendData);}} else {byte[] ba2 = new byte[1];ba2[0] = (byte) cmd;sendSerialPort(ba2);Log.d("gatsby", "cmd ->" + Integer.toHexString(cmd & 0xff));if (cmd == (byte) 0x93) {Log.d("gatsby", "Sand_Data will be send data ");} else if (cmd == (byte) 0x04) {Log.d("gatsby", "Sand_Data End ");isOpened = false;}}}public void openSerialPort(String devType) {if (!"".equals(devType) && new File(devType).exists()) {Log.d("gatsby", "isOpenedSerialPort");try {//串⼝配置:9600 数据位8 起始位1 停⽌位1 奇校验SerialPort mSerialPort = new SerialPort(new File(DEV_TTYS4), 9600, 8, 1, 'O'); mOutputStream = mSerialPort.getOutputStream();mInputStream = mSerialPort.getInputStream();mThreadPoolExecutor.execute(new ReceiveDataThread());isOpened = true;} catch (IOException e) {e.printStackTrace();if (mOnSerialListener != null) {mOnSerialListener.onSerialOpenException(e);}}}}/*** 串⼝发送字符串*/public void Sand_Data_QString(String st) {st += "\r\n";byte[] ba = st.getBytes();sendSerialPort(ba);}/*** 串⼝发送byte[]*/public void sendSerialPort(byte[] sendbyte) {if (!isOpened) {return;}try {mOutputStream.write(sendbyte);mOutputStream.flush();} catch (IOException e) {e.printStackTrace();}}//5s 未接收数据提⽰升级失败 Android11 提⽰过时换Looper写法 Handler handler = new Handler(Looper.myLooper());private final Runnable runnable = new Runnable() {@Overridepublic void run() {if (Data_Number == 1) {if (mOnSerialListener != null) {mOnSerialListener.onUpdateError();}}}};/*** 串⼝返回数据内容读取*/private class ReceiveDataThread extends Thread {@Overridepublic void run() {super.run();int val;//uint8_tString SendStr = null;String ReciveStr = null;boolean start_flag = false;byte[] ba = new byte[1024];while (isOpened) {String resSaveData;if (mInputStream != null) {try {int size = mInputStream.read(ba);if (size > 0) {resSaveData = new String(ba, 0, size);Log.d("gatsby", "receiver str = " + resSaveData); Save_Data = resSaveData.getBytes();if (resSaveData.equals("Apply OTA\r\n")) {Log.d("gatsby", "Apply OTA");SendStr = "OTA";start_flag = true;ReciveStr = "Apply OTA";Sand_Data_QString(SendStr);} else if (resSaveData.equals("Ready\r\n")) {Log.d("gatsby", "Ready");SendStr = "Start";ReciveStr = "Ready";Sand_Data_QString(SendStr);NAck_Cnt = 0;Ack_Cnt = 0;Data_Number = 0; // 重新发送计数flag_EOT = 0; // 发送结束标记位重置 Temp_file_Data = file_arry;}// NACKelse if (Save_Data[0] == 0x15) {NAck_Cnt++;if (Data_Number == 0) {Data_Number = 1;// ⾸次发送// ⾸次发送Log.d("gatsby", "(NAck) Ready Receive");ReciveStr = "(NAck) Ready Receive";Send_Data = cutBytes(Temp_file_Data);Sand_Data((byte) 0x01);} else if (Data_Number > 0) {Log.d("gatsby", "(NAck) Ready Packet Error");ReciveStr = "(NAck) Ready Receive";Send_Data = cutBytes(Temp_file_Data);Sand_Data((byte) 0x01);}handler.postDelayed(runnable, 6000);}// ACKelse if (Save_Data[0] == 0x06) {Ack_Cnt++;Data_Number++;//Log.d("gatsby", "(Ack) Receive ->" + Save_Data[0]);//Log.d("gatsby", "flag_EOT->" + flag_EOT);Log.d("gatsby", "Temp_file_Data aaa->" + Temp_file_Data.length);if (Temp_file_Data.length > 128) {Temp_file_Data = removeBytes(Temp_file_Data, Temp_file_Data.length - 128);Log.d("gatsby", "Temp_file_Data bbb->" + Temp_file_Data.length);// 发送数据Send_Data = cutBytes(Temp_file_Data);if (Temp_file_Data.length == 128) {Temp_file_Data = removeBytes(Temp_file_Data, 0);}Sand_Data((byte) 0x01);Log.d("gatsby", "(Ack) Receive Packet " + (Data_Number - 1) + " Success");ReciveStr = "(Ack) Receive Packet " + (Data_Number - 1) + " Success";} else {// 发送校验if (flag_EOT == 0) {flag_EOT = 1;val = (byte) (file_ChkData & 0xff);Send_Data[0] = (byte) val;val = (byte) ((file_ChkData >> 8) & 0xff);Send_Data[1] = (byte) val;for (int i = 0; i < 126; i++) {Send_Data[i + 2] = (byte) 0;}Sand_Data((byte) 0x01);Log.d("gatsby", "EOT (Ack) Receive Packet " + (Data_Number - 1) + " Success"); ReciveStr = "(Ack) Receive Packet " + (Data_Number - 1) + " Success";}// 发送EOT 完成else if (flag_EOT == 1) {flag_EOT = 2;Sand_Data((byte) 0x04);Log.d("gatsby", "(Ack) Receive Check");ReciveStr = "(Ack) Receive Check";}}}//设置监听if (mOnSerialListener != null) {mOnSerialListener.onReceivedData(ReciveStr);if (start_flag) {mOnSerialListener.onSendData(SendStr);if (SendStr.equals("Start")) {start_flag = false;}}}}} catch (Exception e) {e.printStackTrace();}}}}}}/*** 关闭串⼝*/public void closeSerialPort() {try {if (mOutputStream != null)mOutputStream.close();if (mInputStream != null)mInputStream.close();isOpened = false;} catch (IOException e) {e.printStackTrace();}}/*** 设置串⼝监听** @param onSerialListener 串⼝监听*/public void setOnSerialListener(OnSerialListener onSerialListener) { this.mOnSerialListener = onSerialListener;}/*** 串⼝监听*/public interface OnSerialListener {/*** 串⼝打开异常*/void onSerialOpenException(Exception e);/*** 串⼝数据发送*/void onSendData(String sendData);/*** 串⼝数据返回*/void onReceivedData(String receivedData);/*** 上位机下发后若5S未接收MCU数据上位机退出升级过程*/void onUpdateError();}/*** CRC校验 128字节*/public int CRC16(byte[] u8pArray, int u8Size) {int val;//0xffint i, j;int CurVal;//0xffffint CrcReg = 0xFFFF;for (i = 0; i < u8Size; i++) {//CurVal = u8pArray[i] << 8; uint8_tval = u8pArray[i] & 0xff;CurVal = val << 8;for (j = 0; j < 8; j++) {if ((short) (CrcReg ^ CurVal) < 0) {CrcReg = (((CrcReg << 1) & 0xffff) ^ 0x1021);CrcReg = (((CrcReg << 1) & 0xffff) ^ 0x1021);} else {CrcReg = (CrcReg << 1) & 0xffff;}CurVal <<= 1;}}return CrcReg;}/*** CRC校验*/public int Dev_CRC16(byte[] ba) {int val;//0xffint i, j;int CurVal;//0xffffint CrcReg = 0xFFFF;for (i = 0; i < ba.length; i++) {//uint8_t -> intval = ba[i] & 0xff;CurVal = val << 8;for (j = 0; j < 8; j++) {if ((short) (CrcReg ^ CurVal) < 0) {CrcReg = (((CrcReg << 1) & 0xffff) ^ 0x1021);//Log.d("gatsby","file_arry i-> " + i + " CrcReg -> " + CrcReg);} else {CrcReg = (CrcReg << 1) & 0xffff;}CurVal <<= 1;}}return CrcReg;}/*** 两个字节数组合并*/public byte[] addBytes(byte[] firstData, byte[] secondData) {byte[] mergeData = new byte[firstData.length + secondData.length];System.arraycopy(firstData, 0, mergeData, 0, firstData.length);System.arraycopy(secondData, 0, mergeData, firstData.length, secondData.length); return mergeData;}/*** 字节数组截取⾸128字节 128*/public byte[] cutBytes(byte[] Data) {byte[] cutData = new byte[128];System.arraycopy(Data, 0, cutData, 0, cutData.length);return cutData;}/*** 字节数组移除⾸128字节 128*/public byte[] removeBytes(byte[] Data, int removeLength) {byte[] removeData = new byte[removeLength];System.arraycopy(Data, 128, removeData, 0, removeData.length);return removeData;}/*** 获取assets⽂件流转byte数组*/public byte[] getBytesByFile(Context context, String fileName) {try {InputStream inStream = context.getResources().getAssets().open(fileName);ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];byte[] buffer = new byte[1024];int len;while ((len = inStream.read(buffer)) != -1) {outStream.write(buffer, 0, len);}outStream.close();inStream.close();return outStream.toByteArray();} catch (Exception e) {e.printStackTrace();return null;}}}MainActivity 回调刷新UI 数据package com.lvmi.powerupdate;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ScrollView;import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener, UartTest.OnSerialListener { private ScrollView sv_send,sv_result;private Button btn_start, btn_close;private TextView tv_Send, tv_Result;private UartTest uartTest;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);initData();initView();}private void initData() {if (uartTest == null) {uartTest = new UartTest(this);uartTest.setOnSerialListener(this);}}private void initView() {sv_send = (ScrollView) findViewById(R.id.sv_send);sv_result = (ScrollView) findViewById(R.id.sv_result);tv_Send = (TextView) findViewById(_send);tv_Result = (TextView) findViewById(_result);btn_start = (Button) findViewById(R.id.btn_start);btn_start.setOnClickListener(this);btn_close = (Button) findViewById(R.id.btn_close);btn_close.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_start:tv_Send.setText("");tv_Result.setText("");btn_start.setEnabled(false);uartTest.StartUartTest();break;case R.id.btn_close:uartTest.closeSerialPort();btn_start.setEnabled(true);break;}}@Overridepublic void onSerialOpenException(Exception e) {showData("串⼝打开失败",tv_Send);}@Overridepublic void onSendData(String sendData) {showData(sendData, tv_Send);if(sendData.equals("Send Check")){showData("已成功发送完数据包 ", tv_Send);btn_start.setEnabled(true);}sv_send.fullScroll(ScrollView.FOCUS_DOWN);}@Overridepublic void onReceivedData(String receivedData) {showData(receivedData, tv_Result);if(receivedData.equals("(Ack) Receive Check")){ showData("已接受完数据,升级成功 ", tv_Result); }sv_result.fullScroll(ScrollView.FOCUS_DOWN);}@Overridepublic void onUpdateError() {showData("未接收MCU数据,升级失败", tv_Result); }private void showData(final String str, TextView tv) { runOnUiThread(new Runnable() {@Overridepublic void run() {tv.append(str + "\n");}});}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//parity:
// n=none
// e=even
// o=odd
// m=mark
// s=space
//data:
// 5,6,7,8
//stop:
// 1,1.5,2
//
BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
TRACE("Thread ended\n");
}
// create events
if (m_ov.hEvent != NULL)
ResetEvent(m_ov.hEvent);
{
m_hComm = NULL;
// initialize overlapped structure members to zero
m_ov.Offset = 0;
m_ov.OffsetHigh = 0;
// create events
m_ov.hEvent = NULL;
FILE_FLAG_OVERLAPPED, // Async I/O
0); // template must be 0 for comm devices
if (m_hComm == INVALID_HANDLE_VALUE)
{
// port not found
delete [] m_szWriteBuffer;
m_szWriteBuffer = new char[writebuffersize];
m_nPortNr = portnr;
m_nWriteBufferSize = writebuffersize;
m_dwCommEvents = dwCommEvents;
**
** AUTHOR Remon Spekreijse
**
**
*/
#include "stdafx.h"
#include "SerialPort.h"
#include <assert.h>
//
// Constructor
//
CSerialPort::CSerialPort()
//
CSerialPort::~CSerialPort()
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
m_hEventArray[0] = m_hShutdownEvent; // highest priority
m_hEventArray[1] = m_ov.hEvent;
m_hEventArray[2] = m_hWriteEvent;
// initialize critical section
else
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (m_hWriteEvent != NULL)
ResetEvent(m_hWriteEvent);
else
m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
// stop is index 0 = 1 1=1.5 2=2
int mystop;
int myparity;
switch(stopbits)
{
case 0:
mystop = ONESTOPBIT;
break;
case 1: Event = NULL;
m_hShutdownEvent = NULL;
m_szWriteBuffer = NULL;
m_bThreadAlive = FALSE;
m_nWriteSize = 1;
}
//
// Delete dynamic memory
** The class creates a thread for reading and writing so the main
** program is not blocked.
**
** CREATION DATE 15-09-1997
** LAST MODIFICATION 12-11-1997
break;
case 2:
mystop = TWOSTOPBITS;
break;
}
myparity = 0;
switch(parity)
{
case 'N':
myparity = 0;
break;
case 'E':
myparity = 1;
m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier * 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant * 1000;
break;
case 'O':
myparity = 2;
break;
case 'M':
myparity = 3;
break;
case 'S':
myparity = 4;
break;
}
sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, mystop);
CloseHandle( m_hWriteEvent );
TRACE("Thread ended\n");
delete [] m_szWriteBuffer;
}
//
// Initialize the port. This can be port 1 to 4.
//
//
/*
** FILENAME CSerialPort.cpp
**
** PURPOSE This class can read, write and watch one serial port.
** It sends messages to its owner when something happends on the port
InitializeCriticalSection(&m_csCommunicationSync);
// set buffersize for writing and save the owner
m_pOwner = pPortOwner;
if (m_szWriteBuffer != NULL)
// get a handle to the port
m_hComm = CreateFile(szPort, // communication port string (COMX)
GENERIC_READ | GENERIC_WRITE, // read/write types
DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant,
DWORD WriteTotalTimeoutMultiplier,
BOOL bResult = FALSE;
char *szPort = new char[50];
char *szBaud = new char[50];
// now it critical!
EnterCriticalSection(&m_csCommunicationSync);
delete [] szPort;
delete [] szBaud;
return FALSE;
}
// set the timeout values
m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout * 1000;
DWORD WriteTotalTimeoutConstant )
{
assert(portnr > 0 && portnr < 5);
assert(pPortOwner != NULL);
// if the thread is alive: Kill
if (m_bThreadAlive)
if (m_hShutdownEvent != NULL)
ResetEvent(m_hShutdownEvent);
else
m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
相关文档
最新文档