一個RS232接收的問題 |
缺席
|
kilomatter
一般會員 發表:2 回覆:3 積分:1 註冊:2003-08-02 發送簡訊給我 |
我參考文魁出的那本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 發送簡訊給我 |
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 發送簡訊給我 |
>===改成這樣試試=================
>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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |