全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1369
推到 Plurk!
推到 Facebook!

有關RS-232的怪問題

答題得分者是:dllee
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-08 17:30:15 IP:61.30.xxx.xxx 未訂閱
Dears:   小弟我寫了一個程式,是透過RS-232將檔案傳送到一個周邊。現在發現幾個問題,我實在不瞭解是哪裡出了錯,請各位大大幫小弟我看看。我先將問題列舉如下:    1.我的程式在兩台筆記型電腦上,作業系統是XP,COM Port是用USD轉RS-232那種。然後傳輸速率是57600。可是,我傳送一個2MB的檔案,大約都需要40~50分鐘,而且傳送的時候CPU的效率幾乎都在100%,可是至少跟周邊的對應都能正常執行。 2.我將程式安裝到兩台桌上型電腦上,作業系統是2000 Server,然後Com Port是純的COM Port。可是,我的程式在這兩台電腦上,跟周邊的對談就會出現問題了。因為,程式必須先跟周邊做些雙向溝通才能傳送檔案過去,可是我的程式在這兩台電腦上,接收周邊的資料似乎接收回來的資料都有錯誤。這是哪裡的問題ㄋㄟ?    我將我的程式部分列去如下: Temp = "COM">ItemIndex 1); ComNo = Temp.c_str(); hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); if (hComm == INVALID_HANDLE_VALUE) { MessageBox(0, "無法開啟通訊埠!!!","Comm Errer",MB_OK); return; } int i=ComboBox2->ItemIndex; GetCommState(hComm,&dcb); switch(i) { case 0: dcb.BaudRate = CBR_4800; break; case 1: dcb.BaudRate = CBR_9600; break; case 2: dcb.BaudRate = CBR_14400; break; case 3: dcb.BaudRate = CBR_19200; break; case 4: dcb.BaudRate = CBR_38400; break; case 5: dcb.BaudRate = CBR_57600; break; case 6: dcb.BaudRate = CBR_115200; break; } dcb.ByteSize = 8; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.StopBits = ONESTOPBIT; if (!SetCommState(hComm, &dcb)) { MessageBox (0, "設定錯誤!!!", "Set Error", MB_OK); CloseHandle(hComm); return; } Button1->Enabled = false; Button2->Enabled = true; Button3->Enabled = true; ComboBox1->Enabled = false; ComboBox2->Enabled = false; StatusBar1->Panels->Items[0]->Text = "通訊埠已連結"; Timer1->Enabled=true; Timer2->Enabled=true; } //上面是我開啟COM Port的部分 void __fastcall TForm1::Timer1Timer(TObject *Sender) { String Temp; char inbuff[512]; DWORD nBytesRead, dwEvent, dwError; COMSTAT cs; ClearCommError(hComm, &dwError, &cs); if (cs.cbInQue > sizeof(inbuff)) { PurgeComm(hComm, PURGE_RXCLEAR); return; } ReadFile(hComm, inbuff, cs.cbInQue, &nBytesRead, NULL); String tWord=String(inbuff); if ( strstr(inbuff, s2)) { unsigned long lrc; String Send="OK"; PurgeComm(hComm, PURGE_TXCLEAR); WriteFile(hComm, Send.c_str(), 2, &lrc,NULL); } if ( strstr(inbuff, s4)) { Timer2->Enabled=false; StatusBar1->Panels->Items[1]->Text = "已連線,請更新程式"; Button4->Enabled=true; Timer1->Enabled = false; } if ( strstr(inbuff, s8)) { MessageBox (0, "資料傳送結束", "Information",MB_OK); StatusBar1->Panels->Items[0]->Text = "檔案已更新!"; Button4->Enabled = true; ProgressBar1->Position=0; Timer1->Enabled = false; } if ( strstr(inbuff, s9)) { MessageBox (0, "資料傳送失敗,請重新傳送!", "Information",MB_OK); StatusBar1->Panels->Items[0]->Text = "檔案傳送失敗!"; Button4->Enabled = true; ProgressBar1->Position=0; Timer1->Enabled = false; } } //這邊是我跟周邊溝通的部分,我必須等到周邊有送來*S2 & *S4才能開始傳送檔案過去 void __fastcall TForm1::Button4Click(TObject *Sender) { Timer2->Enabled = false; Button4->Enabled = false; char *pt; TMemoryStream *TMS; TMS=new TMemoryStream(); TMS->LoadFromFile(fileName); unsigned long lrc; pt=(BYTE *)TMS->Memory; ProgressBar1->Max = TMS->Size; // 這個時候, pt的指標就是你想像中的buffer的第一個byte唷 for ( int i = 0 ; i < TMS->Size;i ) { Application->ProcessMessages(); ProgressBar1->Position ; PurgeComm(hComm, PURGE_TXCLEAR); WriteFile(hComm, pt, 1, &lrc, NULL); pt ; } delete TMS; // 這是一定要的啦, 自己new的就要自己delete唷 Timer1->Enabled = true; StatusBar1->Panels->Items[1]->Text = "更新中,請稍候!"; } //而這邊就是我送檔案給周邊的部分了。 請各位大大幫我看看,到底是哪裡有問題ㄋㄟ?感激不盡~~~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-15 08:03:04 IP:211.76.xxx.xxx 未訂閱
先聲明,我沒用過 ???Comm???() 這類的 API 去控制 COM port,一般都是直接使用 COM Port 的元件,網路上至少可以找到 5 個含原始碼免費的 COM Port 元件。    關於您傳輸錯誤的問題,我不清楚(因為看不懂 ???Comm???),不過關於傳檔時 CPU Loading 會到 100% 是因為您在 Button4Click 傳檔時,用了 for 迴圈一筆一筆傳,其中沒有 Sleep 之類的指令,那 CPU Loading 在 for 迴圈執行期間自然是 100% 57600 bps / 10(1start+8data+1stop) = 5760 Byte/sec 2,000,000 / 5760 = 347.22 Sec = 5.79 分鐘 就算再慢一倍,就算再加傳週邊要回應20幾分鐘也應該要傳完,可以比較/參考現成元件,應該不會要到 40~50 分鐘...    另外,您說的
引言:可是,我的程式在這兩台電腦上,跟周邊的對談就會出現問題了。
這部分的程式碼並沒有列出來唷... 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-16 13:37:44 IP:211.20.xxx.xxx 未訂閱
感謝大大的解答,不過問題小弟我之前已經解決了。 小弟發現ProgressBar1->Position ;這邊需要很大的資源,所以我把這邊給拿掉了。然後,因為傳送資料過去的時候周邊也會傳送資料回來,所以在迴圈中我又加入PurgeComm(hComm, PURGE_RXCLEAR);把接收暫存區給清除掉。目前速度已經改善很多了,2MB的檔案,大概只要七至八分鐘左右吧。 還有另外的問題,是我一開始的宣告有問題,把我的宣告改了之後就解決了。不過,還是謝謝大大的解答~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
系統時間:2024-05-02 6:54:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!