TCP/IP 與 RS232 連線傳輸資料問題 |
答題得分者是:hagar
|
juneo
高階會員 ![]() ![]() ![]() ![]() 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
程式目的:達成tcp/ip與rs-232 連線並且傳輸資料
說明:目前已經可以與server達成連線但是還有一些小問題,希望能夠將程式改成穩定並且能夠對沒有SERVER或SERVER沒回應的時候,程式不是卡住或當住,而是能夠回應給使用者知道,將問題歸類在下方,請知道的人幫幫忙
問題:
1.當Server 沒有開啟的時候(TCP與RS-232),連線會出現錯誤,希望能夠改成顯示出 沒有連線SERVER 的訊息
2.當程式一段時間沒有傳輸TCP/IP部分會自動斷線,除了持續傳送字串的方式以外,有其他方式可以持續連線嗎
3.tcp傳送出字串,但server回應空字串或沒有回應,我用這段程式來偵測buff有資料才去讀取出來,正常的時候可以讀取,但是有時候會判斷buff有資料但是讀取的時候卻會當住很久,有方法可以解決嗎
片段程式碼
While Client1.InputBuffer.Size>0 do Begin X:=Client1.ReadLn; //讀取tcp/ip傳回的數值 End;4.如果需要程式請留下E-Mail我會盡快傳給你 謝謝 以下是完整程式碼 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, SPComm, ExtCtrls; type TForm1 = class(TForm) PageControl1: TPageControl; RS232TS: TTabSheet; TCPTS: TTabSheet; Memo1: TMemo; Memo2: TMemo; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; Edit1: TEdit; Label3: TLabel; ComboBox1: TComboBox; ComboBox2: TComboBox; Button3: TButton; ComboBox3: TComboBox; ComboBox4: TComboBox; Button4: TButton; Edit2: TEdit; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Comm1: TComm; Client1: TIdTCPClient; Button5: TButton; RadioGroup1: TRadioGroup; RS232CHK: TRadioButton; TCPCHK: TRadioButton; procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure RS232CHKClick(Sender: TObject); procedure TCPCHKClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Com_State,com_tcp,com_user:boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; Memo2.Clear; com_state:=True; com_tcp:=True; TCPTS.TabVisible:=False; end; procedure TForm1.Button3Click(Sender: TObject); begin if Com_state Then //判斷目前狀態 begin //啟動連線 Client1.Disconnect; //關閉TCP/IP連線 Button4.Caption:='連線'; //控制tcp/ip連線狀態 Comm1.StopComm; Comm1.CommName:=ComboBox2.Text; Comm1.StartComm; Button3.Caption:='斷線'; Com_state:=False; Com_user:=True; //判斷發送命令是採用RS232(TRUE)或TCP/IP(Flase) End Else begin //關閉連線 Comm1.StopComm; Button3.Caption:='連線'; Com_state:=True; Com_user:=False; //判斷發送命令是採用RS232(TRUE)或TCP/IP(Flase) End; end; procedure TForm1.Button4Click(Sender: TObject); begin if Com_tcp Then //判斷目前狀態 begin //啟動連線 Comm1.StopComm; Button3.Caption:='連線'; //控制rs-232連線狀態 Client1.Disconnect; //關閉TCP/IP連線 Client1.Host:=ComboBox4.Text; Client1.Port:=StrToInt(Edit2.Text); Client1.Connect; Button4.Caption:='斷線'; Com_tcp:=False; Com_user:=False; //判斷發送命令是採用RS232(TRUE)或TCP/IP(Flase) End Else begin //關閉連線 Client1.Disconnect; //關閉TCP/IP連線 Button4.Caption:='連線'; Com_tcp:=True; Com_user:=True; //判斷發送命令是採用RS232(TRUE)或TCP/IP(Flase) End; end; procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); var S:string; begin SetLength(S,BufferLength); //接收RS232的數據並顯示Memo1上。 Move(Buffer^, PChar(S)^, BufferLength); Memo2.Lines.Add(S); Memo2.Invalidate; end; procedure TForm1.Button1Click(Sender: TObject); var S,X:string; begin try //尚未連線例外處理 If com_user Then Begin S:='@' ComboBox1.Text Edit1.Text Chr(13) Chr(10); //前置字元(@) 編號 指令 Chr(13) Chr(10) Comm1.WriteCommData(PChar(S),Length(S)); //寫入字串 Memo1.Lines.Add(S); Memo1.Invalidate; End Else Begin S:='@' ComboBox3.Text Edit1.Text Chr(13) Chr(10); //前置字元(@) 編號 指令 Chr(13) Chr(10) Client1.Write(s); //寫入字串 Client1.ReadFromStack(False,1,False); //判斷是否有回應資料如果沒有則不讀取傳回數值 While Client1.InputBuffer.Size>0 do Begin X:=Client1.ReadLn; //讀取tcp/ip傳回的數值 End; memo2.Lines.Add(X); memo2.Invalidate; Memo1.Lines.Add(S); End; except //尚未連線例外處理 showmessage('尚未連線,請先連線'); End; end; procedure TForm1.Button2Click(Sender: TObject); begin Close; //關閉程式 end; procedure TForm1.Button5Click(Sender: TObject); begin Memo1.Clear; Memo2.Clear; end; procedure TForm1.RS232CHKClick(Sender: TObject); begin RS232TS.TabVisible:=True; //設定選用的連線方式 TCPTS.TabVisible:=False; end; procedure TForm1.TCPCHKClick(Sender: TObject); begin RS232TS.TabVisible:=False; //設定選用的連線方式 TCPTS.TabVisible:=True; end; end.分享比獲得更快樂--Juneo |
juneo
高階會員 ![]() ![]() ![]() ![]() 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
1.用如下的方式來顯示自訂錯誤訊息試試:
begin try // 連線的動作 except on E: Exception do ShowMessage('與 Server 無法連線: ' E.Message); end; end;2.一段時間沒動作會自動斷線, 這個參考 japhenchen 大大的經驗談看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47549 3.參考這篇試試: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48716&ARCHIVE= -- ![]() |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |