freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于組態(tài)的pc機(jī)串口通信程序設(shè)計(jì)(編輯修改稿)

2024-12-13 21:18 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 據(jù)時(shí)有時(shí)候只收到一半就沒(méi)有了,特別是在連續(xù)接收數(shù)據(jù)時(shí),但又不是每次都只能收到一半,有時(shí)候也能接收齊全的,就是因?yàn)榘l(fā)送的 數(shù)據(jù)中可能包含了終止符而使串口認(rèn)為到了最后一個(gè)字符了。一般是將這個(gè)終止符禁用掉,即將 “ 啟用終止符 ? (Enable terminator?)” 這一端 輸入為 False即可。另外還有一個(gè)比較重要的設(shè)置,就是 VISA READ 的 “ 讀取字節(jié)數(shù) ” 這個(gè)輸入,由于在串口通信中,如果指定讀取 100個(gè)串口緩沖區(qū)的字節(jié)數(shù),如果當(dāng)前緩沖區(qū)的數(shù)據(jù)量不足 100個(gè)時(shí),程序會(huì)一直停在 VISA READ 這個(gè)節(jié)點(diǎn)上,如果在超時(shí)的時(shí)間(默認(rèn)是10秒)內(nèi)還沒(méi)有湊足 100個(gè)數(shù)據(jù)的話,程序就會(huì)報(bào) “Time out” 的錯(cuò)誤,如果超時(shí)時(shí)間設(shè)置得太長(zhǎng),有可 能導(dǎo)致程序很長(zhǎng)時(shí)間停止在 VISA READ 這個(gè)節(jié)點(diǎn)上。解決的辦法是使用“Bytes at Port” 這個(gè)串口的屬性節(jié)點(diǎn),在 VISASerialadvance 下,也可以在 VISA資源線上右鍵 創(chuàng)建 屬性節(jié)點(diǎn) 串口設(shè)置 Bytes at Port,如下圖: 圖 3 Bytes at Port 這個(gè)屬性節(jié)點(diǎn)讀取當(dāng)前串口緩沖區(qū)有字節(jié)數(shù),然后將它的輸出連接到 VISA READ 的 “ 讀取字節(jié)數(shù) ” 這個(gè)輸入端上即可,這樣當(dāng)前緩沖區(qū)中有多少個(gè)字節(jié)就讀回多少個(gè),不會(huì)有任何等待。 基于組態(tài)的 PC 機(jī)串口通信程序設(shè)計(jì) 11 圖 4 使用 Bytes at Port LabVIEW 中使用串口 目前串口的應(yīng)用一般有二種類型的(以我接觸到的來(lái)分類,不嚴(yán)格),一種是儀器控制類型的,一般是上位機(jī)發(fā)送一個(gè)指令,然后下位機(jī)作出響應(yīng),返回?cái)?shù)據(jù)給上位機(jī),上位機(jī)再讀取出來(lái),完成一次通信,即一問(wèn)一答;另一類是被動(dòng)接收形的,即下位機(jī)會(huì)一直發(fā)送數(shù)據(jù)上來(lái)。這二種類型的串口通信在處理上會(huì)不太一樣。 儀器控制類型 由于在儀器控制時(shí)一般都是這種一問(wèn)一答的方式,所以叫它儀器控制類型。以儀器控制為例來(lái)說(shuō)一下需要注意的事項(xiàng)。 首先是要確認(rèn)儀器選擇的通信模式是串口通信 模式?,F(xiàn)在的儀器一般都至少有二種通信模式,一種是 RS232,一種是 GPIB,如果儀器是設(shè)置為 GPIB通信的話, RS232是不可能通信上的,所以要先確認(rèn)一下,方法一般是在儀器面板上選擇設(shè)置 遠(yuǎn)程控制的某些參數(shù)是固定的,比如校驗(yàn)方法固定為奇校驗(yàn),不能修改,只能在電腦上跟儀器設(shè)置為一樣的。波特率一般是可以修改的。這些參數(shù)的配置一定要根據(jù)儀器手冊(cè)上的來(lái)設(shè)置。如果參數(shù)設(shè)置不正確,也能收到一些數(shù)據(jù),但一般是亂碼,如果收到的數(shù)據(jù)都是亂碼的話,就要先檢查一下串口參數(shù)設(shè)置是否正確了。只有電腦和儀器邊的串口參數(shù)完全一致時(shí)才能 收到正確的數(shù)據(jù)。 接著是要注意發(fā)送指令和讀回?cái)?shù)據(jù)之間要有一定的延時(shí),即 VISA WRITE 和 VISA READ之間要有一定的延時(shí),一般 200毫秒即可,因?yàn)榇谑堑讓佑布瑪?shù)據(jù)從軟件到串口上要一點(diǎn)點(diǎn)時(shí)間,然后儀器對(duì)指令作出響應(yīng)也要一點(diǎn)點(diǎn)時(shí)間,這些時(shí)間加起來(lái)肯定比軟件運(yùn)行二個(gè)節(jié)點(diǎn)的時(shí)間要短,所以延時(shí)是一定要加的。在調(diào)試時(shí)如果發(fā)現(xiàn)正常運(yùn)行時(shí)不能收到數(shù)據(jù),但高亮運(yùn)行就能收到數(shù)據(jù),就很有可能是沒(méi)有加延時(shí)的原因 ! 或者是發(fā)一個(gè)查詢指令,但返回的是上一條查詢指令的結(jié)果,也可能是因?yàn)闆](méi)有延時(shí)或延時(shí)不夠。 被動(dòng)接受 類型 被動(dòng)接收形的串口通信稍微麻煩一點(diǎn),由于上位機(jī)是被動(dòng)接收的,上位機(jī)不知道什么時(shí)候開始下位機(jī)就已經(jīng)有數(shù)據(jù)上來(lái)了,很有可能下位機(jī)發(fā)送到一半時(shí),上位機(jī)剛好開始接收數(shù)據(jù),這時(shí)只能接收到后面一半的數(shù)據(jù)了,所以對(duì)于這種通信,一般是采用數(shù)據(jù)幀的方式進(jìn)行基于組態(tài)的 PC 機(jī)串口通信程序設(shè)計(jì) 12 通信。 這種數(shù)據(jù)幀的通信方式至少由三部分?jǐn)?shù)據(jù)組成:幀頭、數(shù)據(jù)、幀尾(如果數(shù)據(jù)是固定長(zhǎng)度的話,似乎幀尾也可以省掉)。 幀頭是為了告訴上位機(jī):從這以后的數(shù)據(jù)就是有用的數(shù)據(jù)了,相當(dāng)于約定好的暗號(hào),一般幀頭至少會(huì)用二個(gè)以上字節(jié),如果只用一個(gè)字節(jié)的話,萬(wàn)一數(shù)據(jù)中的數(shù)據(jù)跟這個(gè)幀頭一樣了就會(huì)誤以為這個(gè)數(shù)據(jù)是幀頭從而導(dǎo)致解析數(shù)據(jù)出錯(cuò),幀尾的作用也差不多,告訴上位機(jī)從這之前的數(shù)據(jù)才是有用的數(shù)據(jù)。但實(shí)際上一般的數(shù)據(jù)幀遠(yuǎn)不止這幾個(gè)部分,還會(huì)加上一些校驗(yàn)字節(jié)、時(shí)間信息、幀計(jì)數(shù)器之類的東東在上面。 其中校驗(yàn)字節(jié)是為了檢查數(shù)據(jù)在傳輸過(guò)程中有沒(méi)有出錯(cuò)的,跟串口的校驗(yàn)位要區(qū)分清楚,校驗(yàn)位也是檢查數(shù)據(jù)傳輸時(shí)有沒(méi)有出錯(cuò)的,但由底層硬件來(lái)實(shí)現(xiàn),校驗(yàn)方法由標(biāo)準(zhǔn)規(guī)定好,但有幾種可以選擇,只有一個(gè)位( Bit,只能是 0或 1) 。 校驗(yàn)字節(jié)是由軟件層來(lái)實(shí)現(xiàn)的,至少有一個(gè)字節(jié)( Byte,有 8個(gè)位),而且校驗(yàn)方式由用戶定義, 非常靈活。 由于被動(dòng)方式中串口的緩沖區(qū)中一直會(huì)有數(shù)據(jù)在,為了保持?jǐn)?shù)據(jù)的連續(xù)性,在讀取數(shù)據(jù)時(shí)跟第一種儀器控制類型不一樣。而是采取將讀取的所有的串口數(shù)據(jù)都保存在移位寄存器中,在軟件上處理完這些數(shù)據(jù)后再將它們從移位寄存器中刪除。 由于 VISA READ 的輸出是字符串,所以一般使用 “ 連接字符串 ” 這個(gè)函數(shù)將它們連接起來(lái),然后接到循環(huán)結(jié)構(gòu)中的移位寄存器中進(jìn)行保存,當(dāng)移位寄存器中的數(shù)據(jù)量達(dá)到一定時(shí)或滿足數(shù)據(jù)處理的條件時(shí),才停止這個(gè)循環(huán)輸出讀取到的數(shù)據(jù)。一般如下圖所示: 圖 5 被動(dòng)接收類型中的數(shù)據(jù)接收 在接收 下位機(jī)發(fā)送的幀數(shù)據(jù)時(shí),一定要先了解幀格式,這樣才能正確解析出幀里面的數(shù)據(jù)來(lái)。下面以例子來(lái)說(shuō)明數(shù)據(jù)幀格式的通信。設(shè)定通信數(shù)據(jù)幀每 7個(gè)字節(jié)為一幀數(shù)據(jù),其中以 0xAC、 0x96二個(gè)字節(jié)作為數(shù)據(jù)幀頭,第三、四個(gè)幀頭為幀計(jì)數(shù)器,最大值為 0xFFFF,到達(dá)最大值后重新從 0開始計(jì)數(shù),第 6三個(gè)字節(jié)是數(shù)據(jù)信息,分別代表數(shù)據(jù)的高中低位,第 7位為狀態(tài)標(biāo)志字節(jié),它的第一位為 1時(shí)表示下位機(jī)出錯(cuò),為 0時(shí)表示功能正常。 由于 LabVIEW 中接收到的數(shù)據(jù)都是以字符串的形式顯示出來(lái)的,所以需要將字符串轉(zhuǎn)換為基于組態(tài)的 PC 機(jī)串口通信程序設(shè)計(jì) 13 ASCII碼,一般可以直接 使用 “ 轉(zhuǎn)換為 U8數(shù)組 ” 這個(gè)函數(shù),如下圖所示: 圖 5 字符串轉(zhuǎn)換為 U8 字節(jié) 轉(zhuǎn)換為 U8 字節(jié)后,得到的是所傳輸字符的 ASCII 碼,我們就很容易進(jìn)行數(shù)據(jù)幀的判斷了,現(xiàn)收到以下的字符串?dāng)?shù)據(jù): , 圖 6 實(shí)際接收到的字符串 上圖中下半部分顯示的數(shù)組是使用 “ 字符串轉(zhuǎn)換為 U8數(shù)組 ” 的函數(shù)轉(zhuǎn)換之后得到的數(shù)組,一個(gè)是十六進(jìn)制顯示,另一個(gè)為十進(jìn)制顯示。對(duì)照定義的數(shù)據(jù)幀格式,就很容易得到我們需要的數(shù)據(jù)了。 首先是要看從哪里開始才是完整的第一幀,從上面十六進(jìn)制顯示的數(shù)組中我們可以看到,并不是第一個(gè)字節(jié)就是我們需要的幀頭 ,因?yàn)橄挛粰C(jī)是一直處于發(fā)送數(shù)據(jù)的狀態(tài),很可能在串口發(fā)送一幀數(shù)據(jù)的過(guò)程中串口就被初始化或者被清空了一次緩沖區(qū),那么這一幀數(shù)據(jù)的前面部分?jǐn)?shù)據(jù)可能就會(huì)丟失,只留下后面一部分?jǐn)?shù)據(jù) 。 以上圖為例子,第一二個(gè)字節(jié)為 0x3 0x22,顯示不是我們要的幀頭,我們要的幀頭基于組態(tài)的 PC 機(jī)串口通信程序設(shè)計(jì) 14 是在第 7 個(gè)字節(jié),以程序來(lái)實(shí)現(xiàn)的話就是先查找第一個(gè)幀頭,使用 “ 搜索字符串 ” ,如果找到則判斷它下一個(gè)字節(jié)是否是第二個(gè)幀頭,如果是,表明已經(jīng)找到幀頭,輸出幀頭的位置;如果它下一個(gè)字節(jié)不是第二個(gè)幀頭,說(shuō)明這里不是真正的幀頭,繼續(xù)查找下一個(gè)幀頭,直到找到幀頭或搜 索完整個(gè)字符串都找不到幀頭。 這是一個(gè)程序的算法問(wèn)題,具體實(shí)現(xiàn)的程序如下圖所示: 圖 7 幀頭查找程序 幀頭查找到以后,再找數(shù)據(jù)就容易了,根據(jù)之前的定義,第 6個(gè)字節(jié)是才是我們要的數(shù)據(jù),所以直接使用索引號(hào)進(jìn)行索引輸出即可。 圖 8 獲取實(shí)際數(shù)據(jù) 一般情況下,如果是用三個(gè)字節(jié)表示一個(gè)數(shù)據(jù)的話,那么這三個(gè)字節(jié)分別表示為一個(gè)數(shù)據(jù)的高中低字節(jié),即高字節(jié)要乘以 25536再加上中字節(jié)乘以 256再加上低字節(jié)的,這樣定義后可表示的數(shù)據(jù)的范圍就會(huì)擴(kuò)大很多,但這里為了說(shuō)明問(wèn)題,直接認(rèn)為三個(gè)字節(jié)的數(shù)據(jù)相加就是我們要 的實(shí)際數(shù)據(jù),在實(shí)際使用過(guò)程中應(yīng)該根據(jù)幀格式的字義來(lái)解析這個(gè)數(shù)據(jù)。 基于組態(tài)的 PC 機(jī)串口通信程序設(shè)計(jì) 15 另外幀格式中定義了最后一個(gè)字節(jié)為狀態(tài)標(biāo)志位,所以提取數(shù)據(jù)前還要檢查一下這個(gè)標(biāo)志位是否正常,不正常時(shí)要進(jìn)行相應(yīng)的處理,這里不再詳細(xì)描述。至此完成一次數(shù)據(jù)幀的提取。如果是沒(méi)什么特殊的要求的話,這里應(yīng)該也算到一段落了,有一些對(duì)測(cè)試時(shí)間有要求的地方,就會(huì)要求在最短的時(shí)間內(nèi)得到最多的信息 。 圖 6中我們可以看到,接收到的數(shù)據(jù)幀中,除了中間一個(gè)完整的幀之外,頭尾還有一些無(wú)用的數(shù)據(jù),其實(shí)這些數(shù)據(jù)中也包含了有用的信息的 ! 比如我們可以從 0xAC、 0x96這二個(gè) 幀的位置中推斷中它前面的 0x2 0x2A、 0x38這三個(gè)字節(jié)也是我們想要的數(shù)據(jù)字節(jié),但是由于沒(méi)有接收到它的幀頭,所以程序沒(méi)能提取出來(lái),但我們可以從后一幀的幀頭推算出前面那一幀的數(shù)據(jù)字節(jié)是哪些,即使沒(méi)收到前面那一幀的幀這里只給出一個(gè)流程,不再給出具體的程序。 另外有可能接收的數(shù)據(jù)長(zhǎng)度比較長(zhǎng),可能就不止包含了一幀的數(shù)據(jù)在里面,所以在程序中也要判斷一下剩下的數(shù)據(jù)還夠不夠一幀的數(shù)據(jù)長(zhǎng)度,如果夠則可以根據(jù)上一次查找的幀頭位置+數(shù)據(jù)幀長(zhǎng)度來(lái)確定下一個(gè)數(shù)據(jù)幀的幀頭位置了,不需要使用搜索的方法。也可能存在處理完一幀數(shù)據(jù)后 ,剩下的數(shù)據(jù)不夠一個(gè)幀的,這時(shí)可以將這些剩下的數(shù)據(jù)保留起來(lái),將它添加到下一次接收到的數(shù)據(jù)前面,組成新的數(shù)據(jù)再進(jìn)行處理。去掉已經(jīng)處理的數(shù)據(jù)可以使用 “ 刪除數(shù)組元素 ” 這個(gè)函數(shù)來(lái)實(shí)現(xiàn)。這里也不再給出具體的程序。 串口數(shù)據(jù)類型的轉(zhuǎn)換 由于 LabVIEW中 VISA Read/Write 這二個(gè)函數(shù)都是只能讀取 /寫入字符串類型的數(shù)據(jù)的,而有時(shí)候需要接收 /寫入的數(shù)據(jù)類型不一定是字符串,導(dǎo)致在剛開始接觸的時(shí)候會(huì)有一點(diǎn)困惑。 在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),只要記住計(jì)算機(jī)中所有數(shù)據(jù)都是以二進(jìn)制保存這個(gè)原則就容易解決問(wèn)題了。串口線上傳輸 的也是高低,串口接收到的也是二進(jìn)制數(shù)據(jù),只是到 LabVIEW 后被轉(zhuǎn)換為字符串格式了。還是以例子進(jìn)行解釋。 LabVIEW 從串口接受數(shù)據(jù) ① 假設(shè) LabVIEW 從串口接收到的數(shù)據(jù)為 “1234” (正常顯示模式下),那么這個(gè)數(shù)據(jù)在串口底層的時(shí)候其實(shí)是這樣的二進(jìn)制數(shù)據(jù):
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1