上位机软件开发实例(上位机软件设计方案)
今天给各位分享上位机软件开发实例的知识,其中也会对上位机软件设计方案进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、蓝牙上位机app有哪些
- 2、利用电脑做上位机开发一个软件,用单片机做下位机。在上位机上点击软件上的按钮能使单片机输出一路I/O口
- 3、如何用c语言开发自己的上位机软件
- 4、【上下位机通信】:下位机(STM32)通过网口(DM9000之类的.)向上位机PC发送数据。求上位机例子程序~
- 5、vb串口通信程序实例
蓝牙上位机app有哪些
做安卓手机APP通常使用高端大气的Android Studio,开发语言是Java,该开发IDE就是体积大
学习成本高,入手慢,这里给大家推荐一款国产的软件,体积小,运行和编译速度快。最重要的是编程语言是中文
这个软件就是E4A.
本次我将向大家介绍如何使用E4A开发BLE蓝牙手机上位机APP。
当然,该软件自带了丰富的例子,也提供了一个BLE例子,大家可以借鉴。
由于没有提供各种库的说明文档和帮助文件,学这个软件可能有经过一段摸索,这里我将向大家介绍我在开发这个软件中
获得的经验。
中文编程语言:易语言,采用中文作为关键字,但是编程的语法和思想和C语言是类似的
为了方便理解,这里我结合单片机开发的思路简单介绍一下
变量要声明类型
对象操作的函数称为:方法
对象可触发的中断函数称为:事件
对象可设置的参数称为:属性
-----------------------------------------------------------------------------------------
好接下来介绍 BLE蓝牙库
BLE(Bluetooth Low Energe)低功耗蓝牙设备主要用于智能穿戴和物联网。
BLE蓝牙类库,包含两种操作:方法和事件
方法:
初始化
置可被发现
开始搜索
停止搜索
连接设备
断开连接
释放资源
是否可读
是否可写
是否可通知
读取数据
写入数据
事件:
创建完毕
发现设备
信号强度改变
发现服务
连接状态改变
读取数据完毕
通道数据改变
由于不存在可见的对象,因此蓝牙没有属性设置。
了解方法和事件的用法可通过左侧类库目录选中对应的条目,在下面的提示信息中查看
例如选中BLE蓝牙库的方法 初始化 条目后:
方法:初始化()为 逻辑型
分类:BLE蓝牙类库---BLE蓝牙
注释:初始化BLE蓝牙设备,成功返回真,失败返回假,BLE蓝牙需要安卓4.3以上系统的支持。
另外 事件类似中断函数,因此在代码中没有先后顺序,可以根据易读的排列顺序进行排版。
所有的动作均属于触发的事件,因此,方法通常在事件里面进行调用。
自己创建的函数,需要自己实现该函数的具体过程,因此函数在这里称为:过程
不过我们这里做BLE蓝牙APP可以不用到过程。
好了,基本的概念已经介绍了,我们可以开始整了。
-----------------------------------------------------------------------------------------
第一步,先根据我们的需要完成可视化的组件布局,并给添加的组件起上一个跟操作相关的名字,在组件的属性对话框设置,同时可以设置组件的其他相关属性。

第二步,使用中需要完成单击响应的,我们可以在设计区直接双击组件,即可自动在代码区生成一个空的事件(类似单片机开发中的中断处理函数,用于响应单击事件),例如四个方向键的单击事件。以下代码我已经填充了单击后执行的蓝牙方法:写入数据,即发数据给连接到手机的蓝牙模块。
事件 按钮上.被单击()
BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))
结束 事件
事件 按钮下.被单击()
BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))
结束 事件
事件 按钮左.被单击()
BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))
结束 事件
事件 按钮右.被单击()
BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))
结束 事件
第三步,完成主窗口的创建工作,因为我们要使用蓝牙库,所以我们可以在APP启动后就申请使用蓝牙的权利,并初始化一个蓝牙对象。
另外就是要实现软件退出的操作,所以我们可以设置一个退出的按钮,实现结束程序。内容如下。
事件 主窗口.创建完毕()
'安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
如果 权限操作1.取系统版本号()=23 则
权限操作1.申请全部权限()
结束 如果
变量 结果 为 逻辑型
结果 = BLE蓝牙1.初始化()
弹出提示("初始化结果:" 结果)
结束 事件
事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
'可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
结束 事件
事件 图片框_返回.被单击()
结束程序()
结束 事件
第四步,实现蓝牙设备的搜索,从搜索到的蓝牙信号中选出我们要的那个,另外在搜索的过程中显示信号的强度
通过按钮单击实现搜索与停止搜索,并设定搜索时间为10秒,10秒后自动停止搜索。
通过发现设备事件,读取搜到的设备,并匹配名称是否为自己要找的信号。这里我内置了信号名称,也可以通过一个输入框,实现敏感信号名称的修改
如果发现的设备名称是指定名字的信号,就将名称和地址写入到列表框的项目,同时给项目做个编号和标记,方便后面取出
使用信号强度改变事件读取搜索中的信号强度,我们只读取感兴趣的那个名字的信号。
当列表中出现我们感兴趣的那个信号名称和地址时候,我们可以单击列表中的该项,触发连接设备,实现手机与蓝牙模块的连接。
同时通过颜色和文字提示是否连接上或者断开了。这可以使用BLE蓝牙对象的连接状态改变事件实现。
事件 搜索按钮.被单击()
如果 搜索按钮.标题 = "开始搜索" 则
位置传感器1.开始监测()
BLE蓝牙1.开始搜索()
时钟1.时钟周期 = 10*1000
搜索按钮.标题 = "停止搜索"
否则
BLE蓝牙1.停止搜索()
时钟1.时钟周期 = 0
搜索按钮.标题 = "开始搜索"
结束 如果
结束 事件
事件 时钟1.周期事件()
BLE蓝牙1.停止搜索()
搜索按钮.标题 = "开始搜索"
时钟1.时钟周期 = 0
结束 事件
事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
如果 名称 = "BT24" 则
'屏蔽掉没有名称的蓝牙设备
弹出提示("发现设备")
列表框1.添加项目("名称:" 名称 "\n地址:" 地址)
列表框1.置项目标记(列表框1.取项目数()-1,地址)
结束 如果
结束 事件
事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)
如果 名称 = "BT24" 则
列表框1.置项目内容(0,"名称:" 名称 "\n地址:" 地址 "\n信号:" 信号强度)
结束 如果
结束 事件
事件 列表框1.表项被单击(项目索引 为 整数型)
设备地址 = 列表框1.取项目标记(项目索引)
BLE蓝牙1.连接设备(设备地址)
'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))
弹出提示("正在连接")
连接状态.标题 = "正在连接"
结束 事件
事件 BLE蓝牙1.连接状态改变(状态 为 整数型)
如果 状态 = 1 则
连接状态.标题 = "已连接"
连接状态.背景颜色 = 绿色
否则
连接状态.标题 = "已断开"
连接状态.背景颜色 = 红色
结束 如果
结束 事件
第五步,通过服务提供的通道进行数据传输
连接上蓝牙模块后,就要建立通信的通道了,这需要通过服务来完成,因此我们要对连接的蓝牙模块索取服务的操作
这称为发现服务 事件,由于蓝牙模块中有多个服务可选,我们要找到我们可以进行通信的那个,这个通常在模块的手册也给了相关的短ID
称为服务UUID,每个服务又含有若干个通道UUID。因为模块的出厂设定,只有能用的那个服务才能通信,其他的服务是不可完全可读写的
在产生BLE蓝牙的发现服务事件后,会自动获取到服务的所有信心,装载到一个名字叫:服务信息的集合里,这个集合类型你就当类似C语言结构体数组的东西。
接下来为了验证每个服务是否可读写,就要一个一个测试,这类似,从一个结构体数组先一个一个读出来数组的元素,在数组元素的结构体里取结构体成员,
这就需要用到两层的for循环了,E4A 的for循环用一对 判断循环首---判断循环尾,进行包围。为了方便记,你可以给循环的变量起名字:i,j
然后就是测试对应的服务与通道是否可读,可写,可通知。如果三者都满足,那就是我们要找的通道,实际上,在多组的服务中,只有厂家指定的那组是
满足这三个条件的。其他的一般只能满足可读这一条。
找到合适的服务与通道后,想实现数据的接收,要执行 读取数据的方法,如果直接读,那么系统没有准备好呢,会导致读失败,后面就容易卡死。
这里就像初始化完单片机,要给系统以反应时间,等待个几百毫秒,然后再进行后面的操作一样。
这里就要用到定时器了,找到服务与通道后执行一个1000ms定时器的启动操作,在定时器计数满了之后的事件中执行读取数据的方法,
同时接收框显示服务和通道的ID,并关闭定时器。
事件 BLE蓝牙1.发现服务(服务信息 为 集合)
如果 服务信息.取项目总数() 0 则
退出
结束 如果
变量 i 为 整数型
变量 j 为 整数型
变量 信息数组 为 文本型()
i = 0
判断循环首 i 服务信息.取项目总数()
信息数组 = 服务信息.取项目(i)
j = 0
判断循环首 j 取数组成员数(信息数组)
如果 j 0 则
如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则
服务UUID = 信息数组(0)
通道UUID = 信息数组(j)
'BLE蓝牙1.读取数据(服务UUID,通道UUID)
'接收框.内容 = 服务UUID "\n" 通道UUID
时钟2.时钟周期 = 1000
结束 如果
结束 如果
j = j + 1
判断循环尾
i = i + 1
判断循环尾
结束 事件
事件 时钟2.周期事件()
BLE蓝牙1.读取数据(服务UUID,通道UUID)
接收框.内容 = 服务UUID "\n" 通道UUID
时钟2.时钟周期 = 0
结束 事件
执行完读取操作后,系统会在通道内有数据发送来的时候触发通道数据改变的事件,在该事件中我们读取数据,另外也会触发读取完毕的事件
发送数据是通过单击发送按钮触发写入数据方法实现的,当完成写入后可通过写入数据完毕事件知道是否发送成功。
事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
如果 结果 = 1 则
弹出提示("读取数据成功:" 通道UUID "\n数据:" 字节集到十六进制(数据))
否则
弹出提示("读取数据失败:" 通道UUID "\n数据:" 字节集到十六进制(数据))
结束 如果
结束 事件
事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
弹出提示("通道数据改变" 通道UUID "\n数据:" 字节集到十六进制(数据))
接收框.加入文本(字节到文本(数据,"GBK"))
结束 事件
事件 发送按钮.被单击()
BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))
结束 事件
事件 BLE蓝牙1.写入数据完毕(结果 为 整数型)
如果 结果 = 1 则
弹出提示("写入数据成功")
否则
弹出提示("写入数据失败")
结束 如果
结束 事件
其他的操作可在以下完整代码中查看
变量 服务UUID 为 文本型
变量 通道UUID 为 文本型
变量 设备地址 为 文本型
事件 主窗口.创建完毕()
'安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
如果 权限操作1.取系统版本号()=23 则
权限操作1.申请全部权限()
结束 如果
变量 结果 为 逻辑型
结果 = BLE蓝牙1.初始化()
弹出提示("初始化结果:" 结果)
结束 事件
事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
'可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
结束 事件
事件 图片框_返回.被单击()
结束程序()
结束 事件
事件 搜索按钮.被单击()
如果 搜索按钮.标题 = "开始搜索" 则
位置传感器1.开始监测()
BLE蓝牙1.开始搜索()
时钟1.时钟周期 = 10*1000
搜索按钮.标题 = "停止搜索"
否则
BLE蓝牙1.停止搜索()
时钟1.时钟周期 = 0
搜索按钮.标题 = "开始搜索"
结束 如果
结束 事件
事件 时钟1.周期事件()
BLE蓝牙1.停止搜索()
搜索按钮.标题 = "开始搜索"
时钟1.时钟周期 = 0
利用电脑做上位机开发一个软件,用单片机做下位机。在上位机上点击软件上的按钮能使单片机输出一路I/O口
主要涉及到单片机基础知识,重点是串口通信,上位机可以考虑vc和.net,这两种都可以。.net使用c#语言,感觉比较好上手,我也可以给你点视频教程,一学就会。
如何用c语言开发自己的上位机软件
一般开发上位机软件都是带图形界面的。C也能做出图形界面的软件,但是开发周期太长也不实用。所以最好还是需要会一些其他语言,例如C++,C#,Java这些做图形界面开发周期短的语言。既然会C,那么学习其他语言也只是一个熟悉语法的过程。所以很快就能上手,因为语言都是相通的嘛。可以开阔自己的视野去学习一下新的语言。不是说只会C有什么弊端,只是想说会的多才会知道语言之间的优劣。
【上下位机通信】:下位机(STM32)通过网口(DM9000之类的.)向上位机PC发送数据。求上位机例子程序~
用 socket 类 udp tcp 我这 给你个 最简单的 例子 udp
服务器端
Imports System.Net.Sockets
Imports System.Net
Module socketsever
Sub main()
startserver()
End Sub
Private Sub startserver()
'创建服务器端的socket
Dim sServer As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim myip As IPAddress
'制订本地回路的ip地址
myip = IPAddress.Parse("10.13.115.105")
'设置服务器端口号
Dim sServerep As New IPEndPoint(myip, 2001)
'设置客户端的端口号
Dim clientep As New IPEndPoint(myip, 2002)
'将端口与socket绑定
sServer.Bind(sServerep)
While True
Try
Dim bytes(100) As Byte
'等待客户端的请求
sServer.ReceiveFrom(bytes, clientep)
Dim str As String = System.Text.Encoding.ASCII.GetString(bytes)
'将字符转化成大写
str = str.ToUpper
bytes = System.Text.Encoding.ASCII.GetBytes(str)
'返回结果
sServer.SendTo(bytes, clientep)
Catch e As SocketException
End Try
End While
End Sub
End Module
客户端
界面 和程序
Imports System.Net.Sockets
Imports System.Net
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub bsend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsend.Click
'创建客户端的socket
Dim cClient As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
'指定本地回路的ip地址
Dim myip, myip1 As IPAddress
myip = IPAddress.Parse("10.13.115.105")
myip1 = IPAddress.Parse("10.13.115.136")
'设置服务器端口号
Dim Serverep As New IPEndPoint(myip1, 2001)
'设置客户端的端口号
Dim clientep As New IPEndPoint(myip, 2002)
'将端口与socket绑定
cClient.Bind(clientep)
Try
Dim str As String = Textinput.Text
Dim bytes() As Byte = System.Text.Encoding.ASCII.GetBytes(str)
'向服务器发出请求
cClient.SendTo(bytes, Serverep)
Dim bytes2(100) As Byte
'接受服务器的响应结果
cClient.ReceiveFrom(bytes2, Serverep)
str = System.Text.Encoding.ASCII.GetString(bytes2)
'将结果显示在文本框中
Textdisplay.Text = Textdisplay.Text vbNewLine str
Catch er As SocketException
MsgBox(er.ToString)
End Try
cClient.Close()
End Sub
End Class
vb串口通信程序实例
我也是自己摸索开发出来的每一款VBtoCOM通讯,有具体的思路如下:
给你推荐一个工具“com串口测试工具 ComTone V1.0 中文绿色版”
1、打开你的噪音计的测试软件,调整好串口号、通讯频率等等,我用温度计举例说明。
开始查询后有返回数值,这个Receive:就是返回的数值000304012200004b05,
打开串口监视精灵,监视软件的com口事件:
这里面的Write是测试软件发出的查询指令,read是设备返回的数据指令
Private Sub Command1_Click() '发送指令
If Not MSComm1.PortOpen Then
MSComm1.CommPort = 7 '串口为7
MSComm1.Settings = "9600,n,8,1"
MSComm1.InBufferCount = 0 '清除接收缓冲区
MSComm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.InputLen = 0 '读取接收缓冲区的所有字符
MSComm1.PortOpen = True '打开串口
MSComm1.RTSEnable = False '置为发送状态
End If
Dim pu() As Byte
Dim strdata As String
Dim crc_js() As Byte
ReDim pu(7) '这个数组是8位的查询指令
pu(0) = "H00" '温度计地址
pu(1) = "H03" '查询指令
pu(2) = "H00" '2、3为温度计地址
pu(3) = "H00" '2、3为温度计地址
pu(4) = "H00" '4、5为读取寄存器长度
pu(5) = "H02" '4、5为读取寄存器长度
pu(6) = "HC5" '6、7为CRC校验码 因为我们不知道设备的CRC校验规则所以用测试软件产生的校验码
pu(7) = "HDA" '6、7为CRC校验码
MSComm1.Output = pu
'不做任何事情,仅仅允许其它应用程序处理它们的事件。
DoEvents
MSComm1.InBufferCount = 0 '清除接收缓冲区
MSComm1.RThreshold = 9 '所要接收的数据长度,我们通过COM检测精灵看到了回传数据一共是9字节
MSComm1.RTSEnable = True '转为接收状态
End Sub
Private Sub Command2_Click()
Timer1.Enabled = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen Then
MSComm1.PortOpen = False '关闭串口
End If
Timer1.Enabled = False
End Sub
Private Sub MSComm1_OnComm() 'COM事件
Dim PA() As Byte
Dim PB As String
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputLen = 0 '读取接收缓冲区的所有字符
PB = MSComm1.Input
PA() = PB
For i = 0 To UBound(PA())
'Print "PA(" i ")"; PA(i)
If Len(Hex(PA(i))) = 1 Then
strdata = strdata "0" Hex(PA(i))
Else
strdata = strdata Hex(PA(i))
End If
Next
'回传的数据串:000304012600000AC4,这9字节根据通讯协议我们进行拆分
'00为协议内回传机号,03为读命令,04为返回的数据长度 0126 为我要的温度数据为十六进制表达,下面我进行数据处理
wd = CLng("H" Left(Right(strdata, 12), 4)) / 10 "℃" '根据通讯协议换算成温度
Text1 = Text1 vbCrLf strdata " " wd
strdata = ""
MSComm1.PortOpen = False '关闭串口
End Select
End Sub
Private Sub Timer1_Timer()
Call Command1_Click
End Sub
这是我的测试结果。
下面是通讯协议
这个是我的软件用检测精灵检测的结果
关于上位机软件开发实例和上位机软件设计方案的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。