



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)教學(xué)資源庫(kù)文檔文檔來源院校開發(fā)文檔編號(hào)KC07010101-a22基于C#的 串口數(shù)據(jù)完整性接收(微課腳本)無錫職業(yè)技術(shù)學(xué)院星期六, 一月 29, 2022基于C#的 串口數(shù)據(jù)完整性接收序號(hào)臺(tái)詞1同學(xué)們,大家好。今天我們開始學(xué)習(xí)“學(xué)習(xí)模塊一 基于WSN的環(huán)境監(jiān)控系統(tǒng)設(shè)備編程與實(shí)施”,本堂課的內(nèi)容是“基于C#的串口數(shù)據(jù)完整性接收”。2數(shù)據(jù)接收不完整是串口編程中的常見問題,例如這個(gè)應(yīng)用中使用SerialPort的Read和Write方法進(jìn)行數(shù)據(jù)收、發(fā),點(diǎn)擊應(yīng)用的打開按鈕,成功打開串口后,在發(fā)送文本框中輸入“aaaassss!#$”信息,點(diǎn)擊發(fā)送后,在接收文本框中僅僅接收到 “$”
2、字符,可以看到數(shù)據(jù)接收是完整的,為了解決這個(gè)問題,今天我們以任務(wù)的形式來介紹C#的串口數(shù)據(jù)完整性接收技巧。 3任務(wù)主要包括以下四個(gè)方面:原因分析、解決方法、任務(wù)說明、任務(wù)實(shí)現(xiàn)。4首先來分析一下C#下串口數(shù)據(jù)接收不完整的原因5C#下通過SerialPort類來實(shí)現(xiàn)串口數(shù)據(jù)接收有兩個(gè)特征:一是數(shù)據(jù)源自輸入緩存區(qū);二是DataReceived事件是間歇性的,需要用戶自定義處理函數(shù);以PC的串行自收自發(fā)為例,當(dāng)PC通過串行線路發(fā)出0x110x120x130x14時(shí),這些信息在進(jìn)入串口緩存區(qū)時(shí)有先有后,有可能在第一個(gè)字節(jié)0x11進(jìn)入輸入緩存區(qū)時(shí)剛好觸發(fā)DataReceived事件,這時(shí)會(huì)轉(zhuǎn)到用戶自定義的
3、接收處理函數(shù),假若這時(shí)通過Read直接去讀取輸入緩存區(qū)內(nèi)容,那么讀到的數(shù)據(jù)只有0x11。造成數(shù)據(jù)接收不完整的主要原因是: DataReceived事件是間歇性的,一個(gè)完整的信息順次進(jìn)入輸入緩存區(qū)時(shí)可能會(huì)多次觸發(fā)DataReceived事件對(duì)應(yīng)的自定義處理函數(shù),若只處理一次數(shù)據(jù)的接收,自然會(huì)造成數(shù)據(jù)的丟失。6接下來介紹解決方法。7解決辦法有兩種,先來看第一種:延遲讀取緩存區(qū),若對(duì)輸入緩存區(qū)的數(shù)據(jù)只進(jìn)行一次接收處理,且要保證讀取內(nèi)容是完整的,那么只需保證讀取時(shí)緩存區(qū)的內(nèi)容是完整的即可?,F(xiàn)在的問題就變成了延遲讀取的時(shí)間是多少才能保證緩存區(qū)的內(nèi)容是完整的,要說明這個(gè)問題,我們需要解決兩個(gè)疑問:一是如何
4、計(jì)算一定時(shí)間間隔內(nèi)串口接收信息的能力;二是輸入緩存區(qū)能否存儲(chǔ)這些發(fā)送過來的信息;其中第一問題跟串口的波特率相關(guān),若串口波特率為9600bps,延遲(間隔)0.1秒,串口接收到的信息字節(jié)數(shù)計(jì)算公式是9600*0.1/8 ,結(jié)果是 120個(gè)字節(jié);第二個(gè)問題跟SerialPort類的輸入緩存區(qū)大小有關(guān),也就是延遲0.1秒后,串口能接收到120個(gè)字節(jié),輸入緩存區(qū)是否能存儲(chǔ)下這些字節(jié)呢? SerialPort類通過ReadBufferSize屬性定義了默認(rèn)的輸入緩存區(qū)大小為4096個(gè)字節(jié),也就是默認(rèn)情況下輸入緩存區(qū)最大的存儲(chǔ)能力是4096個(gè)字節(jié),超出部分會(huì)被丟棄,這里可看出在串口波特率為9600bps的
5、情況下,延遲0.1秒是合理的,輸入緩存區(qū)有能力存儲(chǔ)傳輸過來的信息;在使用延遲讀取方式須注意時(shí)長(zhǎng)的合理性及是否超出輸入緩存區(qū)存儲(chǔ)能力。 8第二種辦法是設(shè)置全局變量來存儲(chǔ)DataReceived事件處理函數(shù)讀取到的數(shù)據(jù),一個(gè)完整信息可能會(huì)多次觸發(fā)DataReceived事件,使用全局變量可以不斷的來累加存儲(chǔ)每次發(fā)送過來的信息直至全局變量接收到一次完整的信息,在實(shí)際應(yīng)用中要確保接收數(shù)據(jù)的完整性需要用戶對(duì)全局變量的內(nèi)容進(jìn)行檢測(cè)并作相應(yīng)處理,在每次發(fā)送、接收完畢后須及時(shí)清空全局變量,否者會(huì)造成全局變量中的信息的堆積,影響信息顯示的正確性。9接下來明確下本次任務(wù),即任務(wù)說明10任務(wù)的硬件環(huán)境與“基于C#
6、的RS232接口初始化編程”環(huán)境一致,包含一臺(tái)PC、一條串行導(dǎo)線、一個(gè)跳線帽,功能是PC實(shí)現(xiàn)串行數(shù)據(jù)的自發(fā)自收,本次任務(wù)中要求能夠傳輸英文字符、數(shù)字及標(biāo)點(diǎn)符號(hào),且采用ASCII進(jìn)行信息發(fā)送和接收,能完整性接收顯示發(fā)送的信息。11最后使用Visual Studio來進(jìn)行任務(wù)實(shí)現(xiàn)12(視頻)打開前面課程中的串口讀寫項(xiàng)目,為方便較長(zhǎng)字符信息的顯示,對(duì)界面進(jìn)行修改,點(diǎn)擊收發(fā)文本框右上方的箭頭標(biāo)志勾選MultiLine屬性,允許文本框多行顯示,并適當(dāng)調(diào)整收發(fā)文本框和發(fā)送按鈕的位置,同時(shí)使用SerialPort的Read和Write替換ReadLine和WriteLine方法進(jìn)行數(shù)據(jù)收、發(fā),點(diǎn)擊運(yùn)行按鈕運(yùn)
7、行程序,打開串口,在發(fā)送文本框中輸入20個(gè)測(cè)試字符串a(chǎn)aaabbbbcccc$!,點(diǎn)擊發(fā)送按鈕,發(fā)現(xiàn)在接收文本中僅僅顯示接收到!,表明數(shù)據(jù)接收不完整;首先使用延遲讀取緩存區(qū)方法修改程序,在串口接收事件處理函數(shù)sp_DataReceived中添加System.Threading.Thread.Sleep(100);語句,其單位為毫秒,在串口波特率為9600bps的情況下,讓串口接收事件處理函數(shù)延遲0.1秒后再讀取輸入緩存區(qū)數(shù)據(jù),可以確保串口輸入緩存區(qū)的數(shù)據(jù)至少可緩存至120個(gè)字節(jié),可讀取字節(jié)數(shù)遠(yuǎn)遠(yuǎn)大于發(fā)送的20個(gè)字符,修改程序后,點(diǎn)擊運(yùn)行按鈕運(yùn)行程序,打開串口,在發(fā)送文本框中輸入相同的測(cè)試字符串
8、信息,點(diǎn)擊發(fā)送按鈕,可以看到接收文本能夠顯示完整信息,說明通過延遲接收,確保了串口輸入緩存區(qū)中的數(shù)據(jù)是完整;注釋System.Threading.Thread.Sleep(100)語句,之后使用第二種方式,全局變量形式來進(jìn)行數(shù)據(jù)的完整性接收,使用 List<byte> recvlist = new List<byte>();語句定義全局變量,之所以使用List<byte>類型,主要是兩個(gè)原因,一是串行通信本身傳輸就是二進(jìn)制,其次本應(yīng)用中串行數(shù)據(jù)發(fā)送采用了Write方法,傳輸?shù)木褪莃yte類型;之后在在串口接收事件處理函數(shù)sp_DataReceived中把通過Read方法讀取到數(shù)據(jù)都通過AddRange方法添加到全局變量recvlist中,最后采用ASCII解碼方式對(duì)接收到的二進(jìn)制數(shù)組進(jìn)行解碼并通過委托顯示到界面接收文本框,在使用全局變量時(shí),須接收完數(shù)據(jù)后及時(shí)對(duì)全局變量進(jìn)行清空,否則會(huì)影響數(shù)據(jù)的接收,在本應(yīng)用,串行數(shù)據(jù)傳輸是由點(diǎn)擊發(fā)送按鈕發(fā)起的,所以在發(fā)送按鈕點(diǎn)擊事件處理函數(shù)中,添加recvlist.Clear();代碼實(shí)現(xiàn)對(duì)全局變量的清空操作,之后點(diǎn)擊運(yùn)行按鈕運(yùn)行程序,打開串口,在發(fā)送文本框中輸入相同的測(cè)試字符串,點(diǎn)擊發(fā)送按鈕,可以看到接收文本能夠顯示完整信息,說明兩種方式都能實(shí)現(xiàn)串口數(shù)據(jù)的完整性接
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南省昆明市黃岡實(shí)驗(yàn)學(xué)校2025年高三(最后沖刺)化學(xué)試卷含解析
- 福建省長(zhǎng)汀、連城一中等六校聯(lián)考2025屆高三壓軸卷化學(xué)試卷含解析
- 中職課程中國(guó)旅游文化
- 光伏逆變器2025年度采購(gòu)訂單供應(yīng)商協(xié)同開發(fā)協(xié)議
- 2025年魚、蝦、貝、藻類基因工程體項(xiàng)目發(fā)展計(jì)劃
- 2025屆湖南省益陽(yáng)市高三一診考試化學(xué)試卷含解析
- 2025屆湖南省高三下學(xué)期高考普通高中名校聯(lián)考第一次模擬考試生物試題(含解析)
- 山東省桓臺(tái)一中2025年高考仿真卷化學(xué)試卷含解析
- 2025年貴金屬壓延加工材項(xiàng)目合作計(jì)劃書
- 小二臀紅的護(hù)理
- 游泳池防水施工方案
- 基于PLC控制的物料分揀系統(tǒng)設(shè)計(jì)最終
- 一文讀懂泡泡瑪特:詳解泡泡瑪特招股說明書2020課件
- 物流企業(yè)入職申請(qǐng)表范文
- 探放老空水措施
- 個(gè)人理財(cái)概論課件
- 國(guó)家開放大學(xué)電大《小學(xué)數(shù)學(xué)教學(xué)研究》網(wǎng)絡(luò)課形考任務(wù)1題庫(kù)及答案(試卷號(hào):1825)
- 部編人教版二年級(jí)道德與法治下冊(cè)全冊(cè)教案+知識(shí)點(diǎn)總結(jié)
- 淺析棒材表面裂紋特點(diǎn)及產(chǎn)生原因解讀
- 初中生如何與父母相處(課堂PPT)
- 艾滋病合并肺孢子菌肺炎臨床路徑
評(píng)論
0/150
提交評(píng)論