線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3100
推到 Plurk!
推到 Facebook!

SPCOMM如何傳送byte資料而非PChar

答題得分者是:jow
rover_kung
一般會員


發表:1
回覆:3
積分:0
註冊:2003-11-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-25 16:20:07 IP:211.23.xxx.xxx 訂閱
各位前輩:
小弟有一簡單的程式要送一訊號至RS232,程式如下
procedure TfmRS232.Button2Click(Sender: TObject);
var vParam: PChar;
begin
vParam:=PChar(Edit1.Text);
Comm1.WriteCommData(vParam,Length(vParam));
end;
end;

因RS232要求的訊號為1 byte的資料, 但Edit1.txt為文字, 且WriteCommData的參數1為PChar型態
如果我要送一資料為 123,WriteCommData會把123當成3個字元送出, 不知如何把 123當成1byte
送到RS232, 拜託大家了!!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-25 16:49:24 IP:210.66.xxx.xxx 訂閱

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
procedure WriteCommData(c: PChar; len: Integer);
begin
ShowMessage(Format('c=%s, len=%d',[c[0], Length(c[0])]));
//或
ShowMessage(Format('c=%s, len=%d',[c^, Length(c^)]));
end;
var
c: Char;
begin
//模擬將字串'123'轉換成數值,送到函式 WriteCommData(), 作進一步處理
Edit1.Text := '123';
c := char(StrToIntDef(Edit1.Text,0) mod 256);
WriteCommData(@c,1);
end;
[/code]
rover_kung
一般會員


發表:1
回覆:3
積分:0
註冊:2003-11-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-25 17:56:50 IP:211.23.xxx.xxx 訂閱
感謝前輩不吝指導, 如此快回覆, 我會依照指示測試, 再回報結果!!
rover_kung
一般會員


發表:1
回覆:3
積分:0
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-25 23:24:45 IP:210.192.xxx.xxx 訂閱
我試了, 但似乎送出的訊號還是和硬體不合, 不知是不是我問的方向不對!! 我查了一些資料
查到一個function GetMem(var P: Pointer; Size: Integer),是否有方法用跑迴圈的方式把
Edit.text中的值, 依序讀入 var P中
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-26 00:28:42 IP:123.193.xxx.xxx 訂閱
首先來釐清一下你的需求,
(1)原帖提問: 將Edit1.Text 內含的字串,透過

Comm1.WriteCommData(vParam,Length(vParam));

傳送到另一端.

如果,接收端收到長度等於3的字串 '123', 其實這是正確的.

我回帖中則是將'123'透過StrToIntDef()轉換成一個Byte數值(介於0~255)
然後將它送出. 所以如果傳輸正常,則接收端應該收到一個Byte(或Char)的資料.

(2)GetMem() 是用來動態配置記憶體, 其相對釋放記憶體的動作為FreeMem()
[code delphi]
procedure TForm1.Button2Click(Sender: TObject);
var
S: string;
P: PChar;
Len: Integer;
begin
S := '12345';
GetMem(P,10); //配置記憶體
try
FillChar(P^,10,0); //清除為零
Len := Math.Min(10,Length(S)); //
Move(PChar(S)^, P^, Len); //將S內含值copy到P所指向的記憶體
ShowMessage('S=' S); //顯示原字串
ShowMessage('P^=' string(P)); //顯示複製的字串
finally
FreeMem(P); //釋放記憶體
end;
end;
[/code]

(3)資料傳輸,建議使用定義好的封包,這一篇是個人之前分享的小程式,
你可以參考相關做法...

http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90517


個人建議,謹供參考..........
編輯記錄
jow 重新編輯於 2008-03-26 00:29:35, 註解 無‧
jow 重新編輯於 2008-03-26 00:30:45, 註解 無‧
rover_kung
一般會員


發表:1
回覆:3
積分:0
註冊:2003-11-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-26 10:09:31 IP:211.23.xxx.xxx 訂閱
Jow,非常感謝指導, 其實在你首次回覆就已經正確的解答了, 這次再經你說明,
我回頭檢查我的程式碼,果然有個型別定義未改正, 現在已經可以正常運作了!
感恩....
系統時間:2024-04-26 6:05:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!