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

TCP/IP 與 RS232 連線傳輸資料問題

答題得分者是:hagar
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-13 14:51:51 IP:211.20.xxx.xxx 未訂閱
程式目的:達成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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-30 10:50:29 IP:211.20.xxx.xxx 未訂閱
此題無解嗎 可不可以請版主將這各問題改到難以歸究的討論區 =.= 分享比獲得更快樂--Juneo
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-30 19:15:29 IP:202.39.xxx.xxx 未訂閱
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= -- 歡迎光臨 KTop 研究院!
系統時間:2024-06-26 23:27:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!