|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
一個(gè)PC與多MCU的RS485半雙工通訊試驗(yàn)(原創(chuàng)!!!!) |
| 作者:epwwm 欄目:通信技術(shù) |
近來在編一個(gè)PC作上位機(jī),PIC16F73作下位機(jī)的一主多從系統(tǒng),RS485總線半雙工,PC用VB6,MCU的ASM. MCU邊有按鍵,LCD顯示,A/D,I2C,等.除串口通訊用中斷外,其余子程序全用查詢(畢竟多機(jī)系通訊時(shí)間第一) 共有5到10條指令,接收來自PC的查詢指令,將A/D結(jié)果,狀態(tài),顯示數(shù)據(jù)送往PC顯示,PC邊用進(jìn)度條顯示A/D值, 要求盡量要實(shí)時(shí)(實(shí)際是不可能真正實(shí)時(shí)),要求最多有32臺(tái)從機(jī)(從機(jī)數(shù)量不定,視實(shí)際而定),也就是說PC要同時(shí) 實(shí)時(shí)顯示從機(jī)狀態(tài),不過可不是一秒更新一次,而要求更新越快越好,要達(dá)到MS級(jí). 于是,我做了以下實(shí)驗(yàn),MCU暫時(shí)用4M晶振,據(jù)計(jì)算4M晶振下最快的標(biāo)準(zhǔn)波特率是19.2K,就用這個(gè)波特,通訊格式用 1位起始,8位數(shù)據(jù)位,無校驗(yàn),1位地址數(shù)據(jù)識(shí)別,1位停止位,共11位,由此算得1秒內(nèi)最快可傳送19200/11=1745Byte數(shù)據(jù), 其中: PC發(fā)命令為6 BYTE格式: 地址+命令+數(shù)據(jù)位1+數(shù)據(jù)位2+數(shù)據(jù)位3+校驗(yàn)和 MCU回應(yīng)數(shù)據(jù)8 BYTE格式: 地址+數(shù)據(jù)位1+數(shù)據(jù)位2+數(shù)據(jù)位3+數(shù)據(jù)位4+數(shù)據(jù)位5+數(shù)據(jù)位6+校驗(yàn)和 一次PC與MCU握手到成功發(fā)送數(shù)據(jù)共雙向傳數(shù)據(jù)14 BYTE,因此一秒內(nèi)PC與MCU共可以聯(lián)系1745/14=124次,如果有10臺(tái)從機(jī) ,平均一臺(tái)從機(jī)一秒種內(nèi)可以發(fā)更新數(shù)據(jù)給PC機(jī)10次.可以勉強(qiáng)滿足要求.不過以上只是理論計(jì)算,當(dāng)然實(shí)際上是不可能實(shí)現(xiàn)的. 在實(shí)驗(yàn)中發(fā)現(xiàn)PC機(jī)可不能像MCU一樣可以以u(píng)s級(jí)計(jì)算運(yùn)行時(shí)間,實(shí)際一條指令可能運(yùn)行的時(shí)間也不 能確定,而且定時(shí)的精度只有MS級(jí),延時(shí)子程序也只有MS級(jí),實(shí)際上還達(dá)不到這個(gè)精度,比MS級(jí)要大. 如用執(zhí)行MSCOMM1.OUTPUT="1234"指令發(fā)數(shù)據(jù)后,VB就將其交給操作系統(tǒng)了,實(shí)際上什么時(shí)候完全發(fā)送出了,可不知道,雖然有OnComm事件 但從發(fā)送真正完成到產(chǎn)生OnComm事件估計(jì)也有一定有時(shí)間,接收數(shù)據(jù)也一樣從收到數(shù)據(jù)到產(chǎn)生OnComm事件也有一定有時(shí)間但這個(gè)時(shí)間是多少 就不知道了. 我在試驗(yàn)中實(shí)際上我測(cè)算,從PC發(fā)出命令,到PC收到MCU回應(yīng)數(shù)據(jù),再發(fā)下一次命令之間的延時(shí)特別嚴(yán)重 理論上: 19200BpS 1000MS/(19200/11)=0.57MS 可以收發(fā)1BYTE數(shù)據(jù),收發(fā)14BYTE要14*0.57=8MS,也就是說只要PC發(fā)出命令延時(shí)8MS,PC就 可以收到MCU的數(shù)據(jù),加上MCU本身回應(yīng)最大延時(shí)約2MS(是MCU的程序本身造成)也只要10MS, 但實(shí)際上VB的程序每秒鐘只能約和MCU聯(lián)系17次左右 平均58MS才能收發(fā)一次,與理論上的10MS相差很遠(yuǎn).到底是什么原因?還是RS485總線換向需要時(shí)間?我估計(jì)大多是PC機(jī)的指令延時(shí)引起的,但不論 我怎樣精簡(jiǎn)VB指令,怎樣也無法縮短延時(shí),難道這是VB的根本,不知用C或deplhi會(huì)不會(huì)這樣? 繼續(xù)實(shí)驗(yàn)中,大家一起交流交流! 待續(xù)............ |
| 2樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/17 15:40:00 發(fā)布:
繼續(xù)........... 在VB6中弄了兩個(gè)計(jì)時(shí)器,一個(gè)interval設(shè)為1MS,事件設(shè)為y=y+1 一個(gè)interval設(shè)為1000MS,事件為顯示y的數(shù)值, 兩個(gè)計(jì)時(shí)器同時(shí)啟動(dòng),每隔一秒鐘就顯示y數(shù)值,理論上應(yīng)該每秒y的值加上一 1000,但實(shí)際上只是每秒加上100,足足差了十倍. |
|
| 3樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/17 16:29:00 發(fā)布:
發(fā)現(xiàn)主要原因。。 原來是 MSComm1.Settings = "19200,M,8,1"和MSComm1.Settings = "19200,S,8,1"這兩句設(shè)定通訊格式的語句延時(shí)太大了. 由于是一主多從,因此每發(fā)一次命令都要加地址號(hào),因此要頻繁地更改通訊格式,但一加上上述語句,延時(shí)就大了最小三倍,大大拖慢了通訊速度. 各位是用何辦法解決上述問題的?????? |
|
| 4樓: | >>參與討論 |
| 作者: chunyang 于 2005/12/17 17:48:00 發(fā)布:
道理上講,PC平臺(tái)頻繁的串行通訊是可以的 但VB的控制確實(shí)不好,一般多用C、Dephi等,關(guān)鍵是多任務(wù)的調(diào)度機(jī)制問題。 能詳細(xì)的記錄自己的心得是好習(xí)慣,加酷以示鼓勵(lì)并吸引更多的眼球。 |
|
| 5樓: | >>參與討論 |
| 作者: dengm 于 2005/12/17 19:38:00 發(fā)布:
PC發(fā)送數(shù)據(jù)量不大,可用 7 bits MSComm1.Settings = "19200,E,8,1 發(fā)送: BIT 0 TO BIT 6 為數(shù)據(jù), bit7 為0 or 1 |
|
| 6樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/18 13:26:00 發(fā)布:
辦法是好! 可惜,我要發(fā)送和接收的是二進(jìn)制數(shù)0~255,都有可能! |
|
| 7樓: | >>參與討論 |
| 作者: ocon 于 2005/12/19 13:06:00 發(fā)布:
以前做過,用VB4,調(diào)用聞都死的底層API可以高精度定時(shí)高速通訊 * - 本貼最后修改時(shí)間:2005-12-19 13:10:06 修改者:ocon |
|
| 8樓: | >>參與討論 |
| 作者: chunyang 于 2005/12/19 17:47:00 發(fā)布:
不錯(cuò),VB是可以實(shí)現(xiàn) 但確實(shí)要注意方法。以前見過有人用VB寫過串口調(diào)試軟件,性能還是不錯(cuò)的。 |
|
| 9樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/19 21:09:00 發(fā)布:
決定用PComm通訊庫!!! 然后設(shè)定"19200,8,E,1",定義BIT 0 TO BIT 6 為數(shù)據(jù), bit7 為奇偶調(diào)整位, 對(duì)于128以上的數(shù),只好用兩字節(jié)傳了. 經(jīng)過試驗(yàn),通訊可以達(dá)到約1300BYTE/秒,快了很多,但和理論的1745BYET/秒還有一定的差距,努力中!!!!! |
|
| 10樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/20 21:21:00 發(fā)布:
又有新問題了!測(cè)試程序運(yùn)行了一定時(shí)間,機(jī)器就致命錯(cuò)誤了!! 而且是嚴(yán)重錯(cuò)誤,藍(lán)屏,機(jī)器馬上自動(dòng)重啟了. |
|
| 11樓: | >>參與討論 |
| 作者: computer00 于 2005/12/20 23:25:00 發(fā)布:
速度慢應(yīng)該是操作系統(tǒng)調(diào)度的原因吧。 我試過用VB寫并口輸出方波,發(fā)現(xiàn)波形是一段一段的(就是有一段時(shí)間無波形), 估計(jì)是windows的任務(wù)調(diào)度,在這段時(shí)間內(nèi)運(yùn)行其它任務(wù)去了。 |
|
| 12樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/21 15:47:00 發(fā)布:
當(dāng)然與系統(tǒng)有關(guān),不過我的可是在系統(tǒng)足夠快的情況下出現(xiàn)的! 應(yīng)該不是操作系的問題,如果不設(shè)定MSComm1.Settings = "19200,M,8,1"和MSComm1.Settings = "19200,S,8,1"就可以很快了. |
|
| 13樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/22 19:13:00 發(fā)布:
最后將波特率提高到230.4K了,通訊訊速度只比19.2K提高了一倍. 達(dá)到2000BYTE/秒左右,但波特率已提高了12倍!!!,嚴(yán)重不成比例!!! 又測(cè)試到如果脫離VB開發(fā)環(huán)境,生成EXE后直接運(yùn)行,可以提高到3000BYTE/秒左右.隨同時(shí)運(yùn)行的其他軟件的多少有不同的變化. |
|
| 14樓: | >>參與討論 |
| 作者: 后學(xué) 于 2005/12/23 14:36:00 發(fā)布:
PC連ms都達(dá)不到,10ms一個(gè)時(shí)間片就不錯(cuò)了 |
|
| 15樓: | >>參與討論 |
| 作者: robertchai 于 2005/12/23 15:35:00 發(fā)布:
vc寫動(dòng)態(tài)庫,用vb調(diào)用 vc |
|
| 16樓: | >>參與討論 |
| 作者: hqgboy 于 2005/12/23 18:46:00 發(fā)布:
tC.... |
|
| 17樓: | >>參與討論 |
| 作者: zhang_2000 于 2005/12/24 15:00:00 發(fā)布:
發(fā)送不可顯示的單字 發(fā)送不可顯示的單字 如發(fā)送ASCII碼值為3的數(shù) MSCOM.OUTPUT= chr(3) |
|
| 18樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/28 23:27:00 發(fā)布:
現(xiàn)在想用USB轉(zhuǎn)串IC:FT232BM,但不用虛擬串口驅(qū)動(dòng). 用FTDI Direct Driver,不再經(jīng)串口,直接用FTDI的DLL控制收發(fā),速度應(yīng)該會(huì)快些.(因?yàn)椴唤?jīng)COM了,由DLL--API---系統(tǒng)硬件了),待現(xiàn)在的程序大體完成了就試試!!! 不知道各位有這樣用過嗎? |
|
| 19樓: | >>參與討論 |
| 作者: etiller 于 2005/12/29 8:21:00 發(fā)布:
從8位數(shù)據(jù)改成7位數(shù)據(jù)沒什么用處 多一位數(shù)據(jù)在總體效率上根本沒影響,你的查詢速度慢我覺得還是跟vb有關(guān)系的,以前用過vb做這種東西,效率卻是令人堪憂,現(xiàn)在我用vc+api做串行通信,速度比以前快得多,效果非常理想,我pc機(jī)下面能帶100個(gè)設(shè)備左右 |
|
| 20樓: | >>參與討論 |
| 作者: epwwm 于 2005/12/30 19:33:00 發(fā)布:
用7位數(shù)據(jù)并不是因?yàn)樾蕟栴}. 我是用第7位為作調(diào)整奇偶校驗(yàn)第9位,為1或0,由此產(chǎn)生地址幀或數(shù)據(jù)幀. 不知你所帶的100臺(tái)設(shè)備所什么設(shè)備,每臺(tái)設(shè)備可以每秒響應(yīng)多少次? 我還準(zhǔn)備用VB+API測(cè)試一下看能快多少. |
|
| 21樓: | >>參與討論 |
| 作者: 像見 于 2005/12/31 11:50:00 發(fā)布:
有沒有測(cè)試,它最遠(yuǎn)能多少米可以正常通訊呢 |
|
| 22樓: | >>參與討論 |
| 作者: ye77 于 2006/1/3 15:55:00 發(fā)布:
我做過類似的產(chǎn)品 通迅距離1000米沒問題,不過這與RS485芯片有關(guān)系嘍. |
|
| 23樓: | >>參與討論 |
| 作者: epwwm 于 2006/1/3 23:36:00 發(fā)布:
距離沒有測(cè)試過,反正是越遠(yuǎn)速率肯定要減小的了. |
|
| 24樓: | >>參與討論 |
| 作者: mtexpo 于 2006/1/25 14:23:00 發(fā)布:
要使用DAISY-CHAIN 方式 or tcp/ip 這種應(yīng)用 不能 用半雙工 要使用DAISY-CHAIN 方式 把所有子機(jī) 串接,子機(jī) 沒有數(shù)據(jù)時(shí) 讓 后面子機(jī) by-pass 直接發(fā)送數(shù)據(jù),只是監(jiān)聽數(shù)據(jù)封包。 若是自己有 數(shù)據(jù) 要發(fā)送時(shí),堅(jiān)聽后面資料 當(dāng)封包結(jié)束時(shí),切換成自己發(fā)送數(shù)據(jù),但是把后面子機(jī)傳送過來資料存在自己緩沖區(qū)中 接在自己資料后面?zhèn)魉停?br>當(dāng)然 若是依 數(shù)據(jù)量規(guī)劃是不會(huì)擠爆緩沖區(qū)。 若是要求實(shí)時(shí)性更高 ,就不宜 走 rs232/rs485,換tcp/ip 則pc 同時(shí)開多少PORT 都沒有問題 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |