線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5011
推到 Plurk!
推到 Facebook!

RS232字元接收問題

尚未結案
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-30 21:22:57 IP:192.192.xxx.xxx 未訂閱
各位大大好,小弟測試一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-01 10:53:40 IP:61.228.xxx.xxx 未訂閱
Hi! Edit2->Text=Edit1->Text lpBuf; 改 Edit2->Text=Edit2->Text lpBuf; 但你的程式,按鍵一次只送一個字元.
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-01 11:23:06 IP:192.192.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-01 17:03:23 IP:61.228.xxx.xxx 未訂閱
1.加Sleep(10)於Write and Read之間,10 is 10ms. 2.WriteFile(handle,&WriteBuffer,1,&dwWrite,0); 第3個參數是umber of bytes to write你設為1.
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-12-02 11:51:42 IP:192.192.xxx.xxx 未訂閱
引言: 1.加Sleep(10)於Write and Read之間,10 is 10ms. 2.WriteFile(handle,&WriteBuffer,1,&dwWrite,0); 第3個參數是umber of bytes to write你設為1. 感謝大大回覆,小弟改了之後問題依然存在,請問是小弟改錯了嗎?
  char 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);
發表人 - iimumi 於 2005/12/02 12:31:07
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-12-03 07:11:02 IP:218.169.xxx.xxx 未訂閱
同writeFile ReadFile(handle, &lpBuf, 1, &dwRead, NULL); 第3個參數是umber of bytes to read你設為1,只讀1byte.
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-12-04 21:06:23 IP:192.192.xxx.xxx 未訂閱
引言: 同writeFile ReadFile(handle, &lpBuf, 1, &dwRead, NULL); 第3個參數是umber of bytes to read你設為1,只讀1byte. 抱歉大大我有測試過writefile跟readfile都設為5但還是不行耶?
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-12-05 09:48:42 IP:61.228.xxx.xxx 未訂閱
設為5時,dwWrite and dwRead為多少?
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-12-05 15:34:51 IP:192.192.xxx.xxx 未訂閱
引言: 設為5時,dwWrite and dwRead為多少? 跟原先一樣,設為0和NULL
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-12-05 23:24:55 IP:218.169.xxx.xxx 未訂閱
我指的是ReadFile執行完時,dwRead是多少!其代表實際得到Byte數. 5是想要Byte數.WriteFile同理.
iimumi
一般會員


發表:9
回覆:11
積分:4
註冊:2004-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-12-06 19:03:33 IP:192.192.xxx.xxx 未訂閱
引言: 我指的是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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-12-06 23:17:41 IP:218.169.xxx.xxx 未訂閱
這個地方怪怪的    
  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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-12-08 01:52:19 IP:192.192.xxx.xxx 未訂閱
感謝大大,經過修改後程式已經可以正常動作了,感謝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
系統時間:2024-11-23 17:37:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!