亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? exportfrm.pas

?? 單片機典型系統設計實例精講 第4章 PC機與數控機床通信系統
?? PAS
字號:
{
=====================================================================
* 軟件名稱:PC與數控機床通信程序
* 單元名稱:發送數據到數控機床
* 單元作者:彭為 (pwzyp@fjsm.net)
* 備    注:用到了線程進行發送
* 開發平臺:PWin2000 SERVER + Delphi 7.0
* 兼容測試:PWin9X/2000/XP + Delphi 6/7
* 采用控件:Raize 3.12 ,SPCOMM
* 修改記錄:V1.0  by pengwei
=====================================================================
}
unit ExportFrm; //本單元用來發送數據

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, RzTabs, RzButton, StdCtrls, RzLabel, RzBorder,
  Grids, ValEdit, RzPrgres, ScktComp, SPComm, DB, ADODB;
type
  TExportData = class(TForm)
    Panel1: TPanel;
    pgcMain: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    Image1: TImage;
    Panel2: TPanel;
    btnFinish: TRzBitBtn;
    btnNext: TRzBitBtn;
    btnPrior: TRzBitBtn;
    RzLabel1: TRzLabel;
    RzLabel2: TRzLabel;
    RzLabel3: TRzLabel;
    Image2: TImage;
    RzBorder1: TRzBorder;
    RzLabel4: TRzLabel;
    RzLabel5: TRzLabel;
    RzLabel6: TRzLabel;
    edtUser: TEdit;
    edtMemo: TEdit;
    TabSheet3: TRzTabSheet;
    Image4: TImage;
    RzLabel12: TRzLabel;
    RzBorder3: TRzBorder;
    Lbl1: TRzLabel;
    Lbl2: TRzLabel;
    Lbl3: TRzLabel;
    pgb1: TRzProgressBar;
    Lbl4: TRzLabel;
    LblErr: TRzLabel;
    Lbl5: TRzLabel;
    RzLabel7: TRzLabel;
    RzLabel8: TRzLabel;
    cboChannel: TComboBox;
    RzBorder4: TRzBorder;
    RzLabel9: TRzLabel;
    cboComm: TComboBox;
    Comm1: TComm;
    Query: TADOQuery;
    LblCommErr: TRzLabel;
    procedure FormCreate(Sender: TObject); //界面初始化代碼
    procedure btnNextClick(Sender: TObject); //“下一步”按鈕點擊事件
    procedure btnPriorClick(Sender: TObject); //“上一步”按鈕點擊事件
    procedure btnFinishClick(Sender: TObject); //“完成”按鈕點擊事件
    procedure cboChannelEnter(Sender: TObject); //用戶改變“設備”的事件
    procedure FormDestroy(Sender: TObject); //銷毀對象時執行
    procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal); //SPCOMM接收數據錯誤事件
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word); //SPCOMM接收數據事件(很關鍵)
    procedure FormShow(Sender: TObject);
  private
    Fid: Integer; //局部變量存放ID
    Channel: Integer; //
    SendText: Tstrings; //發送的內容(數據機床命令,存在TSTRINGS對象中)
    { Private declarations }
  public
    bStart: Boolean; //是否已開始發送標志(用于線程與主界面同步)
    TickCount: Longword; //機床號
    procedure showForm(const id: integer);
    constructor Create(const id: Integer); reintroduce; overload;
    { Public declarations }
  end;
  //發送數據的線程,系統啟動發送后,其它的回復等由該線程進行

  TSendThread = class(TThread)
  private
    Pos, Len: LongWord; //當前位置,總長度
    CurrChar: Char; // 當前發送的字符
    FSendText: string; //全部長度
    procedure Ok; //發送完成后執行的過程
    procedure Percent; //顯示百分比過程
  public
    constructor Create(SendText: string); //線程的構造過程
    procedure Execute; override; //線程的執行體
  end;

var
  ExportData: TExportData;
  SendThread: TSendThread;

implementation

uses Include, Mainfrm, ConfigFrm;

{$R *.dfm}

procedure TExportData.FormCreate(Sender: TObject);
begin
  Caption := sExportCaption; //sExportCaption是窗口名'發送數據至數控機床'
  SendText := TStringlist.Create; //構造臨時變量

end;

procedure TExportData.btnNextClick(Sender: TObject);
var
  FileName, sTemp: string;
  BeginChar: Byte; //初始標志位
  BeginChannel: array[1..2] of Byte; //2位字節數組
begin
  case pgcmain.activepageindex of
    0: //如果是第一頁
      begin
        //初始化第二頁的控件
        //清空機床的列表框
        cboChannel.Clear;
        cboChannel.Items := Config.ChannelList;
        //從數據庫中查詢出要發送的文件的內容
        with Query do
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select * from Data where id=' + IntToStr(Fid));
          Open;
          FileName := FieldByName('filename').AsString;
          if FileExists(FileName) then //如果文件存在的話
          begin
            Application.ProcessMessages;
            SendText.LoadFromFile(FileName);
            //如果內容是空的
            if Trim(SendText.Text) = '' then
            begin
              MessageBox(Self.Handle, PChar(sFileEmpty), PChar(sTitleErr), MB_OK
                +
                MB_ICONERROR);
              exit;
            end;
          end
          else
          begin //如果文件不存在
            MessageBox(Self.Handle, PChar(sNotFile), PChar(sTitleErr), MB_OK +
              MB_ICONERROR);
            exit;
          end;
          //初始化必要的信息
          edtUser.Text := FieldByName('Author').AsString;
          edtMemo.Text := FieldByName('sMemo').AsString;
          Channel := FieldByName('Channel').AsInteger;
          cboChannel.ItemIndex := Channel - 1;
          cboComm.ItemIndex := cboComm.Items.IndexOf(Config.CommName);
          Close;
        end;
        LblCommErr.Visible := False;
      end;
    1: //如果是第二頁
      begin
        //初始化發送前的準備工作
        Config.CommName := cboComm.Text; //串口
        Channel := cboChannel.ItemIndex + 1; //機床號

        //啟動SPCOMM控件COMM1
        Comm1.CommName := Config.CommName;
        //先關閉
        Comm1.StopComm;
        try
          //再打開
          Comm1.StartComm;
        except
          //捕獲異常
          LblCommErr.Visible := True;
          Exit;
        end;
        //起始字節為01,具體請參看通訊協議
        BeginChar := 01;
        //把機床號變成2位的ASCII碼
        sTemp := Format('%.2d', [channel]);
        //把它的ASCII值送到臨時數組中去
        BeginChannel[1] := Ord(sTemp[1]);
        BeginChannel[2] := Ord(sTemp[2]);

        //        ShowMessage(Format('%x %x %x', [beginchar[1], beginchar[2],beginchar[3]]));
        Sleep(100); //如果不休眠100毫秒,可能會發生錯誤,因為打開串口需要時間,以下類同
        Comm1.WriteCommData(@BeginChar, 1); //用SPCOMM往端口發送啟始位01H
        Sleep(100);
        Comm1.WriteCommData(@BeginChannel, 2); //用SPCOMM發送機床號(選床)

        //開始發送正式的數據標志置FALSE
        bStart := False;

        //界面代碼,使界面上的字變粗顯示表示當前進度
        Lbl1.Font.Style := [fsBold];
        Lbl2.Font.Style := [fsBold];
        Lbl3.Font.Style := [];
        Lbl4.Font.Style := [];
        Lbl5.Visible := False;
        LblErr.Visible := False;
        pgb1.Percent := 0;
      end;
  else
    ;
  end;
  //轉下一頁
  pgcMain.ActivePageIndex := pgcMain.ActivePageIndex + 1;
  btnPrior.Enabled := True;
  if pgcMain.ActivePageIndex = pgcMain.PageCount - 1 then
    btnNext.Enabled := False;
end;

procedure TExportData.btnPriorClick(Sender: TObject);
begin
  //轉前一頁
  pgcMain.ActivePageIndex := pgcMain.ActivePageIndex - 1;
  btnNext.Enabled := True;
  if pgcMain.ActivePageIndex = 0 then
    btnPrior.Enabled := False;
end;

procedure TExportData.showForm(const id: integer);
begin
  //顯示窗體的函數(實際調用時用本函數即可)
  if ExportData = nil then
    ExportData := TExportData.Create(id);
  ExportData.ShowModal;
end;

procedure TExportData.btnFinishClick(Sender: TObject);
begin
  //點擊了完成 或取消
  if bStart then
  begin
    // 如果正在發送,則關閉線程
    bStart := False;
    SendThread.Terminate;
    //中斷發送數據線程
  end;
  //關閉串口
  Comm1.StopComm;
  Close;
end;

procedure TExportData.cboChannelEnter(Sender: TObject);
begin
  LblCommErr.Visible := False;
end;

procedure TExportData.FormDestroy(Sender: TObject);
begin
  //釋放內存
  SendText.Free;
end;

procedure TExportData.Comm1ReceiveError(Sender: TObject;
  EventMask: Cardinal);
begin
  LblErr.Caption := '串口接收數據出現錯誤';
  LblErr.Visible := True;
end;

procedure TExportData.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  ReceivedBuf: array of Byte;
  stemp: string;
  BeginChar: array[1..2] of Byte;
  SendChar: Byte;
  i: Integer;
begin
  SetLength(ReceivedBuf, BufferLength);
  try
    //把接收到的字符放入BUFFER
    Move(Buffer^, Pchar(@ReceivedBuf[0])^, BufferLength);
  except
    ShowMsg(sErrReceive1);
    exit;
  end;
  if not bStart then
  begin //尚未開始,根據協議,接收到的應該就是具體的機床號與前面的機床號相同
    stemp := Format('%.2d', [Channel]);
    BeginChar[1] := Ord(sTemp[1]);
    BeginChar[2] := Ord(sTemp[2]);

    if ((ReceivedBuf[0] = BeginChar[1]) and (ReceivedBuf[1] = BeginChar[2])) then
    begin //床號正確//開始回發床號,并發數據 置start為True
      //根據協議,02H為發送數據的功能
      SendChar := 02;
      Comm1.WriteCommData(@SendChar, 1);
      bstart := True;
      //發數據
      Lbl3.Font.Style := [fsBold];
      pgb1.Percent := 0;
      //啟動數據發送線程
      SendThread := TSendThread.Create(SendText.Text);
    end
    else
    begin //床號不正確,顯示錯誤并返回
      LblErr.Caption := '設備號選擇出錯!';
      LblErr.Visible := True;
    end;
  end
  else
    //其它情況正在正在發送,檢測是否是07H(錯誤)
    //設置停止標志終止線程的發送
    for i := 0 to BufferLength - 1 do
    begin
      if ReceivedBuf[i] = $07 then
      begin
        bStart := false;
        SendThread.Terminate;

        LblErr.Caption := '數控機床設備返回錯誤信息,終止發送!';
        LblErr.Visible := True;
        Exit;
      end
      else if ReceivedBuf[i] = $17 then //完成了
      begin
        bStart := False;
        pgb1.Percent := 100;
        Lbl4.Font.Style := [fsbold];
        Lbl5.Caption := '花費時間:' + IntToStr(GetTickCount - TickCount) +
          '毫秒';
        btnFinish.Caption := '完成';
        Exit;
      end;
    end;
end;

{ TSendThread }

constructor TSendThread.Create(SendText: string);
begin
  //線程的構造線程
  FSendText := Copy(SendText, 1, Length(SendText) - 2);
  inherited Create(False);
end;

procedure TSendThread.Execute;
var
  isSend: Boolean;
begin
  FreeOnTerminate := True; //控制線程空閑時自動中斷
  ExportData.TickCount := GetTickCount; //時間戳(用來計算發送時間)

  if not TestEOF(FSendText) then //如果沒有結束符加入結束符
    //TESTEOF的函數在INCLUDE單元中定義,請查看所有源代碼
    FSendText := FSendText + Chr(26);

  //開始發送之前記載發送的總長度
  Len := Length(FSendtext);
  //當前位置是第一個字符
  Pos := 1;
  //當發送數據未完而且主窗口的bstart為True則發送(如果主界面要取消,只要置bstart為false即可)
  while (Pos <= Len) and ExportData.bstart do
  begin
    //檢查是否發送該字節
    isSend := True;
    CurrChar := FSendText[pos];
    case CurrChar of
      'a'..'z': CurrChar := UpperCase(CurrChar)[1];
      'A'..'Z', '0'..'9', '+', '-', '/', '.', Chr(26), '%', Chr(00), Chr($0A): ;
    else
      isSend := False;
    end;

    if isSend then
    begin
      //暫停若干秒
      Sleep(Config.Delaytime);
      //發送
      ExportData.Comm1.WriteCommData(@CurrChar, 1);
    end;
    //當前位置增量
    Inc(Pos);
    //線程調用函數輸出進度信息
    Synchronize(Percent);
  end;
  //如果發送完了
  if Pos = Len + 1 then
  begin
    CurrChar := Chr($17);
    Sleep(100);
    //輸出結束標志17H,參看通訊協議
    ExportData.Comm1.WriteCommData(@CurrChar, 1);
    Synchronize(ok);
  end;
  //  Self.Terminate;
  //  PostMessage(Application.Handle, WM_QUIT, 0, 0); ;
end;

procedure TSendThread.Ok;
begin
  ExportData.pgb1.Percent := 100;
  ExportData.Lbl4.Font.Style := [fsbold];
  ExportData.Lbl5.Visible := True;
  ExportData.Lbl5.Caption := '花費時間:' + IntToStr(GetTickCount -
    ExportData.TickCount) +
    '毫秒';
  ExportData.btnFinish.Caption := '完成';
  ExportData.bstart := False;
end;

procedure TSendThread.Percent;
begin
  ExportData.pgb1.Percent := trunc((Pos / Len) * 100);
end;

procedure TExportData.FormShow(Sender: TObject);
begin
  //顯示窗體時初始化
  pgcMain.ActivePageIndex := 0;
  btnPrior.Enabled := False;
  btnNext.Enabled := True;
  btnFinish.Caption := '取消';
  Comm1.StopComm;

  SendText.Clear;
end;

constructor TExportData.Create(const id: Integer);
begin
  inherited Create(Application);
  Fid := id;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va国产天堂va久久en| 色诱亚洲精品久久久久久| av电影一区二区| 欧美在线不卡一区| 国产精品久久看| 久久99国产精品久久99 | 欧美一区二区二区| 中文字幕日韩一区二区| 国内精品嫩模私拍在线| 欧美日韩国产欧美日美国产精品| 国产欧美精品国产国产专区 | 日韩欧美亚洲另类制服综合在线| 中文字幕成人网| 韩国三级在线一区| 日韩亚洲欧美一区二区三区| 亚洲欧美日韩国产中文在线| 99久久亚洲一区二区三区青草| 日韩精品一区二区三区视频在线观看| 亚洲精品成人少妇| 91蜜桃婷婷狠狠久久综合9色| 亚洲精品视频免费观看| 国产成人av福利| 精品国产一二三| 国产综合久久久久久鬼色| 日韩一区二区免费在线电影| 日本不卡免费在线视频| 4438x亚洲最大成人网| 亚洲一级二级三级| 欧美日韩精品欧美日韩精品| 亚洲欧美经典视频| 一本久久精品一区二区| 亚洲欧洲综合另类| 91高清视频在线| 一区二区三区中文在线观看| 91在线视频播放| 亚洲电影中文字幕在线观看| 欧美日韩电影一区| 日韩**一区毛片| 日韩免费视频一区| 国产高清久久久| 中文字幕综合网| 欧美日韩免费电影| 精品在线一区二区三区| 久久久蜜桃精品| 99久久综合国产精品| 亚洲日本韩国一区| 欧美日韩一二三| 国产综合色在线| 最新国产精品久久精品| 欧美日韩不卡在线| 国产精品一区二区久久不卡| 国产精品美女www爽爽爽| 欧洲亚洲精品在线| 理论片日本一区| 亚洲欧洲美洲综合色网| 欧美日精品一区视频| 老司机午夜精品| 中文字幕视频一区| 91精品啪在线观看国产60岁| 国产乱人伦偷精品视频不卡| 中文字幕日韩一区| 91精品欧美久久久久久动漫| 激情文学综合网| 亚洲与欧洲av电影| 日韩一区二区影院| 97久久超碰国产精品| 日本亚洲视频在线| 亚洲三级在线免费| 精品久久久久久久久久久久久久久| 粉嫩av一区二区三区| 视频在线观看一区| 国产精品毛片大码女人| 日韩亚洲欧美在线观看| 91视频国产观看| 国产精品资源网站| 午夜一区二区三区视频| 26uuu另类欧美亚洲曰本| 欧美视频完全免费看| 成人免费视频一区| 日本vs亚洲vs韩国一区三区 | 欧美不卡在线视频| 91色|porny| 国产精品18久久久| 日韩av一区二| 亚洲国产精品自拍| 日韩一区在线看| 久久亚洲精精品中文字幕早川悠里 | 奇米色一区二区| 亚洲精选一二三| 国产精品少妇自拍| 国产日韩欧美高清在线| 日韩欧美国产不卡| 777亚洲妇女| 欧美性色黄大片| 色哟哟一区二区在线观看| 国产毛片精品视频| 国产资源精品在线观看| 免费成人你懂的| 日韩电影在线一区| 亚洲动漫第一页| 亚洲国产成人va在线观看天堂| 国产精品久久久久久亚洲毛片 | 亚洲国产成人av网| 亚洲尤物视频在线| 亚洲黄色性网站| 亚洲与欧洲av电影| 亚洲一区二区高清| 亚洲成人在线免费| 99久久精品免费看| 成人国产视频在线观看| 国产91精品一区二区| 成人免费看视频| 99视频精品免费视频| 99re这里都是精品| 色综合天天综合网天天狠天天| 99久久精品国产麻豆演员表| 成人h动漫精品一区二区| youjizz久久| 99精品视频在线播放观看| 91在线看国产| 色视频欧美一区二区三区| 欧美在线综合视频| 欧美精品久久久久久久多人混战 | 99在线精品观看| 色偷偷久久人人79超碰人人澡| 99re热这里只有精品视频| 色噜噜狠狠成人网p站| 欧美私人免费视频| 4438x亚洲最大成人网| 亚洲精品在线三区| 国产精品热久久久久夜色精品三区| 国产精品久久久久久久久免费桃花| 1000精品久久久久久久久| 亚洲电影在线免费观看| 久久成人麻豆午夜电影| 大胆亚洲人体视频| 欧美性高清videossexo| 日韩精品一区二区三区视频播放 | 国产成人精品综合在线观看 | 成人国产精品免费观看| 91福利国产成人精品照片| 欧美日韩久久久| 久久午夜电影网| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲成人福利片| 高清视频一区二区| 欧美日韩国产另类一区| 欧美xxxx在线观看| 一区二区视频免费在线观看| 日本三级亚洲精品| 99精品视频中文字幕| 91精品国产91久久久久久一区二区| 久久精品综合网| 亚洲一线二线三线视频| 加勒比av一区二区| 欧美三级电影一区| 国产精品美女久久久久久久| 日精品一区二区| 91蜜桃视频在线| 国产丝袜欧美中文另类| 亚洲va欧美va天堂v国产综合| 国产99久久久国产精品| 欧美一区欧美二区| 亚洲黄色av一区| 国产aⅴ综合色| 日韩精品一区二区三区在线| 亚洲久草在线视频| 成人av在线播放网址| 日韩欧美中文字幕公布| 亚洲一区二区在线免费观看视频| 国产精品中文字幕日韩精品| 欧洲国内综合视频| 最新成人av在线| 国产成人在线电影| 精品少妇一区二区三区日产乱码| 亚洲国产aⅴ天堂久久| 欧美成人精品二区三区99精品| 亚洲最新在线观看| av一区二区三区四区| 久久久www成人免费无遮挡大片| 爽好久久久欧美精品| 欧美日韩三级在线| 亚洲一区二区三区四区五区黄| 波多野结衣中文字幕一区二区三区| 日韩免费在线观看| 看电影不卡的网站| 日韩欧美一二区| 麻豆91精品视频| 91精品国产高清一区二区三区蜜臀 | 不卡的av网站| 国产精品网站在线| 国产aⅴ精品一区二区三区色成熟| xnxx国产精品| 国产在线不卡视频| 国产日韩欧美一区二区三区综合| 紧缚捆绑精品一区二区| 2020国产精品自拍| 国产伦精品一区二区三区在线观看| 欧美一级片在线看| 韩国精品在线观看|