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

nrComm的OnAfterReceive事件永不觸發的問題

缺席
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-18 13:57:20 IP:203.75.xxx.xxx 未訂閱
最近要改用BCB2007來寫串列埠的應用程式,因為手頭上免費的元件都不能用,所以改用nrComm來試試。
測試的硬體是一條第2及第3支腳位串連的rs232線材,所以我送出去的文字也會原封不動地傳回來

以下就是我測試的程式:
[code cpp]
nrComm1->Active = true;
nrComm1->SendString = "Test";
Sleep(100);
Edit1->Text = nrComm1->ReadString();
nrComm1->Active = false;
[/code]

以上的程式是ok的,文字送出去後會正常傳到edit內。
再來就是測試TnrComm的OnAfterReceive事件,看我傳送的資料會不會馬上回傳。

先來看看原程式說明:
type TOnReceived =procedure( Sender:TnrBaseIO; Buffer:Pointer; Received:Cardinal) of object;
property OnAfterReceive: TOnReceived;
Description:
The OnAfterReceive event will occur when input buffer has new data. The received bytes are allowed in Buffer. The Received parameter is number of received bytes.

m$的翻譯是這樣:
當輸入緩衝區具有新的資料時,會發生 OnAfterReceive 事件。 緩衝區中允許將收到的位元組。 Received 參數是數目收到位元組為單位。
於是,我就把原來的程式內容改成:
[code cpp]
void __fastcall TForm1::nrComm1AfterReceive(TObject *Com, Pointer Buffer,
DWORD Received)
{
Edit1->Text = char(Buffer);
}
[/code]
看起來應該是這樣沒有錯,但實際上在run的時候,資料send出去了,可是卻沒有觸發receive事件…實在是很奇怪啊!
不知道有沒有人用過這套元件呢?
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-21 08:03:32 IP:118.167.xxx.xxx 未訂閱
原來已經有人問過這類的問題啊......以下是DeepSoftware技術人員的回答:
===============
Hello

You can find the several useful demo projects after installation the trial version of nrComm Lib.
Some of this demo projects are available over shortcuts in the "Start" menu, more samples you can see in nrCom Lib home folder on your local disk.
You can try following demos:
  • Demos\Codes It reads all incoming chars and shows a HEX or DECIMAL code of received chars
  • Demos\DataProc It shows capabilities of TnrDataProccessor component. It implements the detection of several type of data packets.
  • Demos\DTerminal It uses Terminal property with ordinary TMemo control for direct I/O operations with serial port
  • Demos\SimplePacke2 It shows a way for detect a simple data packet with fixed end chars.
  • Demos\StringReceiverBCB It shows a way for detect a simple data packet by one fixed char.
===============

結論就是...我沒看清楚啦 > <|||
資料來源: http://deepsoftware.com/groups_dsr/index.php?PHPSESSID=3c8b36a297436122a02c6dcc045bcdee&topic=27.0
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-22 19:59:37 IP:220.137.xxx.xxx 訂閱
請問可不可以問個題外話, 那就是:

在第一個範例中為何要 Sleep(100) 呢?
我在我公司看到一些關於 RS232 的執行緒原始碼, 偶而也會看到插入 Sleep(xxx) 之類的指令
是因為怕來不及接收嗎? 這個問題我都是靠 COMMTIMEOUT 這個結構來解決
還是另有用意呢? 煩請大大幫我解謎 ^^
------
Mephise Chen
前興德工程師
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-22 23:55:15 IP:220.139.xxx.xxx 未訂閱
 正解

另外,TimeOut的做法也很常見,不用太緊張,能動就好 ^ ^

===================引 用 mephise 文 章===================
在第一個範例中為何要 Sleep(100) 呢?
是因為怕來不及接收嗎?
系統時間:2024-03-29 16:54:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!