请选择 进入手机版 | 继续访问电脑版

Lazarus中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3625|回复: 5

[Lazarus实战宝典] Turbo51学习笔记(9) 计算机端串行通信的Lazarus代码

[复制链接]

该用户从未签到

发表于 2015-1-18 01:45:57 | 显示全部楼层 |阅读模式
       可用于Lazarus的串行通信控件有不少,各有特点,在本节里,选用的是老牌的SPCOMM控件。

       控件的设置如下:

      

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

该用户从未签到

 楼主 发表于 2015-1-18 01:55:30 | 显示全部楼层
     为了和前一节的单片机电路对应,设置如下界面:



上面一行的LED是需要的状态,由操作者来改变;
下面一行的LED用于反映单片机的实际状态,根据接收的数据来控制。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主 发表于 2015-1-18 02:13:00 | 显示全部楼层
本帖最后由 逍遥派掌门人 于 2015-1-18 02:15 编辑

定义常量:
  1. const
  2.    Header             = $7E;            // 起始字
  3.    Address            = $01;           // 单片机地址
复制代码
定义变量:
  1. var
  2.   green_light,blue_light:boolean;
  3.   send_data:array [1..4] of byte;                      // 发送缓冲区,这里和通信协议对应
  4.   receive_data:array of byte;                           // 接收缓冲区,这里定义为可变数组,通用性比较好
复制代码
上一行绿色LED的代码:
  1.   green_light := not green_light;         // 改变绿色LED的亮灭  
复制代码
上一行蓝色LED的代码:
  1. blue_light := not blue_light;              // 改变蓝 色LED的亮灭  
复制代码
发送的控制代码:
  1.   send_data[1]:= Header;
  2.   send_data[2]:= Address;
  3.   send_data[3] := $00;                                            // 暂时借用,省掉一个变量而已
  4.   if (green_light = true ) then send_data[3] := send_data[3] + $01;      // 绿色LED的状态
  5.   if (blue_light = true )  then send_data[3] := send_data[3] + $02;       // 蓝色LED的状态
  6.   send_data[4] := send_data[1] + send_data[2] + send_data[3];         // 计算校验和
  7.   Comm1.WriteCommData(@send_data,4);                                         // 发送4个字节到串口  
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主 发表于 2015-1-18 02:30:39 | 显示全部楼层
关键的接收代码(双击SPCOMM控件的ReceiveData事件):
  1. procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  2.   BufferLength: Word);
  3. var
  4.    checksum:byte;
  5.    number:byte;
  6. begin
  7.   setlength(receive_data,BufferLength);                               // 根据接收的长度,设置数组大小
  8.   receive_data := Buffer;                                                     //  取得数据
  9.   checksum := 0;
  10.   for number:=0 to (bufferlength -2) do checksum:=checksum + receive_data[number];    // 计算校验和
  11.   if (checksum = receive_data[bufferlength -1]) then                                                            // 校验和合法,则进行接收后的处理
  12.   begin
  13.     case receive_data[3] of
  14.      $00:
  15.          begin
  16.            BitBtn3.Glyph.LoadFromFile(green_dark_file);                      // 下一行的绿色LED 灭
  17.            BitBtn4.Glyph.LoadFromFile(blue_dark_file);                        // 下一行的蓝色LED 灭
  18.          end;
  19.      $01:
  20.          begin
  21.            BitBtn3.Glyph.LoadFromFile(green_light_file);                     // 下一行的绿色LED亮
  22.            BitBtn4.Glyph.LoadFromFile(blue_dark_file);                       // 下一行的蓝色LED 灭
  23.          end;
  24.      $02:
  25.          begin
  26.            BitBtn3.Glyph.LoadFromFile(green_dark_file);                   // 下一行的绿色LED 灭
  27.            BitBtn4.Glyph.LoadFromFile(blue_light_file);                      // 下一行的蓝色LED 亮
  28.          end;
  29.      $03:
  30.          begin
  31.            BitBtn3.Glyph.LoadFromFile(green_light_file);                  // 下一行的绿色LED亮
  32.            BitBtn4.Glyph.LoadFromFile(blue_light_file);                     // 下一行的蓝色LED 亮
  33.          end;
  34.     end;
  35.   end;
  36.   setlength(receive_data,0);                                                      // 释放资源
  37. end;
复制代码
这里接收后的处理仅是作为例证。

绿色LED 灭,蓝色LED 灭


绿色LED亮,蓝色LED 灭


绿色LED 灭,蓝色LED 亮


绿色LED亮,蓝色LED 亮



到此,串行通信的Lazarus代码解析完毕,Turbo51学习笔记系列亦宣布结束。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-1-19 15:01:57 | 显示全部楼层
........
串口控制命令数据是PC发过来的吧。
单片机程序是裸奔的?还是uCos?
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主 发表于 2015-1-20 21:41:07 | 显示全部楼层
fireyu 发表于 2015-1-19 15:01
........
串口控制命令数据是PC发过来的吧。
单片机程序是裸奔的?还是uCos?

请结合前面的一节  Turbo51学习笔记(8) 来看。
回复 支持 反对

使用道具 举报

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1

GMT+8, 2020-3-29 07:04 , Processed in 0.053159 second(s), 27 queries .

Powered by Discuz! F1.0 Build 20160930

© 2001-2020 Comsenz Inc. & Discuz! Fans

快速回复 返回顶部 返回列表