为什么我的代码会出现out of memory(1)啊?以下是具体的功能和实现?大神们帮我看一下

紫林落雪 2017-02-23 05:52:03
串口发送的数据格式是两个包相见发送的没有顺序,其中包1是f5 0a 03 fa _ _ _ fa _ _ _ fa _ _ _.........fa _ _ _c0 00 和包2是f5 0b 02 fb _ _ fb_ _ fb _ _ .........fb _ _ c0 00(fa 0a 啥的都是16进制两位数据)
(其中f5 oa o3和f5 ob o2 包头,03和02是帧后面的数据长度)c0 00是包尾,fa和fb是每个帧头,如何提取出来每个帧后面的划线的三或者两个数据并显示在iplot框中),以及包尾前面的两个数据显示在memo框中

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Registry, StdCtrls, iComponent, iVCLComponent,
iCustomComponent, iPlotComponent, iPlot, OleCtrls, MSCommLib_TLB;

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
ComboBox2: TComboBox;
MSComm1: TMSComm;
Openport: TButton;
Exit: TButton;
clear: TButton;
findport: TButton;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Memo4: TMemo;
Memo5: TMemo;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
iPlot2: TiPlot;
iPlot1: TiPlot;
procedure MSComm1Comm(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure findportClick(Sender: TObject);
procedure clearClick(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure OpenportClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var //定义变量,全局变量
Form1: TForm1;
comindex:array[0..6] of integer;
indata :array [0..99900000] of integer;
a,b,j,k,h,d :integer;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Mscomm1.InBufferCount:=0; // 清空接收缓冲区,当前接收缓冲区接收到的数据的长度, count:=MSComm1.InBufferCount
Mscomm1.InputLen:=0; // Input读取整个缓冲区内容 一次读取所有数据
Mscomm1.OutBufferCount:=0; //清空发送缓冲区
a:=0;
b:=0;
j:=0;
k:=0;
h:=10;
end;
procedure TForm1.findportClick(Sender: TObject);
var //通过读取注册表来获取,串口信息都是保存在注册表的这个位置
reg: TRegistry; //利用TRegistry对象来存取注册表文件中的信息
ts: TStrings; //TStrings是一个抽象类,在实际开发中,可以操纵属于组件(如TListBox)的字符串列表
i: integer; //TStrings类定义了它的方法,但它并没有实现这些方法来操纵字符串。TStrings派生类实现了这些方法
begin
ts := TStringList.Create;
reg := TRegistry.Create; //创建TRegistry对象
reg.RootKey := HKEY_LOCAL_MACHINE; //指定根键,存储当前系统的软硬件配置信息
reg.OpenKey('hardware\devicemap\serialcomm', true);
reg.GetValueNames(ts); //获取主键下的数据值名称
memo1.Lines.Add(ts[i]);
memo1.Lines.Add(reg.ReadString(ts[i]));
for i:=1 to ts.Count-1 do
begin //读取串口号设置串口
ComboBox1.Items.Add(reg.ReadString(ts.Strings[i]));//String是一个基础数据类型,而TStrings是一个类,该类的对象中每一行都是一个String
comindex[i]:=strtoint(reg.ReadString(ts.Strings[i])[4]);//指将字符型数据转换为数值型数据
Memo1.Lines.Add(reg.ReadString(ts.Strings[i]));//把每一项下的串值(接收的文字)显示在Memo1中
end;
ts.Free;
reg.CloseKey;
reg.free;
end;

procedure TForm1.OpenportClick(Sender: TObject);
var
ComSetting:String;
begin
if not MSComm1.PortOpen then
begin
MSComm1.CommPort:=comindex[ComboBox1.ItemIndex+1];
ComSetting:=ComboBox2.Text;
MSComm1.Settings:=ComSetting+',N,8,1';
MSComm1.InputMode:=comInputModeBinary;
MSComm1.PortOpen:=True;
end
else begin
MSComm1.PortOpen:=False;
end;
end;

procedure TForm1.ExitClick(Sender: TObject);
begin
if MSComm1.PortOpen = True then
begin
MSComm1.PortOpen:= False;
end;
Application.Terminate;
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
SerialInput :variant;
i,c,d,inputlen :Integer;
y1,y2,y3,y4,y5,y6:Integer;
y11,y22,y33,y44,y55,y66,datastr1:string;
c1,c2:double;
begin
inputlen:=MSComm1.InBufferCount;
SerialInput:= MSComm1.Input;

for i:=0 to inputlen-1 do
begin
datastr1:=datastr1+' '+LowerCase(IntToHex(SerialInput[i],2));
indata[a]:= SerialInput[i];
inc(a);
end;

for i:=b to a-1 do
begin
if(indata[i]=$f5)and(indata[i+1]=$0a)and(indata[i+2]=$03)then
begin
for d:=i to a-4 do
begin
if (indata[d+3]=$fa)then
begin
if(indata[d+4]=$fa)then
begin

end
else
begin
y1:=indata[i+4]*256*256+indata[d+5]*256+indata[d+6];
y11:=FormatFloat('00.000',y1);
if TryStrToFloat(y11,c1) then
begin
iplot1.Channel[0].AddXY(j/h,c1);
end;
inc(j);
end;
end
else
begin
if(indata[d+3]=$c0)and(indata[d+4]=$00)then
begin
y2:=indata[d+1];
y3:=indata[d+2];

y22:=FormatFloat('00.000',y2);
y33:=FormatFloat('00.000',y3);

memo2.Lines.Add(y22);
memo3.Lines.Add(y33);
end;
end;
end;
end;
if(indata[i]=$f5)and(indata[i+1]=$0b)and(indata[i+2]=$02)then
begin
for c:=i to a-4 do
begin
if (indata[c+3]=$fb)then
begin
if(indata[c+4]=$fb)then
begin

end
else
begin
y4:=indata[c+4]*256+indata[c+5];
y44:=FormatFloat('00.000',y4);
if TryStrToFloat(y44,c2) then
begin
iplot2.Channel[0].AddXY(k/h,c2);
end;
inc(k);
end;
end
else
begin
if (indata[c+3]=$c0)and(indata[c+4]=$00)then
begin
y5:=indata[c+1];
y6:=indata[c+2];

y55:=FormatFloat('00.000',y5);
y66:=FormatFloat('00.000',y6);

memo4.Lines.Add(y55);
memo5.Lines.Add(y66);
end;
end;
end;
end;
end;
end;
procedure TForm1.clearClick(Sender: TObject);
begin
iplot1.Channel[0].Clear;
iplot1.Channel[1].Clear;
iplot2.Channel[0].Clear;
iplot2.Channel[1].Clear;
end;

end.
...全文
677 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2017-02-26
  • 打赏
  • 举报
回复
引用 6 楼 jankercsdn 的回复:
[quote=引用 3 楼 jankercsdn 的回复:] memo1.Lines.Add(ts[i]); memo1.Lines.Add(reg.ReadString(ts[i])); for i:=1 to ts.Count-1 do 前面两行,这里的i是什么?
我的意思是:这里的i是局部变量,还没有赋值,这样用,肯定是out of.... 比如这样,才正常吧 memo1.Lines.Add(ts[0]); memo1.Lines.Add(reg.ReadString(ts[0])); for i:=1 to ts.Count-1 do [/quote] 说得对,此处,你会出现“List index out of bounds"错误。
lyhoo163 2017-02-26
  • 打赏
  • 举报
回复

for i:=0 to inputlen-1 do
begin
  datastr1:=datastr1+' '+LowerCase(IntToHex(SerialInput[i],2));
  indata[a]:= SerialInput[i];
  inc(a);
  if a>=99900000 then a:=0;
end;
加一名 if a>=99900000 then a:=0;试试。
lyhoo163 2017-02-25
  • 打赏
  • 举报
回复
你的 indata :array [0..99900000] of integer; 数组下标最大值99900000。 a是全局变量,在Create事件中初始为0,在下面代码中 for i:=0 to inputlen-1 do begin datastr1:=datastr1+' '+LowerCase(IntToHex(SerialInput[i],2)); indata[a]:= SerialInput[i]; inc(a); end; inc(a); 始终+1,最终它超过数组indata数组下标最大值99900000。此时就越界,out of memory了。
紫林落雪 2017-02-25
  • 打赏
  • 举报
回复
@lyhoo163 那该怎么办?意思是不是a的值是不是要释放掉?应该怎么释放掉?
看那山瞧那水 2017-02-25
  • 打赏
  • 举报
回复
引用 3 楼 jankercsdn 的回复:
memo1.Lines.Add(ts[i]); memo1.Lines.Add(reg.ReadString(ts[i])); for i:=1 to ts.Count-1 do 前面两行,这里的i是什么?
我的意思是:这里的i是局部变量,还没有赋值,这样用,肯定是out of.... 比如这样,才正常吧 memo1.Lines.Add(ts[0]); memo1.Lines.Add(reg.ReadString(ts[0])); for i:=1 to ts.Count-1 do
蓝色光芒 2017-02-24
  • 打赏
  • 举报
回复
建议你说一下,在哪行?或者哪段也行,出现out of memory的异常
紫林落雪 2017-02-24
  • 打赏
  • 举报
回复
@看那山瞧那水 那是读取系统的串口号
看那山瞧那水 2017-02-24
  • 打赏
  • 举报
回复
memo1.Lines.Add(ts[i]); memo1.Lines.Add(reg.ReadString(ts[i])); for i:=1 to ts.Count-1 do 前面两行,这里的i是什么?
紫林落雪 2017-02-24
  • 打赏
  • 举报
回复
@蓝色光芒 for i:=0 to inputlen-1 do begin datastr1:=datastr1+' '+LowerCase(IntToHex(SerialInput[i],2)); indata[a]:= SerialInput[i]; inc(a); end; 在这一段出现的,这是接收串口发来的数据,每次串口发一包,则记录一包,估计一直接收导致数组无限增大,怎么样才能把每接收的一包数据后清空,然后如何数组从零开始记录下一包呢。
【课程简介】本课程是《Armv8/Armv9架构从入门到精通 第二期》中的第四章。建议购买大课程。本课程以为armv8-aarch64、armv9为基准,不涉及armv7及其以前的版本,也不涉及aarch32。本课程包含但不限于以下内容MMU的基础学习:啥是MMU?工作原理?MMU和cache之间的关系?及其怎样相互影响的?哪些是MMU硬件自动的行为?哪些是软件可配置的行为?地址空间基础:啥是虚拟地址空间?啥是物理地址空间?啥时memory-map? 代码程序中的虚拟地址空间是怎样的?arm core硬件决定的物理地址空间是怎样的?SOC memory-map时的地址空间是怎样的?具体的外设又是怎样的地址空间?Translation Regime:系统里有多少个MMU?系统里有多少个Translation Regime?他们之间的关系是怎样的?页表翻译:MMU是怎样翻译的?页表有几级?这些信息是怎么告诉MMU的,MMU又是怎样工作的,软件又需要怎样设计?stage1和stage2的区别和使用?Descriptor:啥是Descriptor、页表项、entry、条目、页表条目? Descriptor的格式是怎样的?每一个属性位是怎样的?MMU除了完成地址转换,属性权限的控制/cache的缓存策略是怎样配置的?optee中使用MMU的示例MMU深度思考篇:开启MMU瞬间可能出现的问题以及多种常用的解决方案。注意这里提到的是多种方案,绝大多数人只知道第一种,除此之外还有没有其它的设计方式? MMU关闭时cache的缓存策略怎样?【思考】01、一个大系统中有多少个MMU ?02、一个ARM Core中有多少个Translation regime?03、EL1&0 Translation regime Stage2、EL2 Translation regime stage1、EL2&0 Translation regime stage1 这三者的区别是什么?04、TTBR1_EL2寄存器有啥特殊性,这个寄存器是给谁使用的?05、有没有TTBR1_EL3寄存器?为什么?06、什么是memory-map? 一个ARM的系统中,有几套物理地址空间?07、页表到底有几级? 页表最少可以有几级?页表最多可以有几级?08、页表有多大? 页表存放在哪里?页表由谁来管理?09、页表是否能放在cache中?10、什么是Translation Table walk? 什么是TLB?11、请简述页表查询的过程?12、在一个大系统中,物理地址是多少位的? 物理地址是多少位指的是什么?虚拟地址又是多少位的? 物理地址的位数和虚拟地址的位数都是由谁来决定的?13、请说明entry、descriptor、页表项、条目 这个四个词汇的由来?14、TCR中有缓存属性和共享属性、页表的entry中也有缓存属性和共享属性,这俩有什么区别?15、请简述TTBR0和TTBR1的概念和意义?16、请简述cacheability和shareability属性的含义?17、stage1和stage2有何区别?18、stage1和stage2的descriptor中,有很多重复的属性,当两者属性有冲突了怎么办?19、L1、L2、L2的descriptor中也有部分相同的属性,重复时怎么办?20、Descriptor的格式有哪几种?21、Descriptor的类型有哪几种?22、简述您所观察到的系统软件中(操作系统或hypervisor)的shareability和cacheability一般都是怎样配置的?23、开启一个MMU的步骤是怎样的?24、啥是flat map? 啥是full level table?25、页表中的AF属性位、DBM属性位分别是干啥的?26、页表中的nG属性位是干啥的?27、页表中的Contiguous属性位是干啥的?28、在开启MMU的瞬间考虑哪些事情?【课程目录】当前21节课,6.8小时

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧