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

一個RS232接收的問題

缺席
kilomatter
一般會員


發表:2
回覆:3
積分:1
註冊:2003-08-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-21 20:57:34 IP:140.113.xxx.xxx 未訂閱
我參考文魁出的那本RS232&Borlad C Builder 自己撰寫以下的程式來測試PC端的接收。 成功開啟Com1,但是在暫存區卻沒有收到任何的資料。 請問各位大大,我自行撰寫的程式中,有哪裡可能有問題?謝謝! (PS:硬體部份,我用C語言測試過,PC部份可以正確接收。) 程式: TForm1 *Form1; HANDLE hComm; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if (hComm!=INVALID_HANDLE_VALUE) CloseHandle(hComm); char *ComNo; DCB dcb; String Temp; //取得欲開啟的通訊埠 Temp = "COM1"; //轉換至指標型態Char ComNo = Temp.c_str(); hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); if (hComm == INVALID_HANDLE_VALUE) // 如果COM 未開啟 { MessageBox(0, "開啟通訊埠錯誤!!","Comm Error",MB_OK); return; } //將dcb位址傳入,以取得通訊參數 GetCommState(hComm,&dcb); // 得知目前COM 的狀態 dcb.BaudRate =9600; //設定鮑率為9600 dcb.ByteSize = 8; // 位元組為 8 bit dcb.Parity = NOPARITY; // Parity 為 None dcb.StopBits = ONESTOPBIT; // 1 個Stop bit //通訊埠設定 if (!SetCommState(hComm, &dcb)) { // 設定COM 的狀態 MessageBox (0, "通訊埠設定錯誤!!!","Set Error",MB_OK); CloseHandle(hComm); return; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { char inbuff[20],*ip_address,tempchar,tempchar2[100]; String temp; DWORD nBytesRead=1, dwEvent, dwError; COMSTAT cs; COMMTIMEOUTS time_out ; time_out.ReadIntervalTimeout = MAXDWORD ; SetCommTimeouts( hComm , &time_out ) ; ClearCommError(hComm,&dwError,&cs); // 資料是否大於我們所準備的Buffer if (cs.cbInQue > sizeof(inbuff)) { PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 資料 return; } ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的資料 Memo1->Text = Memo1->Text cs.cbInQue; //PurgeComm(hComm, PURGE_RXCLEAR); //陣列中的字串結尾處補上零字元 inbuff[1]= '\0'; // 將資料顯示於Memo1 上 // Memo1->Text = Memo1->Text (int)inbuff; } //-------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if (hComm!=INVALID_HANDLE_VALUE) CloseHandle(hComm); exit(EXIT_SUCCESS); } //-------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { Memo1->Text =" "; }
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-22 09:38:43 IP:211.22.xxx.xxx 未訂閱
bcb 內help有記載 cbInQue: Specifies the number of bytes received by the serial provider but not yet read by a ReadFile operation. 所以您試試修改這樣 ===你的程式段============= ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的資料 Memo1->Text = Memo1->Text cs.cbInQue; //PurgeComm(hComm, PURGE_RXCLEAR); //陣列中的字串結尾處補上零字元 inbuff[1]= '\0'; // 將資料顯示於Memo1 上 // Memo1->Text = Memo1->Text (int)inbuff; ============================ ===改成這樣試試================= ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); inbuff[cs.cbInQue]= '\0';//陣列中的字串結尾處補上零字元 Memo1->Text = Memo1->Text inbuff;// 將資料顯示於Memo1 上 ========================================
kilomatter
一般會員


發表:2
回覆:3
積分:1
註冊:2003-08-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-22 13:07:55 IP:140.113.xxx.xxx 未訂閱
>===改成這樣試試================= >ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); > >inbuff[cs.cbInQue]= '\0';//陣列中的字串結尾處補上零字元 > >Memo1->Text = Memo1->Text inbuff;// 將資料顯示於Memo1 上 >======================================== 這個方法我試過了,無法收到正確的值。 而且,cs.cbInQue似乎還是0。降是不是表示PC端無法接收我所傳的值呢? 如果是,那我的程式端是否有其他的問題?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-22 23:27:12 IP:140.135.xxx.xxx 未訂閱
kilomatter您好:      那本書上有附上元件TComm,您可以試試看    順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-04-26 21:19:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!