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

相关文章

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮