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

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕