Lazarus实战开发之串口通信(WINCE/WIN32)

2024-02-14 07:38

本文主要是介绍Lazarus实战开发之串口通信(WINCE/WIN32),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.  
   6.
   7. type
   8.   TCE_Series = class(TObject)
   9.  
  10.   private
  11.     hComm: THandle;
  12.   public
  13.     Function OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
  14.     procedure Send(str:String);
  15.     Function Receive():String;
  16.     procedure ClosePort();
  17.   end;
  18.
  19.
  20. implementation
  21.
  22.
  23. //===============================================================================================
  24. // 语法格式:OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer)
  25. // 实现功能:打开串口
  26. // 参数:port,串口号;例如wince下为从COM1:,COM2:.....win32下为COM1,COM2....... ;其他略,顾名思义哈
  27. // 返回值:错误信息
  28. //===============================================================================================
  29. function TCE_Series.OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
  30. var
  31.   cc:TCOMMCONFIG;
  32. begin
  33.   result:='';
  34.   hComm:=CreateFile(port, GENERIC_READ or GENERIC_WRITE,
  35.        0, nil, OPEN_EXISTING, 0, 0); // 打开COM
  36.   if (hComm = INVALID_HANDLE_VALUE) then begin  // 如果COM 未打开
  37.     result:='CreateFile Error!';
  38.     exit;
  39.   end;
  40.
  41.   GetCommState(hComm,cc.dcb); // 得知目前COM 的状态
  42.   cc.dcb.BaudRate:=BaudRate; // 设置波特率为BaudRate
  43.   cc.dcb.ByteSize:=ByteSize;  // 字节为 ByteSize(8 bit)
  44.   cc.dcb.Parity:=Parity; // Parity 为 None
  45.   cc.dcb.StopBits:=StopBits; // 1 个Stop bit
  46.  
  47.   if not SetCommState(hComm, cc.dcb) then begin// 设置COM 的状态
  48.     result:='SetCommState Error!';
  49.     CloseHandle(hComm);
  50.     exit;
  51.   end;
  52. end;
  53.
  54. //===============================================================================================
  55. // 语法格式:Send(str:String)
  56. // 实现功能:发送数据
  57. // 参数:str,数据
  58. // 返回值:无
  59. //===============================================================================================
  60. procedure TCE_Series.Send(str:String);
  61. var
  62.   lrc:LongWord;
  63. begin
  64.   if (hComm=0) then exit; //检查Handle值
  65.   WriteFile(hComm,str,Length(str), lrc, nil); // 送出数据
  66. end;
  67.
  68.
  69. //=====================================================================
  70. //语法格式: Receive()
  71. //实现功能: 接收串口数据
  72. //参数:     无
  73. //返回值:   收到的字符串
  74. //=====================================================================
  75. Function TCE_Series.Receive():String;
  76. var
  77.   inbuff: array[0..2047] of Char;
  78.   nBytesRead, dwError:LongWORD ;
  79.   cs:TCOMSTAT;
  80. begin
  81.    ClearCommError(hComm,dwError,@CS);  //取得状态
  82.        // 数据是否大于我们所准备的Buffer
  83.    if cs.cbInQue > sizeof(inbuff) then begin
  84.      PurgeComm(hComm, PURGE_RXCLEAR);  // 清除COM 数据
  85.      exit;
  86.    end;
  87.    ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
  88.    //转移数据到变量中
  89.    result:=Copy(inbuff,1,cs.cbInQue);//返回数据
  90. end;                            
  91.
  92.
  93. //=====================================================================
  94. //语法格式: ClosePort()
  95. //实现功能:关闭串口
  96. //参数:  无
  97. //返回值:  无
  98. //=====================================================================
  99. procedure TCE_Series.ClosePort();
 100. begin
 101.    SetCommMask(hcomm,$0);
 102.    CloseHandle(hComm);
 103. end;
 104.
 105.
 106. end.

二、写调用程序演示如何使用这个类,请自行加入控件,所用的控件不多:
   1. unit Unit1;
   2.
   3. {$mode objfpc}{$H+}
   4.
   5. interface
   6.
   7. uses
   8.   Windows,Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,ExtCtrls
   9.   ,CE_Series;
  10.
  11. type
  12.
  13.   { TForm1 }
  14.
  15.   TForm1 = class(TForm)
  16.     btn_OpenPort: TButton;
  17.     btn_ClosePort: TButton;
  18.     btn_Send: TButton;
  19.     edt_Receive: TMemo;
  20.     GroupBox1: TGroupBox;
  21.     edt_Send: TMemo;
  22.     GroupBox2: TGroupBox;
  23.     Timer1: TTimer;
  24.     procedure btn_ClosePortClick(Sender: TObject);
  25.     procedure btn_OpenPortClick(Sender: TObject);
  26.     procedure btn_SendClick(Sender: TObject);
  27.     procedure Timer1Timer(Sender: TObject);
  28.   private
  29.     { private declarations }
  30.   public
  31.     { public declarations }
  32.   end;
  33.
  34. var
  35.   Form1: TForm1;
  36.   myseries:TCE_Series;
  37.  
  38. implementation
  39.
  40. { TForm1 }
  41.
  42. procedure TForm1.btn_OpenPortClick(Sender: TObject);
  43. begin
  44.   myseries:=TCE_Series.Create;
  45.   myseries.OpenPort('COM1:',CBR_9600,8,NOPARITY,ONESTOPBIT);
  46.   Timer1.Enabled:=true;
  47. end;
  48.
  49. procedure TForm1.btn_SendClick(Sender: TObject);
  50. begin
  51.   myseries.Send(edt_Send.Text);
  52. end;
  53.
  54. procedure TForm1.Timer1Timer(Sender: TObject); //用Timer定时接收数据
  55. var
  56.   receive:string;
  57. begin
  58.    receive:=myseries.Receive();
  59.    if receive<>'' then
  60.    begin
  61.       edt_Receive.Lines.Add(receive);   // 将数据显示于edt_Receive 上
  62.    end;
  63. end;
  64.
  65. procedure TForm1.btn_ClosePortClick(Sender: TObject);
  66. begin
  67.    Timer1.Enabled:=false;
  68.    myseries.ClosePort();
  69.    close;
  70. end;
  71.
  72. initialization
  73.   {$I unit1.lrs}
  74.
  75. end.
  76.

这篇关于Lazarus实战开发之串口通信(WINCE/WIN32)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707886

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD