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

相关文章

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

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

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

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

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

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

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 棋盘类

这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