RS232字元接收問題 |
尚未結案
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
各位大大好,小弟測試一個RS232程式(PC自己傳自己2.3接一起)
如圖,傳送的字元只要超過四個(包含四個)第一個字元就會出現在最後面
想請問為什麼會這樣? 感謝 以下附上程式碼
//------------------------------------------------------------------- void __fastcall TForm1::btnConnectClick(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; COMMTIMEOUTS TimeOut; TimeOut.ReadIntervalTimeout = 0; TimeOut.ReadTotalTimeoutMultiplier = 0; TimeOut.ReadTotalTimeoutConstant = 500; //(總讀取 time out 時間 = 0.5 秒) TimeOut.WriteTotalTimeoutMultiplier = 0; TimeOut.WriteTotalTimeoutConstant = 500; //(總寫入 time out 時間 = 0.5 秒) if (BuildCommDCB("9600,n,8,1",&dcb)) //(每秒傳輸率,n,8bit,一個停止位元) { lbBuildCommDCB->Caption="BuildCommDCB 成功"; } else { lbBuildCommDCB->Caption="BuildCommDCB 失敗"; } handle=CreateFile("Com1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); //(檔案名,可讀可寫,不共享,不保密,開啟舊檔,檔案屬性) if (SetCommState(handle,&dcb)) //(存放執行CreatFile函數後所傳回的HANDLE代碼,指向 DCB 資料結構的位址) lbSetCommState->Caption="SetCommState 成功"; else lbSetCommState->Caption="SetCommState 失敗"; if (SetupComm(handle,1024,1024)) //(同上,輸入資料佇列大小,輸出資料佇列大小) lbSetupComm->Caption="SetupComm 成功"; else lbSetupComm->Caption="SetupComm 失敗"; if (SetCommTimeouts(handle,&TimeOut)) lbSetCommTimeouts->Caption="SetCommTimeouts 成功"; else lbSetCommTimeouts->Caption="SetCommTimeouts 失敗"; } //--------------------------------------------------------------------------- void __fastcall TForm1::btnTransmissionClick(TObject *Sender) { char lpBuf; char WriteBuffer; char *ptr; DWORD dwWrite; DWORD dwRead; ptr=Edit1->Text.c_str(); WriteBuffer=*ptr; WriteFile(handle,&WriteBuffer,1,&dwWrite,0); ReadFile(handle, &lpBuf, 1, &dwRead, NULL); if (dwRead == 0) { lbStatus->Caption="沒有回應 !!"; } else { Edit2->Text=Edit1->Text+lpBuf; } } //--------------------------------------------------------------------------- void __fastcall TForm1::btnDisconnectClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
引言: Hi! Edit2->Text=Edit1->Text+lpBuf; 改 Edit2->Text=Edit2->Text+lpBuf; 但你的程式,按鍵一次只送一個字元. 感謝DavidLo大大回應,經過大大的指正小弟發現小弟的程式只能傳一個字元,但是為什麼現在要傳4個字元(如圖)才會出現第一個字元呢?傳一個就接收不到?? 還有若小弟想做成可一次傳送好幾個字元,該怎麼修改呢?感謝大大指教^^發表人 - iimumi 於 2005/12/01 11:59:58 發表人 - iimumi 於 2005/12/01 12:15:30 發表人 - iimumi 於 2005/12/01 12:47:52 發表人 - iimumi 於 2005/12/01 12:55:24 |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
引言: 1.加Sleep(10)於Write and Read之間,10 is 10ms. 2.WriteFile(handle,&WriteBuffer,1,&dwWrite,0); 第3個參數是umber of bytes to write你設為1. 感謝大大回覆,小弟改了之後問題依然存在,請問是小弟改錯了嗎?發表人 - iimumi 於 2005/12/02 12:31:07char lpBuf; char WriteBuffer; char *ptr; DWORD dwWrite; DWORD dwRead; ptr=Edit1->Text.c_str(); WriteBuffer=*ptr; WriteFile(handle,&WriteBuffer,5,&dwWrite,0); Sleep(10); ReadFile(handle, &lpBuf, 1, &dwRead, NULL); |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
引言: 我指的是ReadFile執行完時,dwRead是多少!其代表實際得到Byte數. 5是想要Byte數.WriteFile同理. DavidLo大大很抱歉,之前沒搞清楚你的意思^^" dwRead和dwWrite都是5,void __fastcall TForm1::btnTransmissionClick(TObject *Sender) { ptr=Edit1->Text.c_str(); WriteBuffer=*ptr; WriteFile(handle,&WriteBuffer,5,&dwWrite,0); Sleep(10); ReadFile(handle, &lpBuf, 5, &dwRead, NULL); if (dwRead == 0)//預設是0,故若傳回0,代表沒回應 { lbStatus->Caption="沒有回應 !!"; } else { Edit2->Text=Edit2->Text+lpBuf; } } //-------------------------------------------------------------------- void __fastcall TForm1::btnReadClick(TObject *Sender) { AnsiString a,b; a=dwWrite; b=dwRead; lbdwWrite->Caption="dwWrite:"+a; lbdwRead->Caption="dwRead:"+b; //-------------------------------------------------------------------- |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
這個地方怪怪的
char lpBuf;//宣告一個字元 char WriteBuffer;//宣告一個字元 char *ptr;//宣告一個指標 ... ptr=Edit1->Text.c_str();//字串丟給指標??? WriteBuffer=*ptr; WriteFile(handle,&WriteBuffer,5,&dwWrite,0);改成 char txbuf[255],rxbuf[255]; ... strcpy(txbuf,Edit1->Text.c_str()); WriteFile(handle,&txbuf,5,&dwWrite,0); Sleep(10); ReadFile(handle,&rxbuf,5,&dwRead, NULL); Edit2->Text=rxbuf; |
iimumi
一般會員 發表:9 回覆:11 積分:4 註冊:2004-07-06 發送簡訊給我 |
感謝大大,經過修改後程式已經可以正常動作了,感謝DavidLo大大^^
以下是修改過的程式
strcpy(txBuf,Edit1->Text.c_str()); //(目的字串,無結尾的來源字串) WriteFile(handle,&txBuf,255,&dwWrite,0); Sleep(10); ReadFile(handle, &rxBuf, 255, &dwRead, NULL); if (dwRead == 0)//預設是0,故若傳回0,代表沒回應 { lbStatus->Caption="沒有回應 !!"; } else { Edit2->Text=rxBuf; }發表人 - iimumi 於 2005/12/08 01:59:52 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |