• 沒有找到結果。

會造成此嚴重延遲的現象的原因在於,C 程式 readport( )函式內使用無窮迴圈不斷 偵測 serial port。所以只要使用者在網頁開始讀取 port 接收資料,對方一直沒傳送資料 過來,則無窮迴圈將一值持續下去,造成使用者介面端跟網頁伺服器之間嚴重延遲。解 決方法使利用近似不間斷偵測 serial port 的方式接收資料,做法如下:

1. 在c程式readport( )函式部份,使用readfile函式時不使用無窮迴圈,改採 用兩層有限迴圈,loop count 皆設為 32000 。

2. 而 網 頁 read.asp 部 份 利 用 <meta http-equiv="refresh" content="1;

url=read.asp"> 指令讓網頁自動每一秒重複執行網頁上的程式碼,也就是每

一秒callㄧ次c程式的readport ( )函式,這樣一來既可以做到接近不間斷偵測 serial port以防資料接收不完整的情形,而且也讓伺服器端讀取serial port可以 約略每ㄧ秒,即可執行完一次連續性偵測;藉由網頁每秒自動呼叫readport ( ) 函式,再重新讀取serial port。如此一來便解決了網頁讀取serial port時嚴重延 遲的問題,而且即使使用者一方面讀取serial port ,一方面寫資料到serial port 也不會互相干擾到,傳輸也順暢起來。

5.3 問題討論三

▲ 圖 5.1 問題討論三之錯誤架構圖

於 3.6.2 與 3.6.3 有提到架構修改的問題。原本使用圖 5.1 這種 ASP 呼叫 Web Server 端 DLL 檔的方式,透過 openport()、readport()、writeport()與 closeport()四種 函式,將網頁指令資料透過 RS-232 傳到模擬 8051 接收的 PC 端,藉以了解網頁伺服 器送出的資料是否正確。而模擬 8051 的 PC 端使用 C 程式的執行檔接收與傳送料,結 果卻發現 C 程式的執行檔接收到的資料並非網頁伺服器所傳送的資料,而 C 程式所傳 送給使端者端控制網頁的資料也都解讀錯誤。不僅如此,縱使將 Web Server 直接與 8051 連結,8051 中的 SBUF 收到的資料,竟然與 C 程式解讀的資料一樣,都是錯誤 的。

解決方法:

以上問題,經由不斷地 try and error 發現,若將模擬 8051 接收端 PC 改使用 VB 呼叫 DLL 檔的方式來接收與傳送資料,則雙方傳送與接收資料正確無誤,並無出現資 料解讀錯誤的情形。在查了許多 DLL 相關資料與詢問老師之後終於找出錯誤原因,那 就是使用 ASP 呼叫 DLL 時與 C 程式溝通的過程中,此兩種軟體彼此之間對於資料暫存 區的定義不同,導致雞同鴨講的情形發生。雖然只要雙方都是透過呼叫 DLL 來溝通即 可解決,但是 8051 組合語言無法呼叫 DLL。於是經過了多日的尋找,終於找到解決方 法,那就是將 Web Server 端架構改為利用 ASP 呼叫 C 程式執行檔,如此便解決了這 個難纏的問題。修正後的架構參考下圖,圖 5.2。

▲ 圖 5.2 問題討論三之修正 Web Server 架構

5.4 心得感想

站上 serial communication in win32 文章的函式與結構的用法,幾乎沒有 C/C++的中文 書對 serial port 傳輸有這麼詳細的介紹,讓我感覺到這是很珍貴的資源,所以將文章截

第六章 應用與未來展望

相關文件