有關RS-232的怪問題 |
答題得分者是:dllee
|
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
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 發送簡訊給我 |
先聲明,我沒用過 ???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 發送簡訊給我 |
感謝大大的解答,不過問題小弟我之前已經解決了。
小弟發現ProgressBar1->Position ;這邊需要很大的資源,所以我把這邊給拿掉了。然後,因為傳送資料過去的時候周邊也會傳送資料回來,所以在迴圈中我又加入PurgeComm(hComm, PURGE_RXCLEAR);把接收暫存區給清除掉。目前速度已經改善很多了,2MB的檔案,大概只要七至八分鐘左右吧。
還有另外的問題,是我一開始的宣告有問題,把我的宣告改了之後就解決了。不過,還是謝謝大大的解答~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |