求助:关于CPort串口通信的问题

春风老少年 春风老少年 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
用D7写了个串口通信的上位机,串口控件用的是CPort,遇到个非常奇怪的问题,我用了两种方法来解决,得到了两种不同的结果。
方法一,只有一个单元文件:

function StrToHexStr(const Str:string):string;
var i:Integer;
begin
for i:=1 to Length(Str) do
begin
if i=1 then
Result:= IntToHex(Ord(Str[1]), 2)
else Result:= Result+ #32+ IntToHex(Ord(Str[i]), 2);
end;
end;

//串口收数过程
procedure TwMain.CPortRxChar(Sender: TObject; Count: Integer);
var strGet: String;
begin
CPort.ReadStr(strGet, count);
memo1.Text:= StrToHexstr(strGet);
end;


方法二,有两个单元文件:

//unit2.pas单元中定义:
//全局变量:
var DataGet: Array of Byte;

//然后定义过程:
procedure SaveData(const Data: Array of Byte);
var i: Integer;
begin
SetLength(DataGet, Length(Data));
for i:= 0 to Length(DataGet)-1 do
DataGet[i]:= Data[i];
end;

function Show(): String;
var i: Integer;
begin
for i:= 0 to Length(DataGet) do
begin
if i= 0 then
Result:= IntToHex(DataGet[0], 2)
else Result:= Result+ #32+ IntToHex(DataGet[i], 2);
end;
end;

//unit1.pas单元中定义,已引用uint2.pas
//串口收数过程
procedure TwMain.CPortRxChar(Sender: TObject; Count: Integer);
var
strGet: String;
i: Integer;
CommData: Array of Byte;
begin
CPort.ReadStr(strGet, count);

SetLength(CommData, Length(strGet));
for i:= 0 to Length(strGet)-1 do
CommData[i]:= Ord(strGet[i+1]);

SaveData(CommData);
memo1.Text:= Show();
end;


用方法一,串口收到的数据显示正确,用方法二就不对。具体错误表现,据我观察,似乎memo中显示的数据为串口收到的数据(字符串StrGet,转存到全局数组变量DataGet中)的最后3个(有时变成2个)字节加上数组DataGet后的未知内存空间中的的一定长度的字节。但是显示的长度和我定义的要显示的DataGet数组的长度又不一样,比如StrGet字符串长度为28,那么memo中显示的数据是DataGet的最后三个字节,然后加上其后未知内存空间中的26个字节,显示的长度比定义的长度多了一个字节。请问这是怎么回事?
需要解决的问题:
我现在想用方法二来显示串口收到的数据,中间变量数组DataGet必须有,因为要根据DataGet中各个数组元素的二进制值的0、1位状态来表示机器相应功能的运行状态,所以只能用方法二。但是搞了半天,串口数据就是显示不正确,好像调用是SaveData函数存储的时候,数据发生了变化,不知道究竟是怎么回事,求各位Delphi高手速速相助!
谢谢!!!
...全文

相关推荐

在Delphi中用CPort组件开发串口通信程序

Delphi可以通过许多控件实现串口通信,此篇文章主要是介绍用CPort控件,希望能够更好的帮助开发人员用CPort开发串口通信

lily5588

CPort类在手机串口通信中的应用与Delphi开发指南

本文还有配套的精品资源,点击获取 简介:本文深入讲解了CPort类库在手机串口通信中的应用以及如何利用Delphi RAD工具进行程序开发。介绍了CPort类的功能和方法,以及如何在Delphi中配置和使用该类库进行设备控制、数据采集和调试等任务。提供了CPort类的使用示例代码,帮助开发者理解并掌握其在串口通信中的应用。 1. CPort类库简介 CPor...

Vita Libre

Cport串口通信控件的版本概览

在现代IT和工业自动化领域,数据通信是实现各种功能和任务的关键。串口通信作为数据通信的一种基本形式,广泛应用于计算机与外部设备之间。Cport,一个功能强大的串口通信控件,为开发者提供了一种简便的解决方案,以实现复杂的串口通信需求。Cport是一个在多种编程环境中广泛使用的串口通信控件。无论是在Windows环境下,还是嵌入式系统,Cport都能为用户提供高效、稳定的串口通信能力。凭借其灵活的配置选项和易于理解的API,Cport已经成为许多工程师和开发者的首选。

叶宇霖

Delphi 7 CPort30串口编程工具包

本文还有配套的精品资源,点击获取 简介:Delphi 7是一款支持高效串口编程的可视化开发环境,广泛应用于嵌入式系统和工业自动化领域。该工具包提供了一个名为"CPort30"的组件,旨在简化串口操作,增强开发者在设备控制和数据传输任务中的效率。它包含丰富的API、示例代码和故障排除文档,特别适合需要进行串口通信的Delphi 7用户。该资源包括源代码、帮助文档、示例程序和本...

战神哥

Cport 各个版本

被称为最牛叉的串口控件,用于C++ builder和Delphi。丁丁大侠的sscom就是用的这款控件,把例子改一下,也就是自己的串口调试助手了

liquanhai
评论 5
收藏 已收藏
分享
返回顶部