如何頡取從RS232 POST 輸入數據資料 |
答題得分者是:pedro
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
可以使用moxa公司的pcom,
或ms免费的mscomm32控件,有中文帮助的; 例如:[vb]
下面这个简单的例子演示了用调制解调器进行基本的串行通讯: Private Sub Form_Load ()
' 保存输入子串的缓冲区
Dim Instring As String
' 使用 COM1。
MSComm1.CommPort = 1
' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
' 当输入占用时,
' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0
' 打开端口。
MSComm1.PortOpen = True
' 将 attention 命令送到调制解调器。
MSComm1.Output = "ATV1Q0" & Chr$(13) ' 确保
' 调制解调器以"OK"响应。
' 等待数据返回到串行端口。
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$, "OK" & vbCRLF)
' 从串行端口读 "OK" 响应。 ' 关闭串行端口。
MSComm1.PortOpen = False
End Sub 注意 MSComm 控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了轮询方法。关于事件驱动方法的例子请参阅 OnComm 事件的帮助。 到网上search一下,有很多的
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
sos_admin 所介紹的 mscomm32控件 也不錯用 var
i:integer;
s:string; // 設定為 com1
MSComm1.CommPort := 1; //包率: 9600 ,無奇偶校验,8 位数据,一个停止位元。
MSComm1.Settings := '9600,N,8,1'; MSComm1.InputLen := 0;
' 打开端口。
MSComm1.PortOpen := True; i:=0;
s:='';
while i<100 do
begin
if MSComm1.InputLen >0 then
begin
s: = s MSComm1.Input;
i:=i MSComm1.InputLen ;
end; end; MSComm1.PortOpen := False;
------
︿︿ |
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
您可以使用Comport Library元件組
http://www2.arnes.si/~sopecrni/
在安裝好之後
放上TComPort元件,
設定屬性 Port編號、BaudRate鮑率, Parity, StopBits
這幾個需和您的8051配置的要一樣
8051接一顆提升準位的ic(代號我忘了)
提升準位ic的TXD接到RS232的RXD
提升準位ic的RXD接到RS232的TXD
然後使用Open方法打開
此時有個事件是很重要的
OnRxChar就是8051有送字元進來的事件
若要送出資料可藉由操作WriteStr方法來達到目的
具體的實作, 參考examples裡的comexample 以上希望對您有幫助
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
下載完之壓縮檔裡有Help.zip,Examples.zip,Source.zip
解開壓縮檔Source.zip之後
source資料夾裡會有CPortLib5.dpk及DsgnCPort5.dpk
載入CPortLib5.dpk在Project Manager按Compile
然後copy這個CPortLib5.bpl到Delphi的Bin
再載入DsgnCPort5在Project Manager按Install
把CPort的source資料夾位址填入到Environment Options
的Library Path裡
CPort元件組是在Component Palette的CPortLib那一頁上
TComport,TComDataPacket,TComComboBox....
|
mymj
版主 發表:132 回覆:486 積分:608 註冊:2002-10-25 發送簡訊給我 |
請到如下網址http://vcl.vclxx.org/DELPHI/D32FREE/ASYNC32.ZIP下載
ASYNC32.ZIP 這個元件可以直接裝到delphi 上
;---------------------------------------------------------------------
ASYNC32.ZIP :
可在 Windows 95/98/ME/NT/2000 以多執行緒 ( Multi-Thread ) 控制 RS232 序列埠通訊的非視覺化元件 ( 1.82 版,無原始程式碼 Delphi 3.0/4.0/5.0 版適用 ),作者: Varian Software Services NL。
;---------------------------------------------------------------------
http://vcl.vclxx.org/DELPHI/DEFAULT.HTM有許多元件可供下載,而且有中文說明
|
mymj
版主 發表:132 回覆:486 積分:608 註冊:2002-10-25 發送簡訊給我 |
補充說明ASYNC32安裝方法
1.下載ASYNC32.ZIP
2.解壓縮產生ASYNC32.EXE
3.執行ASYNC32.EXE選擇所要安裝位置
4.產生LIB3 LIB4 LIB5 EXAMPLES HELP等目錄
5.DELPHI 5 安裝Vacomm5 DELPHI 4 安裝Vacomm4
6.啟動DELPHI 5 後 FILE/OPEN 選到剛剛ASYNC32/LIB5安裝的目錄選Vacomm5.dpk 開啟後會彈出一個抬頭為"package-vacomm5.dpk"的小視窗
7.按下install 會彈出對話框,回答"確定"
8.安裝完畢在零件版面會增加一個"varian Async32"的選擇標籤,此時只要再執行下一步驟,就大功告成
9.選tools/environment會出現一個environment options的對話框,選擇library
的路徑
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
多謝高手門的回應!我以安裝Comport Library元件組,但是還是有問題!
因8051所傳進來的信號是ASCII碼,當我用OnRxChar如下:
VAR str:sttring;
begin
ComPort.ReadStr(Str, Count);
Memo.Text := Memo.Text Str;
end; 所顯示出是亂碼,我轉到文字檔,用Lister以16進位觀看,ASCII 是 00時都忽略了
如輸入信號是:14 16 07 00 00 00 14 16
而頡取信號是:14 16 07 14 16
所有00時都忽略了,我想當ASCII 是 00 時是NULL值,轉到STR時都忽略了,請求知道解決方法的高手指導! 何明昌
------
何明昌 |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
何先生您好, 您所讀進來的str
需要經過轉換才能放置在memo顯示出來
var s:string; s1:string; i:Integer; begin Comport1.ReadStr(s,count); s1:=''; for i:=1 to count do s1:=s1 ' ' IntToHex(Ord(s[i]),2); Memo1.Lines.Add(s1); end;另外NULL值的問題, 可藉由更改DiscardNull屬性值為False 來決定是否忽略null值(Ascii為0) |
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
l630521
資深會員 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
l630521
資深會員 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
曾先生:您好!
貼上程式碼,麻煩您看看,當8051不斷送資料時,只要一按Button_Open鍵就當機,我只有變通辦法,改按SpeedButton1存文字檔後關閉程式,才不至當機,總之當8051正在送資料時,不能執行ComPort.Close就是。
var
Form1: TForm1;
j,k:integer;
implementation {$R *.DFM}
procedure TForm1.Button_OpenClick(Sender: TObject);
begin
if ComPort.Connected then
ComPort.Close
else
ComPort.Open;
Memo.Lines.Clear;
j:=0;k:=0;
end; procedure TForm1.ComPortOpen(Sender: TObject);
begin
Button_Open.Caption := 'DisConnect';
end; procedure TForm1.ComPortClose(Sender: TObject);
begin
if Button_Open <> nil then
Button_Open.Caption := 'Connect';
end; procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
s:string;
s1,s2:string;
i:Integer;
begin
Comport.ReadStr(s,count);
s1:=''; for i:=1 to count do
begin
s1:=s1 ' ' IntToHex(Ord(s[i]),2);
{ 14 4F 00 00
00 07 16 12}
if length(s1) >= 12 then //14 4F 00 00 (12BYTE 換行)
begin
Memo.Lines.Add(s1);
inc(j);
s1:='';
Label7.Caption :=inttostr(Memo.Lines.Count);
application.ProcessMessages;
end;
end;
if (Memo.Lines.Count =1500) or(SpeedButton1.Down) then
begin
Button1Click(nil);
//close;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
i,j,n : integer;
cFileName:string;
begin
Screen.Cursor := crDefault;
SaveDialog1.filter:= 'Text Files|*.txt|All Files|*.*';
SaveDialog1.DefaultExt := 'txt';
//SaveDialog1.InitialDir := EditDir.Text ;
SaveDialog1.FileName := 'Temp1.txt';
if SaveDialog1.Execute then
begin
n:=Memo.Lines.Count;
cFileName:= SaveDialog1.FileName;
AssignFile(F,cFileName);
Rewrite(F);
for i:=0 to n do
Writeln(F,Memo.Lines[i]); Flush(F);
CloseFile(F);
end;
close;
end; 何明昌
------
何明昌 |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |