用C++ Builder 6.0 寫 RS-232 程式的問題 |
缺席
|
超級賽亞人3
一般會員 發表:38 回覆:53 積分:23 註冊:2007-06-05 發送簡訊給我 |
我用『C Builder 6完全攻略』這本書的範例
改寫了一個程式RS-232的程式 他原本是送的-我想改寫一個可以透過UART接收的.. 而我也沒辦法確定他一開始的程式可以送 我改的程式如下.. 請會的人可以指導我一下 |
foreman
高階會員 發表:3 回覆:124 積分:190 註冊:2004-09-10 發送簡訊給我 |
大大:
為什麼接收要CloseHandle <textarea class="cpp" rows="10" cols="60" name="code">void __fastcall TForm1::BitBtn4Click(TObject *Sender) { if (h_RS232) { CloseHandle(h_RS232);//這一行??? ShowMessage("開始接收!"); BitBtn1->Enabled = false; BitBtn2->Enabled = false; BitBtn3->Enabled = false; BitBtn4->Enabled = true; } if ((h_RS232) && (Edit2->Text != "")) { DCB dcb; ZeroMemory(&dcb, sizeof(dcb)); dcb.DCBlength = sizeof(dcb); // DCB 的大小 (in byte) dcb.BaudRate = 19200; // 傳輸率 (baud rate) bit/秒 dcb.ByteSize = 8; // 每一筆資料的 bit 數, 4-8 dcb.Parity = NOPARITY; // 同位元 (0-4) = 無,奇同位,偶同位,mark,space dcb.StopBits = ONESTOPBIT; // 停止位元 (0,1,2) = 1, 1.5, 2 if(SetCommState(h_RS232,&dcb)) { DWORD ByteCount; ReadFile(h_RS232, Edit2->Text.c_str(), strlen(Edit2->Text.c_str()), &ByteCount, NULL); } //Edit2->Text = ""; } } </textarea> |
超級賽亞人3
一般會員 發表:38 回覆:53 積分:23 註冊:2007-06-05 發送簡訊給我 |
|
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
|
超級賽亞人3
一般會員 發表:38 回覆:53 積分:23 註冊:2007-06-05 發送簡訊給我 |
<textarea class="c#" rows="10" cols="60" name="code">void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
if (h_RS232)
{
//CloseHandle(h_RS232);
ShowMessage("開始接收!");
BitBtn1->Enabled = false;
BitBtn2->Enabled = false;
BitBtn3->Enabled = false;
BitBtn4->Enabled = true;
}
if ((h_RS232) && (Edit2->Text != ""))
{
DCB dcb;
ZeroMemory(&dcb, sizeof(dcb));
dcb.DCBlength = sizeof(dcb); // DCB 的大小 (in byte)
dcb.BaudRate = 19200; // 傳輸率 (baud rate) bit/秒
dcb.ByteSize = 8; // 每一筆資料的 bit 數, 4-8
dcb.Parity = NOPARITY; // 同位元 (0-4) = 無,奇同位,偶同位,mark,space
dcb.StopBits = ONESTOPBIT; // 停止位元 (0,1,2) = 1, 1.5, 2
if(SetCommState(h_RS232,&dcb))
{
DWORD ByteCount;
ReadFile(h_RS232,
Edit2->Text.c_str(),
strlen(Edit2->Text.c_str()),
&ByteCount,
NULL);
}
//Edit2->Text = "";
}
}
</textarea>
DWORD ByteCount; <-這個是用來幹嘛的?? 妳說的開檔我是不太清楚不過我中間有設定DCB,給予初始化,在15-22行 只是 SetCommState(h_RS232,&dcb) <-這行成立會是什麼結果 |
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
請參考API 說明
BOOL ReadFile( HANDLE hFile, // handle of file to read LPVOID lpBuffer, // address of buffer that receives data DWORD nNumberOfBytesToRead, // number of bytes to read 你想讀幾個byte LPDWORD lpNumberOfBytesRead, // address of number of bytes read 真正幾個Byte 被讀到 LPOVERLAPPED lpOverlapped // address of structure for data ); |
Mich
一般會員 發表:8 回覆:10 積分:8 註冊:2003-09-15 發送簡訊給我 |
BOOL ReadFile(
HANDLE hFile, // handle of file to read LPVOID lpBuffer, // address of buffer that receives data DWORD nNumberOfBytesToRead, // number of bytes to read 你想讀幾個byte LPDWORD lpNumberOfBytesRead, // address of number of bytes read 真正幾個Byte 被讀到 LPOVERLAPPED lpOverlapped // address of structure for data ); 以下的程式是摘錄自文魁的"如何設計視窗介面的工貝軟體"一書 主要的功能就是接收資料,再參考shunchia63提供的API 說明 應該就可以解決你問題,試試看!! void __fastcall TRS232::RS232_Received(void) { DWORD nBytesRead,dwError; COMSTAT cs; //------取得狀態--------- ClearCommError(h_RS232,&dwError,&cs); //---------- 判斷接受的資料是否大於接受暫存器「128 」 if (cs.cbInQue>sizeof(RS232RXBuf)) { PurgeComm(h_RS232,PURGE_RXCLEAR); return; } //-----------接收---------------- ReadFile(h_RS232,RS232RXBuf,cs.cbInQue,&nBytesRead,NULL); //-----------將結尾補上零字元------------ RS232RXBuf[cs.cbInQue]='\0'; } 將你的 if(SetCommState(h_RS232,&dcb)) { DWORD ByteCount; ReadFile(h_RS232, Edit2->Text.c_str(), strlen(Edit2->Text.c_str()), &ByteCount, NULL); } 這一段程式改成 if(SetCommState(h_RS232,&dcb)) {DWORD nBytesRead,dwError; char RS232RXBuf[128]; COMSTAT cs; ClearCommError(h_RS232,&dwError,&cs); if (cs.cbInQue>sizeof(RS232RXBuf)) { PurgeComm(h_RS232,PURGE_RXCLEAR); return; } //-----------接收---------------- ReadFile(h_RS232,RS232RXBuf,cs.cbInQue,&nBytesRead,NULL); //-----------將結尾補上零字元------------ RS232RXBuf[cs.cbInQue]='\0'; //--------將接收的資料顯示在Edit2上--------- Edit2->Text=RS232RXBuf; } |
Mich
一般會員 發表:8 回覆:10 積分:8 註冊:2003-09-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |