人妻无码αv中文字幕久久琪琪布|99999国产精品欧美久久久久|国产精品久久久久久久久久久搜索|精品国产香蕉伊思人在线又爽又黄|国语av狠狠色丁香婷婷综合激情|精品老妇人一区二区三区在线视频|99精品国产高清一区二区三区香蕉

上位機(jī)軟件開(kāi)發(fā)實(shí)例(上位機(jī)軟件開(kāi)發(fā)教程)

軟件開(kāi)發(fā) 3624
本篇文章給大家談?wù)勆衔粰C(jī)軟件開(kāi)發(fā)實(shí)例,以及上位機(jī)軟件開(kāi)發(fā)教程對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、vb串口通信程序?qū)嵗? 2、

本篇文章給大家談?wù)勆衔粰C(jī)軟件開(kāi)發(fā)實(shí)例,以及上位機(jī)軟件開(kāi)發(fā)教程對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。

本文目錄一覽:

If?Not?MSComm1.PortOpen?Then

??MSComm1.CommPort?=?7?'串口為7

??MSComm1.Settings?=?"9600,n,8,1"

??MSComm1.InBufferCount?=?0?'清除接收緩沖區(qū)

??MSComm1.OutBufferCount?=?0?'清除發(fā)送緩沖區(qū)

??MSComm1.InputMode?=?comInputModeBinary?'二進(jìn)制接收

??MSComm1.InputLen?=?0?'讀取接收緩沖區(qū)的所有字符

??MSComm1.PortOpen?=?True??'打開(kāi)串口

??MSComm1.RTSEnable?=?False?'置為發(fā)送狀態(tài)

End?If

Dim?pu()?As?Byte

Dim?strdata??As?String

Dim?crc_js()?As?Byte

ReDim?pu(7)??'這個(gè)數(shù)組是8位的查詢(xún)指令

pu(0)?=?"H00"?'溫度計(jì)地址

pu(1)?=?"H03"?'查詢(xún)指令

pu(2)?=?"H00"?'2、3為溫度計(jì)地址

pu(3)?=?"H00"?'2、3為溫度計(jì)地址

pu(4)?=?"H00"?'4、5為讀取寄存器長(zhǎng)度

pu(5)?=?"H02"?'4、5為讀取寄存器長(zhǎng)度

pu(6)?=?"HC5"?'6、7為CRC校驗(yàn)碼?因?yàn)槲覀儾恢涝O(shè)備的CRC校驗(yàn)規(guī)則所以用測(cè)試軟件產(chǎn)生的校驗(yàn)碼

pu(7)?=?"HDA"?'6、7為CRC校驗(yàn)碼

MSComm1.Output?=?pu

'不做任何事情,僅僅允許其它應(yīng)用程序處理它們的事件。

DoEvents

MSComm1.InBufferCount?=?0?'清除接收緩沖區(qū)

MSComm1.RThreshold?=?9?'所要接收的數(shù)據(jù)長(zhǎng)度,我們通過(guò)COM檢測(cè)精靈看到了回傳數(shù)據(jù)一共是9字節(jié)

MSComm1.RTSEnable?=?True?'轉(zhuǎn)為接收狀態(tài)

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??'關(guān)閉串口

????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?'讀取接收緩沖區(qū)的所有字符

????????????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

????????????'回傳的數(shù)據(jù)串:000304012600000AC4,這9字節(jié)根據(jù)通訊協(xié)議我們進(jìn)行拆分

????????????'00為協(xié)議內(nèi)回傳機(jī)號(hào),03為讀命令,04為返回的數(shù)據(jù)長(zhǎng)度?0126?為我要的溫度數(shù)據(jù)為十六進(jìn)制表達(dá),下面我進(jìn)行數(shù)據(jù)處理

????????????wd?=?CLng("H"??Left(Right(strdata,?12),?4))?/?10??"℃"???'根據(jù)通訊協(xié)議換算成溫度

????????????Text1?=?Text1??vbCrLf??strdata??"??"??wd

????????????strdata?=?""

???MSComm1.PortOpen?=?False??'關(guān)閉串口

?End?Select

End?Sub

Private?Sub?Timer1_Timer()

Call?Command1_Click

End?Sub

這是我的測(cè)試結(jié)果。

下面是通訊協(xié)議

這個(gè)是我的軟件用檢測(cè)精靈檢測(cè)的結(jié)果

如何用c語(yǔ)言開(kāi)發(fā)自己的上位機(jī)軟件

一般開(kāi)發(fā)上位機(jī)軟件都是帶圖形界面的。C也能做出圖形界面的軟件,但是開(kāi)發(fā)周期太長(zhǎng)也不實(shí)用。所以最好還是需要會(huì)一些其他語(yǔ)言,例如C++,C#,Java這些做圖形界面開(kāi)發(fā)周期短的語(yǔ)言。既然會(huì)C,那么學(xué)習(xí)其他語(yǔ)言也只是一個(gè)熟悉語(yǔ)法的過(guò)程。所以很快就能上手,因?yàn)檎Z(yǔ)言都是相通的嘛??梢蚤_(kāi)闊自己的視野去學(xué)習(xí)一下新的語(yǔ)言。不是說(shuō)只會(huì)C有什么弊端,只是想說(shuō)會(huì)的多才會(huì)知道語(yǔ)言之間的優(yōu)劣。

藍(lán)牙上位機(jī)app有哪些

做安卓手機(jī)APP通常使用高端大氣的Android Studio,開(kāi)發(fā)語(yǔ)言是Java,該開(kāi)發(fā)IDE就是體積大

學(xué)習(xí)成本高,入手慢,這里給大家推薦一款國(guó)產(chǎn)的軟件,體積小,運(yùn)行和編譯速度快。最重要的是編程語(yǔ)言是中文

這個(gè)軟件就是E4A.

本次我將向大家介紹如何使用E4A開(kāi)發(fā)BLE藍(lán)牙手機(jī)上位機(jī)APP。

當(dāng)然,該軟件自帶了豐富的例子,也提供了一個(gè)BLE例子,大家可以借鑒。

由于沒(méi)有提供各種庫(kù)的說(shuō)明文檔和幫助文件,學(xué)這個(gè)軟件可能有經(jīng)過(guò)一段摸索,這里我將向大家介紹我在開(kāi)發(fā)這個(gè)軟件中

獲得的經(jīng)驗(yàn)。

中文編程語(yǔ)言:易語(yǔ)言,采用中文作為關(guān)鍵字,但是編程的語(yǔ)法和思想和C語(yǔ)言是類(lèi)似的

為了方便理解,這里我結(jié)合單片機(jī)開(kāi)發(fā)的思路簡(jiǎn)單介紹一下

變量要聲明類(lèi)型

對(duì)象操作的函數(shù)稱(chēng)為:方法

對(duì)象可觸發(fā)的中斷函數(shù)稱(chēng)為:事件

對(duì)象可設(shè)置的參數(shù)稱(chēng)為:屬性

-----------------------------------------------------------------------------------------

好接下來(lái)介紹 BLE藍(lán)牙庫(kù)

BLE(Bluetooth Low Energe)低功耗藍(lán)牙設(shè)備主要用于智能穿戴和物聯(lián)網(wǎng)。

BLE藍(lán)牙類(lèi)庫(kù),包含兩種操作:方法和事件

方法:

初始化

置可被發(fā)現(xiàn)

開(kāi)始搜索

停止搜索

連接設(shè)備

斷開(kāi)連接

釋放資源

是否可讀

是否可寫(xiě)

是否可通知

讀取數(shù)據(jù)

寫(xiě)入數(shù)據(jù)

事件:

創(chuàng)建完畢

發(fā)現(xiàn)設(shè)備

信號(hào)強(qiáng)度改變

發(fā)現(xiàn)服務(wù)

連接狀態(tài)改變

讀取數(shù)據(jù)完畢

通道數(shù)據(jù)改變

由于不存在可見(jiàn)的對(duì)象,因此藍(lán)牙沒(méi)有屬性設(shè)置。

了解方法和事件的用法可通過(guò)左側(cè)類(lèi)庫(kù)目錄選中對(duì)應(yīng)的條目,在下面的提示信息中查看

例如選中BLE藍(lán)牙庫(kù)的方法 初始化 條目后:

方法:初始化()為 邏輯型

分類(lèi):BLE藍(lán)牙類(lèi)庫(kù)---BLE藍(lán)牙

注釋?zhuān)撼跏蓟疊LE藍(lán)牙設(shè)備,成功返回真,失敗返回假,BLE藍(lán)牙需要安卓4.3以上系統(tǒng)的支持。

另外 事件類(lèi)似中斷函數(shù),因此在代碼中沒(méi)有先后順序,可以根據(jù)易讀的排列順序進(jìn)行排版。

所有的動(dòng)作均屬于觸發(fā)的事件,因此,方法通常在事件里面進(jìn)行調(diào)用。

自己創(chuàng)建的函數(shù),需要自己實(shí)現(xiàn)該函數(shù)的具體過(guò)程,因此函數(shù)在這里稱(chēng)為:過(guò)程

不過(guò)我們這里做BLE藍(lán)牙APP可以不用到過(guò)程。

好了,基本的概念已經(jīng)介紹了,我們可以開(kāi)始整了。

-----------------------------------------------------------------------------------------

第一步,先根據(jù)我們的需要完成可視化的組件布局,并給添加的組件起上一個(gè)跟操作相關(guān)的名字,在組件的屬性對(duì)話框設(shè)置,同時(shí)可以設(shè)置組件的其他相關(guān)屬性。

?

第二步,使用中需要完成單擊響應(yīng)的,我們可以在設(shè)計(jì)區(qū)直接雙擊組件,即可自動(dòng)在代碼區(qū)生成一個(gè)空的事件(類(lèi)似單片機(jī)開(kāi)發(fā)中的中斷處理函數(shù),用于響應(yīng)單擊事件),例如四個(gè)方向鍵的單擊事件。以下代碼我已經(jīng)填充了單擊后執(zhí)行的藍(lán)牙方法:寫(xiě)入數(shù)據(jù),即發(fā)數(shù)據(jù)給連接到手機(jī)的藍(lán)牙模塊。

事件 按鈕上.被單擊()

BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)(服務(wù)UUID,通道UUID,文本到字節(jié)("上\n","GBK"))

結(jié)束 事件

事件 按鈕下.被單擊()

BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)(服務(wù)UUID,通道UUID,文本到字節(jié)("下\n","GBK"))

結(jié)束 事件

事件 按鈕左.被單擊()

BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)(服務(wù)UUID,通道UUID,文本到字節(jié)("左\n","GBK"))

結(jié)束 事件

事件 按鈕右.被單擊()

BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)(服務(wù)UUID,通道UUID,文本到字節(jié)("右\n","GBK"))

結(jié)束 事件

第三步,完成主窗口的創(chuàng)建工作,因?yàn)槲覀円褂盟{(lán)牙庫(kù),所以我們可以在APP啟動(dòng)后就申請(qǐng)使用藍(lán)牙的權(quán)利,并初始化一個(gè)藍(lán)牙對(duì)象。

另外就是要實(shí)現(xiàn)軟件退出的操作,所以我們可以設(shè)置一個(gè)退出的按鈕,實(shí)現(xiàn)結(jié)束程序。內(nèi)容如下。

事件 主窗口.創(chuàng)建完畢()

'安卓6.0以上的系統(tǒng)需要?jiǎng)討B(tài)申請(qǐng)權(quán)限,否則app可能無(wú)法正常運(yùn)行

如果 權(quán)限操作1.取系統(tǒng)版本號(hào)()=23 則

權(quán)限操作1.申請(qǐng)全部權(quán)限()

結(jié)束 如果

變量 結(jié)果 為 邏輯型

結(jié)果 = BLE藍(lán)牙1.初始化()

彈出提示("初始化結(jié)果:" 結(jié)果)

結(jié)束 事件

事件 權(quán)限操作1.申請(qǐng)完畢(權(quán)限數(shù)組 為 文本型(),申請(qǐng)結(jié)果 為 整數(shù)型())

'可以把需要特殊權(quán)限的代碼寫(xiě)在此處,當(dāng)申請(qǐng)權(quán)限成功后再執(zhí)行相關(guān)代碼

結(jié)束 事件

事件 圖片框_返回.被單擊()

結(jié)束程序()

結(jié)束 事件

第四步,實(shí)現(xiàn)藍(lán)牙設(shè)備的搜索,從搜索到的藍(lán)牙信號(hào)中選出我們要的那個(gè),另外在搜索的過(guò)程中顯示信號(hào)的強(qiáng)度

通過(guò)按鈕單擊實(shí)現(xiàn)搜索與停止搜索,并設(shè)定搜索時(shí)間為10秒,10秒后自動(dòng)停止搜索。

通過(guò)發(fā)現(xiàn)設(shè)備事件,讀取搜到的設(shè)備,并匹配名稱(chēng)是否為自己要找的信號(hào)。這里我內(nèi)置了信號(hào)名稱(chēng),也可以通過(guò)一個(gè)輸入框,實(shí)現(xiàn)敏感信號(hào)名稱(chēng)的修改

如果發(fā)現(xiàn)的設(shè)備名稱(chēng)是指定名字的信號(hào),就將名稱(chēng)和地址寫(xiě)入到列表框的項(xiàng)目,同時(shí)給項(xiàng)目做個(gè)編號(hào)和標(biāo)記,方便后面取出

使用信號(hào)強(qiáng)度改變事件讀取搜索中的信號(hào)強(qiáng)度,我們只讀取感興趣的那個(gè)名字的信號(hào)。

當(dāng)列表中出現(xiàn)我們感興趣的那個(gè)信號(hào)名稱(chēng)和地址時(shí)候,我們可以單擊列表中的該項(xiàng),觸發(fā)連接設(shè)備,實(shí)現(xiàn)手機(jī)與藍(lán)牙模塊的連接。

同時(shí)通過(guò)顏色和文字提示是否連接上或者斷開(kāi)了。這可以使用BLE藍(lán)牙對(duì)象的連接狀態(tài)改變事件實(shí)現(xiàn)。

事件 搜索按鈕.被單擊()

如果 搜索按鈕.標(biāo)題 = "開(kāi)始搜索" 則

位置傳感器1.開(kāi)始監(jiān)測(cè)()

BLE藍(lán)牙1.開(kāi)始搜索()

時(shí)鐘1.時(shí)鐘周期 = 10*1000

搜索按鈕.標(biāo)題 = "停止搜索"

否則

BLE藍(lán)牙1.停止搜索()

時(shí)鐘1.時(shí)鐘周期 = 0

搜索按鈕.標(biāo)題 = "開(kāi)始搜索"

結(jié)束 如果

結(jié)束 事件

事件 時(shí)鐘1.周期事件()

BLE藍(lán)牙1.停止搜索()

搜索按鈕.標(biāo)題 = "開(kāi)始搜索"

時(shí)鐘1.時(shí)鐘周期 = 0

結(jié)束 事件

事件 BLE藍(lán)牙1.發(fā)現(xiàn)設(shè)備(名稱(chēng) 為 文本型,地址 為 文本型,MajorID 為 整數(shù)型,MinorID 為 整數(shù)型,配對(duì)狀態(tài) 為 整數(shù)型)

如果 名稱(chēng) = "BT24" 則

'屏蔽掉沒(méi)有名稱(chēng)的藍(lán)牙設(shè)備

彈出提示("發(fā)現(xiàn)設(shè)備")

列表框1.添加項(xiàng)目("名稱(chēng):" 名稱(chēng) "\n地址:" 地址)

列表框1.置項(xiàng)目標(biāo)記(列表框1.取項(xiàng)目數(shù)()-1,地址)

結(jié)束 如果

結(jié)束 事件

事件 BLE藍(lán)牙1.信號(hào)強(qiáng)度改變(名稱(chēng) 為 文本型,地址 為 文本型,信號(hào)強(qiáng)度 為 整數(shù)型)

如果 名稱(chēng) = "BT24" 則

列表框1.置項(xiàng)目?jī)?nèi)容(0,"名稱(chēng):" 名稱(chēng) "\n地址:" 地址 "\n信號(hào):" 信號(hào)強(qiáng)度)

結(jié)束 如果

結(jié)束 事件

事件 列表框1.表項(xiàng)被單擊(項(xiàng)目索引 為 整數(shù)型)

設(shè)備地址 = 列表框1.取項(xiàng)目標(biāo)記(項(xiàng)目索引)

BLE藍(lán)牙1.連接設(shè)備(設(shè)備地址)

'BLE藍(lán)牙1.連接設(shè)備(列表框1.取項(xiàng)目標(biāo)記(項(xiàng)目索引))

彈出提示("正在連接")

連接狀態(tài).標(biāo)題 = "正在連接"

結(jié)束 事件

事件 BLE藍(lán)牙1.連接狀態(tài)改變(狀態(tài) 為 整數(shù)型)

如果 狀態(tài) = 1 則

連接狀態(tài).標(biāo)題 = "已連接"

連接狀態(tài).背景顏色 = 綠色

否則

連接狀態(tài).標(biāo)題 = "已斷開(kāi)"

連接狀態(tài).背景顏色 = 紅色

結(jié)束 如果

結(jié)束 事件

第五步,通過(guò)服務(wù)提供的通道進(jìn)行數(shù)據(jù)傳輸

連接上藍(lán)牙模塊后,就要建立通信的通道了,這需要通過(guò)服務(wù)來(lái)完成,因此我們要對(duì)連接的藍(lán)牙模塊索取服務(wù)的操作

這稱(chēng)為發(fā)現(xiàn)服務(wù) 事件,由于藍(lán)牙模塊中有多個(gè)服務(wù)可選,我們要找到我們可以進(jìn)行通信的那個(gè),這個(gè)通常在模塊的手冊(cè)也給了相關(guān)的短ID

稱(chēng)為服務(wù)UUID,每個(gè)服務(wù)又含有若干個(gè)通道UUID。因?yàn)槟K的出廠設(shè)定,只有能用的那個(gè)服務(wù)才能通信,其他的服務(wù)是不可完全可讀寫(xiě)的

在產(chǎn)生BLE藍(lán)牙的發(fā)現(xiàn)服務(wù)事件后,會(huì)自動(dòng)獲取到服務(wù)的所有信心,裝載到一個(gè)名字叫:服務(wù)信息的集合里,這個(gè)集合類(lèi)型你就當(dāng)類(lèi)似C語(yǔ)言結(jié)構(gòu)體數(shù)組的東西。

接下來(lái)為了驗(yàn)證每個(gè)服務(wù)是否可讀寫(xiě),就要一個(gè)一個(gè)測(cè)試,這類(lèi)似,從一個(gè)結(jié)構(gòu)體數(shù)組先一個(gè)一個(gè)讀出來(lái)數(shù)組的元素,在數(shù)組元素的結(jié)構(gòu)體里取結(jié)構(gòu)體成員,

這就需要用到兩層的for循環(huán)了,E4A 的for循環(huán)用一對(duì) 判斷循環(huán)首---判斷循環(huán)尾,進(jìn)行包圍。為了方便記,你可以給循環(huán)的變量起名字:i,j

然后就是測(cè)試對(duì)應(yīng)的服務(wù)與通道是否可讀,可寫(xiě),可通知。如果三者都滿(mǎn)足,那就是我們要找的通道,實(shí)際上,在多組的服務(wù)中,只有廠家指定的那組是

滿(mǎn)足這三個(gè)條件的。其他的一般只能滿(mǎn)足可讀這一條。

找到合適的服務(wù)與通道后,想實(shí)現(xiàn)數(shù)據(jù)的接收,要執(zhí)行 讀取數(shù)據(jù)的方法,如果直接讀,那么系統(tǒng)沒(méi)有準(zhǔn)備好呢,會(huì)導(dǎo)致讀失敗,后面就容易卡死。

這里就像初始化完單片機(jī),要給系統(tǒng)以反應(yīng)時(shí)間,等待個(gè)幾百毫秒,然后再進(jìn)行后面的操作一樣。

這里就要用到定時(shí)器了,找到服務(wù)與通道后執(zhí)行一個(gè)1000ms定時(shí)器的啟動(dòng)操作,在定時(shí)器計(jì)數(shù)滿(mǎn)了之后的事件中執(zhí)行讀取數(shù)據(jù)的方法,

同時(shí)接收框顯示服務(wù)和通道的ID,并關(guān)閉定時(shí)器。

事件 BLE藍(lán)牙1.發(fā)現(xiàn)服務(wù)(服務(wù)信息 為 集合)

如果 服務(wù)信息.取項(xiàng)目總數(shù)() 0 則

退出

結(jié)束 如果

變量 i 為 整數(shù)型

變量 j 為 整數(shù)型

變量 信息數(shù)組 為 文本型()

i = 0

判斷循環(huán)首 i 服務(wù)信息.取項(xiàng)目總數(shù)()

信息數(shù)組 = 服務(wù)信息.取項(xiàng)目(i)

j = 0

判斷循環(huán)首 j 取數(shù)組成員數(shù)(信息數(shù)組)

如果 j 0 則

如果 BLE藍(lán)牙1.是否可讀(信息數(shù)組(0),信息數(shù)組(j)) = 真 且 BLE藍(lán)牙1.是否可寫(xiě)(信息數(shù)組(0),信息數(shù)組(j)) =真 且 BLE藍(lán)牙1.是否可通知(信息數(shù)組(0),信息數(shù)組(j)) =真 則

服務(wù)UUID = 信息數(shù)組(0)

通道UUID = 信息數(shù)組(j)

'BLE藍(lán)牙1.讀取數(shù)據(jù)(服務(wù)UUID,通道UUID)

'接收框.內(nèi)容 = 服務(wù)UUID "\n" 通道UUID

時(shí)鐘2.時(shí)鐘周期 = 1000

結(jié)束 如果

結(jié)束 如果

j = j + 1

判斷循環(huán)尾

i = i + 1

判斷循環(huán)尾

結(jié)束 事件

事件 時(shí)鐘2.周期事件()

BLE藍(lán)牙1.讀取數(shù)據(jù)(服務(wù)UUID,通道UUID)

接收框.內(nèi)容 = 服務(wù)UUID "\n" 通道UUID

時(shí)鐘2.時(shí)鐘周期 = 0

結(jié)束 事件

執(zhí)行完讀取操作后,系統(tǒng)會(huì)在通道內(nèi)有數(shù)據(jù)發(fā)送來(lái)的時(shí)候觸發(fā)通道數(shù)據(jù)改變的事件,在該事件中我們讀取數(shù)據(jù),另外也會(huì)觸發(fā)讀取完畢的事件

發(fā)送數(shù)據(jù)是通過(guò)單擊發(fā)送按鈕觸發(fā)寫(xiě)入數(shù)據(jù)方法實(shí)現(xiàn)的,當(dāng)完成寫(xiě)入后可通過(guò)寫(xiě)入數(shù)據(jù)完畢事件知道是否發(fā)送成功。

事件 BLE藍(lán)牙1.讀取數(shù)據(jù)完畢(結(jié)果 為 整數(shù)型,服務(wù)UUID 為 文本型,通道UUID 為 文本型,數(shù)據(jù) 為 字節(jié)型())

如果 結(jié)果 = 1 則

彈出提示("讀取數(shù)據(jù)成功:" 通道UUID "\n數(shù)據(jù):" 字節(jié)集到十六進(jìn)制(數(shù)據(jù)))

否則

彈出提示("讀取數(shù)據(jù)失?。? 通道UUID "\n數(shù)據(jù):" 字節(jié)集到十六進(jìn)制(數(shù)據(jù)))

結(jié)束 如果

結(jié)束 事件

事件 BLE藍(lán)牙1.通道數(shù)據(jù)改變(服務(wù)UUID 為 文本型,通道UUID 為 文本型,數(shù)據(jù) 為 字節(jié)型())

彈出提示("通道數(shù)據(jù)改變" 通道UUID "\n數(shù)據(jù):" 字節(jié)集到十六進(jìn)制(數(shù)據(jù)))

接收框.加入文本(字節(jié)到文本(數(shù)據(jù),"GBK"))

結(jié)束 事件

事件 發(fā)送按鈕.被單擊()

BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)(服務(wù)UUID,通道UUID,文本到字節(jié)(發(fā)送框.內(nèi)容,"GBK"))

結(jié)束 事件

事件 BLE藍(lán)牙1.寫(xiě)入數(shù)據(jù)完畢(結(jié)果 為 整數(shù)型)

如果 結(jié)果 = 1 則

彈出提示("寫(xiě)入數(shù)據(jù)成功")

否則

彈出提示("寫(xiě)入數(shù)據(jù)失敗")

結(jié)束 如果

結(jié)束 事件

其他的操作可在以下完整代碼中查看

變量 服務(wù)UUID 為 文本型

變量 通道UUID 為 文本型

變量 設(shè)備地址 為 文本型

事件 主窗口.創(chuàng)建完畢()

'安卓6.0以上的系統(tǒng)需要?jiǎng)討B(tài)申請(qǐng)權(quán)限,否則app可能無(wú)法正常運(yùn)行

如果 權(quán)限操作1.取系統(tǒng)版本號(hào)()=23 則

權(quán)限操作1.申請(qǐng)全部權(quán)限()

結(jié)束 如果

變量 結(jié)果 為 邏輯型

結(jié)果 = BLE藍(lán)牙1.初始化()

彈出提示("初始化結(jié)果:" 結(jié)果)

結(jié)束 事件

事件 權(quán)限操作1.申請(qǐng)完畢(權(quán)限數(shù)組 為 文本型(),申請(qǐng)結(jié)果 為 整數(shù)型())

'可以把需要特殊權(quán)限的代碼寫(xiě)在此處,當(dāng)申請(qǐng)權(quán)限成功后再執(zhí)行相關(guān)代碼

結(jié)束 事件

事件 圖片框_返回.被單擊()

結(jié)束程序()

結(jié)束 事件

事件 搜索按鈕.被單擊()

如果 搜索按鈕.標(biāo)題 = "開(kāi)始搜索" 則

位置傳感器1.開(kāi)始監(jiān)測(cè)()

BLE藍(lán)牙1.開(kāi)始搜索()

時(shí)鐘1.時(shí)鐘周期 = 10*1000

搜索按鈕.標(biāo)題 = "停止搜索"

否則

BLE藍(lán)牙1.停止搜索()

時(shí)鐘1.時(shí)鐘周期 = 0

搜索按鈕.標(biāo)題 = "開(kāi)始搜索"

結(jié)束 如果

結(jié)束 事件

事件 時(shí)鐘1.周期事件()

BLE藍(lán)牙1.停止搜索()

搜索按鈕.標(biāo)題 = "開(kāi)始搜索"

時(shí)鐘1.時(shí)鐘周期 = 0

【上下位機(jī)通信】:下位機(jī)(STM32)通過(guò)網(wǎng)口(DM9000之類(lèi)的.)向上位機(jī)PC發(fā)送數(shù)據(jù)。求上位機(jī)例子程序~

?用?socket? 類(lèi)? udp? tcp? ? ? ?我這?給你個(gè)? 最簡(jiǎn)單的?例子? udp

服務(wù)器端

Imports?System.Net.Sockets

Imports?System.Net

Module?socketsever

? Sub?main()

? ? ? startserver()

? ? End?Sub

? Private?Sub?startserver()

? ? ? '創(chuàng)建服務(wù)器端的socket

? ? ? Dim?sServer?As?New?Socket(AddressFamily.InterNetwork,?SocketType.Dgram,?ProtocolType.Udp)

? ? ? Dim?myip?As?IPAddress

? ? ? '制訂本地回路的ip地址

? ? ? myip?=?IPAddress.Parse("10.13.115.105")

? ? ? '設(shè)置服務(wù)器端口號(hào)

? ? ? Dim?sServerep?As?New?IPEndPoint(myip,?2001)

? ? ? '設(shè)置客戶(hù)端的端口號(hào)

? ? ? Dim?clientep?As?New?IPEndPoint(myip,?2002)

? ? ? '將端口與socket綁定

? ? ? sServer.Bind(sServerep)

? ? ? While?True

? ? ? ? ? Try

? ? ? ? ? ? ? Dim?bytes(100)?As?Byte

? ? ? ? ? ? ? '等待客戶(hù)端的請(qǐng)求

? ? ? ? ? ? ? sServer.ReceiveFrom(bytes,?clientep)

? ? ? ? ? ? ? Dim?str?As?String?=?System.Text.Encoding.ASCII.GetString(bytes)

? ? ? ? ? ? ? '將字符轉(zhuǎn)化成大寫(xiě)

? ? ? ? ? ? ? str?=?str.ToUpper

? ? ? ? ? ? ? bytes?=?System.Text.Encoding.ASCII.GetBytes(str)

? ? ? ? ? ? ? '返回結(jié)果

? ? ? ? ? ? ? sServer.SendTo(bytes,?clientep)

? ? ? ? ? Catch?e?As?SocketException

? ? ? ? ? End?Try

? ? ? End?While

? End?Sub

End?Module

客戶(hù)端

界面? 和程序

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

? ? ? '創(chuàng)建客戶(hù)端的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")

? ? ? '設(shè)置服務(wù)器端口號(hào)

? ? ? Dim?Serverep?As?New?IPEndPoint(myip1,?2001)

? ? ? '設(shè)置客戶(hù)端的端口號(hào)

? ? ? 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)

? ? ? ? ? '向服務(wù)器發(fā)出請(qǐng)求

? ? ? ? ? cClient.SendTo(bytes,?Serverep)

? ? ? ? ? Dim?bytes2(100)?As?Byte

? ? ? ? ? '接受服務(wù)器的響應(yīng)結(jié)果

? ? ? ? ? cClient.ReceiveFrom(bytes2,?Serverep)

? ? ? ? ? str?=?System.Text.Encoding.ASCII.GetString(bytes2)

? ? ? ? ? '將結(jié)果顯示在文本框中

? ? ? ? ? Textdisplay.Text?=?Textdisplay.Text??vbNewLine??str

? ? ? Catch?er?As?SocketException

? ? ? ? ? MsgBox(er.ToString)

? ? ? End?Try

? ? ? cClient.Close()

? End?Sub

End?Class

利用電腦做上位機(jī)開(kāi)發(fā)一個(gè)軟件,用單片機(jī)做下位機(jī)。在上位機(jī)上點(diǎn)擊軟件上的按鈕能使單片機(jī)輸出一路I/O口

主要涉及到單片機(jī)基礎(chǔ)知識(shí),重點(diǎn)是串口通信,上位機(jī)可以考慮vc和.net,這兩種都可以。.net使用c#語(yǔ)言,感覺(jué)比較好上手,我也可以給你點(diǎn)視頻教程,一學(xué)就會(huì)。

關(guān)于上位機(jī)軟件開(kāi)發(fā)實(shí)例和上位機(jī)軟件開(kāi)發(fā)教程的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

掃碼二維碼