使用《模塊調(diào)試(串口測試).EXE》運行CH340非常好。因為只需要接收信息,在固定選擇的最高波特率(921600)下運行得很不錯,相信應該可以作到最高的2M速度。期望提供改進的版本,更期望提供實用的子模塊可以鑲嵌到自己的程序中使用……
******************************************************************************* 關于支持非標準波特率或者更高通訊波特率
對于一些非標準波特率或者常規(guī)方法無法設置的高速波持率,CH341驅(qū)動程序提供特殊方法, 應用程序可以按串口寫數(shù)據(jù)的方式間接設置CH341的串口通訊波特率,方法是: 設置CH341串口波特率為300,然后以ASCII碼字符串的命令包寫串口, 命令包的首字節(jié)必須是#,井字符,對應的十六進制數(shù)為23H, 命令包的中間為不超過7個數(shù)字表示的波特率,例如字符串9600或者921600等, 命令包的尾字節(jié)必須是_,下劃線,對應的十六進制數(shù)為5FH, 也就是說,將要設置的波特率以字符串的形式置于#字符和_字符之間,作為一個命令包, 在300bps下發(fā)送到CH341的串口,那么將被CH341驅(qū)動程序解釋為修改CH341的波特率, 而不會被作為數(shù)據(jù)從串口真正發(fā)出,當該操作成功返回后, CH341實際工作于指定的新波特率,當然,計算機系統(tǒng)及串口控件仍然以為是工作于300bps, 如果需要再次以這種方法改變波特率,那么首先要用常規(guī)方法將CH341的波特率置為300bps。
例如,用串口監(jiān)控/調(diào)試工具軟件演示: 1、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為6個ASCII碼數(shù)據(jù): #9600_ 發(fā)送成功后,CH341將實際工作于9600bps 2、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為8個ASCII碼數(shù)據(jù): #460800_ 發(fā)送成功后,CH341將實際工作于460800bps 3、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為9個ASCII碼數(shù)據(jù): #1000000_ 發(fā)送成功后,CH341將實際工作于1000000bps
CH341串口支持50bps到2Mbps的波特率,當應用程序請求CH341改變串口通訊波特率時, CH341驅(qū)動程序?qū)⒉ㄌ芈蕮Q算為波特率除數(shù),然后修改CH341芯片內(nèi)部的波特率除數(shù)寄存器, 所以設置CH341串口的通訊波特率實際上是設置CH341芯片內(nèi)部的波特率除數(shù)寄存器, 由于CH341內(nèi)部的串口基準位時鐘為48/8=6MHz(或12MHz),并且波特率除數(shù)只支持整數(shù), 所以在指定波特率時,應該考慮實際換算誤差,在波特率大于19200bps時的計算方法是: X = 6000000 除以波特率后的值 Y = X 四舍五入后的值 誤差 = ( Y - X ) / X
以下為CH341支持的常用波特率,未注明的基準位時鐘為6MHz,未注明的誤差小于0.16% 921600 (12MHz), 460800, 307200 (12MHz), 230400, 153600, 128000 (0.27%), 115200, 76800, 57600, 56000, 38400, 33600, 28800, 19200, 14400, 9600, 7200, 4800, 3600, 2400, 1800, 1200, 900, 600, 300, 150, 134.5, 110, 100, 75, 50, 2000000, 1500000, 1200000, 1000000, 750000, 500000, 375000, 250000, 200000, 187500, 100000, 93750, 75000, 50000, 25000, 10000 其它波特率只要誤差小于2.5%,CH341都可以支持,計算誤差時要考慮兩端的誤差之和。 但是為了可靠進行通訊,建議不要使用誤差大于1%的波特率。
首先,非常感謝耐心地解答!
對這段解答的主體有似曾相識的感覺,忘記是在哪位朋友同類提問的回復中看到過的,不過感覺這次的回復更具體,能夠基本解決實際的問題了。不過對其中“如果需要再次以這種方法改變波特率,那么首先要用常規(guī)方法將CH341的波特率置為300bps?!庇悬c疑問,是否可以把其中“常規(guī)方法”理解為以上次已經(jīng)修改到的新波特率(例如9600)來發(fā)送“#300_”?
在公司提供的調(diào)試工具軟件中,這樣的做法好象無須過問細節(jié),只要選擇了去做就是,但如果是在自己組織的軟件中,如何理解這“字符串命令包”還有些疑問。因為在自己組織的軟件中,需要傳遞的信息已經(jīng)直接就是或者轉(zhuǎn)化為16進制字符了,當然不會是在300這樣小的速率下進行的,但是否一定要注意避免產(chǎn)生類似“#300_”或者其他可能組合的巧合發(fā)生?
其實,我目前開發(fā)的產(chǎn)品實際應用中的需求比這問題要簡單得多:對CH340而言硬件結構就是一固定通訊頻率的單片機串口,需要解決的問題是在配套的應用軟件中直接搜索到串口的位置,并按要求設置配合的波特率,期望的是得到一個完整的API過程供軟件進入之前直接后臺調(diào)用。
雖然要求很簡單,卻恰好包含了三種不同的波特率提供不同產(chǎn)品的需求,其中一種是為得到最高速率數(shù)據(jù)采集而需要的2M、再就是兼顧速度和穩(wěn)定性需求的1.5M,最后是為節(jié)約成本及安裝位置與USB接口公用12M晶振而需要的750000,最后這個速度雖然為非常規(guī),事實上卻恰好符合零誤差的標準。另外,為最后這種需要,還想知道在實際運用中是從CH340的X0輸出頻率給單片機,還是晶振接單片機產(chǎn)生震蕩后輸入接口的XI更為合理?
1-如果要支持非標準波特率必須在300bps下發(fā)送指定的字符串配置到指定的bps 2-在其他bps下發(fā)送指定的字符串是不會影響了 3-你的應用ch340完全可以實現(xiàn)
不好意思,因為是直接用公司的《模塊調(diào)試(串口測試).EXE》來進行的,所以在300bps下發(fā)送指定的字符串之后,其實根本就只能工作在工具所選定的那些波特率下進行,而非自己選擇的數(shù)值……
是可以工作在非標準的波特率下的,我們做過測試!
呵呵,不好意思,是我沒弄懂您的意思。利用這個演示工具,剛剛重新實驗的結果是:在發(fā)出#921600_之后在不改變300的波特率下繼續(xù)操作,就可以按新的波特率來接收數(shù)據(jù)了,我原來的實驗是在發(fā)出修改命令之后立即改變?yōu)?21600就可以基本正常,而因為變?yōu)?500000之后,超出工具限定的范圍而失敗。
現(xiàn)在簡單實驗的效果是肯定了的,就不知道實際運行中這樣會不會影響到真實的速度……
呵呵,真的很不錯呀!
我剛剛重新?lián)Q過晶振做1.5M速率的實驗,效果非常令人滿意。今天的臨時用途真的是很應急了,不過從長遠利益的最終產(chǎn)品,還是希望盡快滿足我另外一帖子〈[求助]CH340串口命令的API指令〉的需求。
其實,我自己的問題已經(jīng)基本解決了,但既然上來了還是想羅嗦幾句:
直接使用公司提供的“模塊調(diào)試”工具來做實驗,固然因為條件的限制只好使用這種折中的辦法來解決;但實用中卻完全不必多此一舉!我在編程的實踐中先是按此方法來實現(xiàn)的,后來感覺不是很方便,就試探著直接使用VB提供的控件設置通訊速率(實用24M晶振分別在1.5M和750000的波特率進行通訊實驗,均得到滿意的效果。
說得直白一點,就是公司提供的驅(qū)動程序中已經(jīng)包含了這些底層的操作,用戶只要按正常操作串口同樣的辦法處理即可。