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

相关文章

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

Redis 命令详解与实战案例

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统... 目录Redis 命令详解与实战案例一、Redis 基础介绍二、Redis 核心数据结构与命令1. 字符