1. 程式人生 > >Lazarus實戰開發之串列埠通訊(WINCE/WIN32)

Lazarus實戰開發之串列埠通訊(WINCE/WIN32)

本文來自 http://blog.csdn.net/hellogv/ ,轉載必須註明出處!
以下程式碼可到:http://download.csdn.net/source/611385 下載
    Lazarus最吸引人的地方就是她的開發方式類似Delphi,支援超好用的RAD開發方式,並且最厲害的地方是她還支援多個平臺,多個CPU,例如ARM9的WINCE。

    本文要講述的就是“如何使用LAZARUS開發Wince上的串列埠程式”,並且,本文的串列埠程式同時支援WINCE和WINXP系統,當然編譯時要選擇平臺啦。WINCE與WINXP在本文中的程式碼區別只是OpenPort('COM1:',CBR_9600,8,NOPARITY,ONESTOPBIT);
//wince用COM1:表示串列埠1;WINXP用COM1表示串列埠1.

一、建立一個可重用的類,檔名為CE_Series.pas
  1. unit CE_Series;
  2. interface
  3. uses
  4.   Windows,Classes, SysUtils, LResources, StdCtrls,ExtCtrls;
  5. type
  6.   TCE_Series = class(TObject)
  7. private
  8.     hComm: THandle;
  9. public
  10.     Function OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
  11. procedure Send(str:String);
  12.     Function Receive():String;
  13. procedure ClosePort();
  14. end;
  15. implementation
  16. //===============================================================================================
  17. // 語法格式:OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer)
  18. // 實現功能:開啟串列埠
  19. // 引數:port,串列埠號;例如wince下為從COM1:,COM2:.....win32下為COM1,COM2....... ;其他略,顧名思義哈
  20. // 返回值:錯誤資訊
  21. //===============================================================================================
  22. function TCE_Series.OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
  23. var
  24.   cc:TCOMMCONFIG;
  25. begin
  26.   result:='';
  27.   hComm:=CreateFile(port, GENERIC_READ or GENERIC_WRITE,
  28. 0nil, OPEN_EXISTING, 00); // 開啟COM
  29. if (hComm = INVALID_HANDLE_VALUE) thenbegin// 如果COM 未開啟
  30.     result:='CreateFile Error!';
  31.     exit;
  32. end;
  33.   GetCommState(hComm,cc.dcb); // 得知目前COM 的狀態
  34.   cc.dcb.BaudRate:=BaudRate; // 設定波特率為BaudRate
  35.   cc.dcb.ByteSize:=ByteSize;  // 位元組為 ByteSize(8 bit)
  36.   cc.dcb.Parity:=Parity; // Parity 為 None
  37.   cc.dcb.StopBits:=StopBits; // 1 個Stop bit
  38. ifnot SetCommState(hComm, cc.dcb) thenbegin// 設定COM 的狀態
  39.     result:='SetCommState Error!';
  40.     CloseHandle(hComm);
  41.     exit;
  42. end;
  43. end;
  44. //===============================================================================================
  45. // 語法格式:Send(str:String)
  46. // 實現功能:傳送資料
  47. // 引數:str,資料
  48. // 返回值:無
  49. //===============================================================================================
  50. procedure TCE_Series.Send(str:String);
  51. var
  52.   lrc:LongWord;
  53. begin
  54. if (hComm=0then exit; //檢查Handle值
  55.   WriteFile(hComm,str,Length(str), lrc, nil); // 送出資料
  56. end;
  57. //=====================================================================
  58. //語法格式: Receive()
  59. //實現功能: 接收串列埠資料
  60. //引數:     無
  61. //返回值:   收到的字串
  62. //=====================================================================
  63. Function TCE_Series.Receive():String;
  64. var
  65.   inbuff: array[0..2047of Char;
  66.   nBytesRead, dwError:LongWORD ;
  67.   cs:TCOMSTAT;
  68. begin
  69.    ClearCommError(hComm,dwError,@CS);  //取得狀態
  70. // 資料是否大於我們所準備的Buffer
  71. if cs.cbInQue > sizeof(inbuff) thenbegin
  72.      PurgeComm(hComm, PURGE_RXCLEAR);  // 清除COM 資料
  73.      exit;
  74. end;
  75.    ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的資料
  76. //轉移資料到變數中
  77.    result:=Copy(inbuff,1,cs.cbInQue);//返回資料
  78. end;                             
  79. //=====================================================================
  80. //語法格式: ClosePort()
  81. //實現功能:關閉串列埠
  82. //引數:  無
  83. //返回值:  無
  84. //=====================================================================
  85. procedure TCE_Series.ClosePort();
  86. begin
  87.    SetCommMask(hcomm,$0);
  88.    CloseHandle(hComm);
  89. end;
  90. end.
二、寫呼叫程式演示如何使用這個類,請自行加入控制元件,所用的控制元件不多:
  1. unit Unit1; 
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5.   Windows,Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,ExtCtrls
  6.   ,CE_Series;
  7. type
  8. { TForm1 }
  9.   TForm1 = class(TForm)
  10.     btn_OpenPort: TButton;
  11.     btn_ClosePort: TButton;
  12.     btn_Send: TButton;
  13.     edt_Receive: TMemo;
  14.     GroupBox1: TGroupBox;
  15.     edt_Send: TMemo;
  16.     GroupBox2: TGroupBox;
  17.     Timer1: TTimer;
  18. procedure btn_ClosePortClick(Sender: TObject);
  19. procedure btn_OpenPortClick(Sender: TObject);
  20. procedure btn_SendClick(Sender: TObject);
  21. procedure Timer1Timer(Sender: TObject);
  22. private
  23. { private declarations }
  24. public
  25. { public declarations }
  26. end
  27. var
  28.   Form1: TForm1; 
  29.   myseries:TCE_Series;
  30. implementation
  31. { TForm1 }
  32. procedure TForm1.btn_OpenPortClick(Sender: TObject);
  33. begin
  34.   myseries:=TCE_Series.Create;
  35.   myseries.OpenPort('COM1:',CBR_9600,8,NOPARITY,ONESTOPBIT);
  36.   Timer1.Enabled:=true;
  37. end;
  38. procedure TForm1.btn_SendClick(Sender: TObject);
  39. begin
  40.   myseries.Send(edt_Send.Text);
  41. end;
  42. procedure TForm1.Timer1Timer(Sender: TObject); //用Timer定時接收資料
  43. var
  44.   receive:string;
  45. begin
  46.    receive:=myseries.Receive();
  47. if receive<>''then
  48. begin
  49.       edt_Receive.Lines.Add(receive);   // 將資料顯示於edt_Receive 上
  50. end;
  51. end;
  52. procedure TForm1.btn_ClosePortClick(Sender: TObject);
  53. begin
  54.    Timer1.Enabled:=false;
  55.    myseries.ClosePort();
  56.    close;
  57. end;
  58. initialization
  59. {$I unit1.lrs}
  60. end.