51单片机-PASCAL语言实例10:用Lazarus开发串口应用程序

2023-10-14 17:10

本文主要是介绍51单片机-PASCAL语言实例10:用Lazarus开发串口应用程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实例9中,我是通过STC-ISP软件中串口助手调试单片机程序的,不太直观,能否在PC上用PASCAL写一个程序通过串口与单片机沟通呢。完全可以,可以用免费的开发环境LAZARUS开发,安装 lazSerial 后,进行快速开发。上位机和下位机,完全使用PASCAL开发,代码可以复用,非常方便。
在这里插入图片描述

// MainForm.pas
unit MainFrm;{$mode objfpc}{$H+}interfaceusesClasses, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,ComCtrls, LazSerial, LazSynaSer;type{ TMainForm }TMainForm = class(TForm)BtnOpen: TButton;BtnClose: TButton;BtnQuery: TButton;BtnCtrlSerial: TButton;CbbDev: TComboBox;CbbBaud: TComboBox;CbbCOM: TComboBox;Label1: TLabel;Label2: TLabel;LazSerial1: TLazSerial;MemInfo: TMemo;Shape1: TShape;StatusBar1: TStatusBar;procedure BtnCloseClick(Sender: TObject);procedure BtnCtrlSerialClick(Sender: TObject);procedure BtnOpenClick(Sender: TObject);procedure BtnQueryClick(Sender: TObject);procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);procedure LazSerial1RxData(Sender: TObject);privatepublicend;varMainForm: TMainForm;implementation{$R *.lfm}usesMyDef;{ TMainForm }procedure TMainForm.BtnCtrlSerialClick(Sender: TObject);
beginlazSerial1.BaudRate:=br__9600;lazSerial1.Device:=CbbCom.Text;trylazSerial1.Active:=Not lazSerial1.Active;exceptShowMessage('打开串口失败');end;if not lazSerial1.Active  then   BtnCtrlSerial.Caption:='打开串口'else   BtnCtrlSerial.Caption:='关闭串口';end;procedure TMainForm.BtnCloseClick(Sender: TObject);
beginTxFrame[1]:=CMD_BEGIN;TxFrame[2]:=CMD_CLOSE;TxFrame[3]:=DEV_LED1+CbbDev.ItemIndex;TxFrame[4]:=MyDef.GetCheck(TxFrame);lazSerial1.WriteBuffer(TxFrame,Sizeof(TxFrame));MemInfo.Lines.Add(IntToHex(TxFrame[1])+' '+IntToHex(TxFrame[2])+' '+IntToHex(TxFrame[3])+' '+IntToHex(TxFrame[4])+' : 请关闭设备$'+IntToHex(TxFrame[3]));
end;procedure TMainForm.BtnOpenClick(Sender: TObject);
beginTxFrame[1]:=CMD_BEGIN;TxFrame[2]:=CMD_OPEN;TxFrame[3]:=DEV_LED1+CbbDev.ItemIndex;TxFrame[4]:=MyDef.GetCheck(TxFrame);lazSerial1.WriteBuffer(TxFrame,Sizeof(TxFrame));MemInfo.Lines.Add(IntToHex(TxFrame[1])+' '+IntToHex(TxFrame[2])+' '+IntToHex(TxFrame[3])+' '+IntToHex(TxFrame[4])+' : 请开启设备$'+IntToHex(TxFrame[3]));
end;procedure TMainForm.BtnQueryClick(Sender: TObject);
beginTxFrame[1]:=CMD_BEGIN;TxFrame[2]:=CMD_QUERY;TxFrame[3]:=DEV_LED1 +CbbDev.ItemIndex;TxFrame[4]:=MyDef.GetCheck(TxFrame);lazSerial1.WriteBuffer(TxFrame,Sizeof(TxFrame));MemInfo.Lines.Add(IntToHex(TxFrame[1])+' '+IntToHex(TxFrame[2])+' '+IntToHex(TxFrame[3])+' '+IntToHex(TxFrame[4])+' : 请查设备$'+IntToHex(TxFrame[3])+'状态');
end;procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
beginlazSerial1.Close ;
end;procedure TMainForm.LazSerial1RxData(Sender: TObject);
varS,T:String;I:Integer;
beginS:=lazSerial1.ReadData;if Length(S)<>4 then exit;for I:=1 TO 4 do beginT:=T+IntToHex(Ord(S[I]),2)+' ';end;if Ord(S[2])=DEV_FM then T:=T+': 蜂鸣器'else T:=T+': LED '+ IntToStr((Ord(S[2])-DEV_LED1+1));if  Ord(S[3])=CMD_OPEN then T:=T+'已开启'else   T:=T+'已关闭';MemInfo.Lines.Add(T);end;end.
// MyDef.pas
unit MyDef;interface
// 本程序使用 Trubo51( https://turbo51.com/ ) 单片机 PASCAL 编译器
// 
// 
// 实例 9 演示了单片机串口 按自定协议收发串口数据
// 假设有PC可以发送如下多种命令给单片机        
//     .打开或关闭指定的LED灯 
//     .打开或关闭蜂鸣器
//     .查询LED灯的状态或蜂鸣器状态
//  为此,设计PC发送的命令帧为 4 个字节:
//     起始|命令|设备号|检验
//     起始:固定为 $01
//     命令
//          $4F(字符O) : 开启
//          $43(字符C) : 关闭
//          $51(字符Q ): 查询 
//        检验为前面三个字符值相加
//    设备号:$31(字符 0)--$38(字符 7) LED1 -- LED8 
//              $39 (字符 9)  蜂鸣器//      单片机发回PC的应答帧为 4 个字节:起始|设备号|状态|检验 
//      起始:固定为 $01
//        设备:
//      命令
//          $4F(O ): 已开
//          $43(C ): 已关
//   
//        检验为前面三个字符值相加//  CPU 电路图请看 实例 1 
//  
//TypeTCmdFrame=Array[1..4] of Byte ;
varRxFrame,TxFrame:TCmdFrame;RxCnt,TxCnt:byte;const// 命令CMD_BEGIN=$01  ;		// 帧头CMD_OPEN= $4F  ;        // 开启CMD_CLOSE=$43  ;        // 关闭CMD_QUERY=$51  ;        // 查询// 设备状态DEV_ON=CMD_OPEN ;DEV_OFF=CMD_CLOSE;//设备编号DEV_LED1=$30 ; // LED1 DEV_LED2=$31 ;DEV_LED3=$32 ; DEV_LED4=$33 ;DEV_LED5=$34 ;DEV_LED6=$35 ;DEV_LED7=$36 ;DEV_LED8=$37 ;   DEV_FM=$38 ;       // 蜂鸣器// 接收帧各字节位置表意RX_FB_BEG=1;RX_FB_CMD=2;RX_FB_DEV=3;RX_FB_CHK=4;// 发送帧各字节位置表意TX_FB_BEG=RX_FB_BEG;TX_FB_DEV=2;TX_FB_STA=3;TX_FB_CHK=4;function GetCheck(AFrame:TCmdFrame):byte;
function CheckFrame(AFrame:TCmdFrame):Boolean;implementation
function GetCheck(AFrame:TCmdFrame):byte;
begin// result:=AFrame[1] OR  AFrame[2]    XOR  AFrame[3]   ;result:=AFrame[1] +  AFrame[2] + AFrame[3]
end;function CheckFrame(AFrame:TCmdFrame):Boolean;
beginresult:= (AFrame[1]=CMD_BEGIN )And ( AFrame[RX_FB_CHK] =GetCheck(AFrame)  );
end;end.

在这里插入图片描述

下载源码

这篇关于51单片机-PASCAL语言实例10:用Lazarus开发串口应用程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.