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

用C++ Builder 6.0 寫 RS-232 程式的問題

缺席
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-08 13:19:23 IP:210.240.xxx.xxx 訂閱
我用『C Builder 6完全攻略』這本書的範例
改寫了一個程式RS-232的程式
他原本是送的-我想改寫一個可以透過UART接收的..
而我也沒辦法確定他一開始的程式可以送
我改的程式如下..
請會的人可以指導我一下
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-11 15:29:43 IP:125.229.xxx.xxx 未訂閱
大大:
為什麼接收要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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-11 17:09:26 IP:210.240.xxx.xxx 訂閱
這個後...我也不知道..看上面有..我才加上去的...不過
//CloseHandle(h_RS232);
如果沒有刪掉...只能執行一次...
如果反斜線...
可以無窮的執行

不過這樣好像還是不能收
是要設定Timer嗎?
我看VB是這樣寫的
他每個ms就去讀一次
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-11 17:39:13 IP:61.62.xxx.xxx 訂閱
上面的FLOW怪怪的

正常的Flow
1.CreateFile 開檔
2.Config DCB 設定
3. ReadFile / WriteFile 讀/寫
4.CloseHandle 關檔 ;關檔後當然不能R/W

超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-12 14:49:48 IP:210.240.xxx.xxx 訂閱
<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) <-這行成立會是什麼結果
編輯記錄
超級賽亞人3 重新編輯於 2007-06-12 14:52:02, 註解 無‧
超級賽亞人3 重新編輯於 2007-06-12 14:52:47, 註解 無‧
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-12 15:23:00 IP:61.62.xxx.xxx 訂閱
請參考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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-26 21:31:27 IP:125.231.xxx.xxx 訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-26 21:36:26 IP:125.231.xxx.xxx 訂閱
附帶一提
CloseHandle(h_RS232);//這一行???
如果不先將已開啟的通訊埠關閉,
又再重覆開啟一次會出現錯誤訊息。
這是為什麼要加這一行的原因。
系統時間:2024-05-05 0:53:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!