最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

這樣學(xué)上位機(jī),是不是有意思多了

2021-05-12 18:11 作者:付工上位機(jī)實(shí)戰(zhàn)  | 我要投稿

寫在前面

有小伙伴跟我說:

為了兌現(xiàn)承諾,這次給大家安排一個(gè)小項(xiàng)目案例,不管你是小白,還是有一定基礎(chǔ),都可以參與進(jìn)來,一起把這個(gè)項(xiàng)目做出來。

項(xiàng)目需求

1、建立一個(gè)室內(nèi)空氣質(zhì)量檢測系統(tǒng),要求電腦軟件+單片機(jī)硬件,編程語言及硬件可以自行選擇。

2、系統(tǒng)分為三部分:數(shù)據(jù)采集部分、數(shù)據(jù)傳輸部分、系統(tǒng)軟件交互部分。

3、需求檢測的數(shù)據(jù):IAQ(Indoor Air Quality)、溫度、濕度、PM2.5、CO2、CO。

4、數(shù)據(jù)傳輸可以選擇串口、以太網(wǎng)、WIFI、藍(lán)牙中的一種。

5、當(dāng)檢測到空氣質(zhì)量過差時(shí),系統(tǒng)需要給出相應(yīng)的解決方案(如:提示開窗通風(fēng)等)。

協(xié)議分析

這個(gè)項(xiàng)目其實(shí)涉及到單片機(jī)開發(fā),但這塊并不是上位機(jī)的范疇。在確定好上位機(jī)與單片機(jī)之間的通信協(xié)議之后,雙方都按照這個(gè)協(xié)議來開發(fā),最終進(jìn)行對(duì)接就可以了。 這個(gè)協(xié)議一般是由單片機(jī)開發(fā)人員制定,本例協(xié)議制定如下:

  • 單片機(jī)發(fā)送的數(shù)據(jù)格式:#TXXX,YYY,S@

1、#后面的大寫英文T表示對(duì)應(yīng)的參數(shù)類型,具體對(duì)應(yīng)關(guān)系如下:

2、XXX:代表檢測數(shù)值,占三個(gè)字符,例如010就是10。

3、YYY:代表該數(shù)組的限值,占三個(gè)字符,例如010就是10。

4、符號(hào)@前的S表示報(bào)警狀態(tài),1表示限值報(bào)警,0表示正常

  • 上位機(jī)進(jìn)行限值設(shè)置發(fā)送數(shù)據(jù)格式:&SXXX$

1、&號(hào)后面的大寫英文T表示對(duì)應(yīng)的參數(shù)類型,對(duì)應(yīng)關(guān)系同上。

2、XXX代表設(shè)置的限值數(shù)據(jù),占三個(gè)字符

3、發(fā)送報(bào)文以$結(jié)束。

界面設(shè)計(jì)

根據(jù)項(xiàng)目需求,并結(jié)合協(xié)議設(shè)計(jì)界面如下:

本案例的一個(gè)關(guān)鍵知識(shí)點(diǎn)在于自定義組合控件的使用。

如果讓你來設(shè)計(jì)這個(gè)界面,你是否會(huì)考慮組合控件應(yīng)用,如果全部用的是系統(tǒng)控件,那么代碼會(huì)寫得很復(fù)雜,而且容易出錯(cuò),更重要的是擴(kuò)展性會(huì)很差——如果需求發(fā)生變化,會(huì)需要改很多東西。

這里把參數(shù)的一系列狀態(tài)及操作做成一個(gè)自定義控件,然后將相關(guān)的功能抽象成屬性及事件。

實(shí)時(shí)通信

這里采用串口通信,針對(duì)SerialPort封裝一個(gè)串口類,這里會(huì)涉及到串口通信、鎖處理、委托技術(shù),核心為串口接收事件,代碼如下:

? ? ? private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e) ? ? ? ?{ ? ? ? ? ? ?Thread.Sleep(50); ? ? ? ? ? ?int ByteToRead = MyCom.BytesToRead; ? ? ? ? ? ?lock (Lock) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?//定義一個(gè)字節(jié)數(shù)組 ? ? ? ? ? ? ? ?byte[] rcv = new byte[ByteToRead]; ? ? ? ? ? ? ? ?//讀取緩沖區(qū)里的數(shù)據(jù)放到字節(jié)數(shù)組中 ? ? ? ? ? ? ? ?MyCom.Read(rcv, 0, ByteToRead); ? ? ? ? ? ? ? ?//這里如果想把字節(jié)數(shù)組給到主線程,需要使用委托 ? ? ? ? ? ? ? ?ShowMsg?.Invoke(rcv); ? ? ? ? ? ?} ? ? ? ?}

參數(shù)設(shè)置功能:

? ? ? ?public bool SetValue(int Speed,Type type) ? ? ? ?{ ? ? ? ? ? ?StringBuilder stringBuilder = new StringBuilder("&"); ? ? ? ? ? ?stringBuilder.Append(type.ToString()); ? ? ? ? ? stringBuilder.Append(Speed.ToString().PadLeft(3, '0')); ? ? ? ? ? ?stringBuilder.Append("$"); ? ? ? ? ? ?lock (Lock) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?try ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?this.MyCom.Write(stringBuilder.ToString()); ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?catch (Exception) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?return false; ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?return true; ? ? ? ? ? ?} ? ? ? ?}

主界面功能

有了以上的基礎(chǔ)之后,主界面的功能開發(fā)就很容易了。

主界面的功能主要是兩部分內(nèi)容,第一部分內(nèi)容是數(shù)據(jù)解析,將解析結(jié)果賦值給控件的屬性進(jìn)行顯示,第二部分內(nèi)容是通用的參數(shù)設(shè)置,將6個(gè)Monitor控件的參數(shù)設(shè)置事件都綁定同一個(gè)事件,然后在該事件里調(diào)用SetValue方法即可。

一般我們軟件開發(fā)完成后,都應(yīng)該先自我測試一下,便于及時(shí)發(fā)現(xiàn)問題,減少調(diào)試時(shí)間。

對(duì)于串口通信,可以我們通過虛擬串口來進(jìn)行測試,仿真數(shù)據(jù)發(fā)送與數(shù)據(jù)接收,測試結(jié)果如下:



這樣學(xué)上位機(jī),是不是有意思多了的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
江都市| 安图县| 丹阳市| 岢岚县| 榆林市| 东兴市| 海原县| 兴宁市| 子洲县| 新建县| 阳西县| 达孜县| 德安县| 襄樊市| 江门市| 徐闻县| 鲜城| 全州县| 平远县| 大关县| 天全县| 康乐县| 和田县| 梁河县| 沙雅县| 兴化市| 金昌市| 黎城县| 蛟河市| 夏邑县| 和平区| 通道| 柳林县| 云浮市| 五原县| 中牟县| 安达市| 广河县| 宁陕县| 高唐县| 鹤岗市|