请教:如何实现边读文件,边发送至串口
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,StrUtils, ExtCtrls, SPComm;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
ProgressBar1: TProgressBar;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Memo2: TMemo;
Button2: TButton;
Timer1: TTimer;
Comm1: TComm;
ComboBox1: TComboBox;
Label2: TLabel;
Button3: TButton;
ProgressBar2: TProgressBar;
//procedure FormShow(Sender:Tobject);
procedure FormClose(Sender:Tobject;var Action:TCloseAction);
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
private
{ Private declarations }
public
{ Public declarations }
end;
var
j,fs:integer;
F:file;
max:integer;
LenF:longint;
Form1: TForm1;
//viewstring:string;//保存读取文件
sendstring:string;//存储发送文件
sbuf:array of byte;
rbuf:array[0..1024] of byte;
commflg:boolean;
function ReadFile0(FileName:String):boolean;
implementation
{$R *.dfm}
//procedure FormShow(Sender:Tobject);
//读取文件函数
function ReadFile0(FileName:String):boolean;
var
//F:File;
Src:Array[0..1024-1] of byte;
viewstring:string;
i,j,numread:Integer;
p:integer;
sp:pchar;
LenFH,LenFL:BYTE;
begin
result:=True;
if not FileExists(FileName) then
begin result:=false; exit; end;
AssignFile(F,FileName);
Reset(F,1);
p:=filesize(F);
max:=p;
LenF:=filesize(F);
setlength(sbuf,LenF);
if P < sizeof(Src) then
begin //Test
CloseFile(f);
showmessage('文件大小错误');
exit;
end
else numread:= sizeof(Src)-1;
if form1.ProgressBar1.Max>10 then
form1.ProgressBar1.Step:= form1.ProgressBar1.Max div 10
else
form1.ProgressBar1.Step:=form1.ProgressBar1.Max;
j:=3;
repeat
viewstring:='';
BlockRead(F,Src,sizeof(src),numread);
form1.ProgressBar1.Position:=0;
form1.ProgressBar1.Max:=numread;
if numread>0 then
begin
for p:=0 to numread-1 do
begin
viewstring:=viewstring+inttohex(Src[p],2)+' ';
if not Eof(F) then form1.ProgressBar1.position:=form1.ProgressBar1.position+1;
end;
form1.Memo1.lines.add(viewstring);
for i:=0 to numread-1 do
begin
sbuf[j]:=Src[i];
inc(j);
end;
Application.ProcessMessages;
end;
until ((NumRead = 0) and (form1.ProgressBar1.Position<=form1.ProgressBar1.Max));
CloseFile(F);
Application.ProcessMessages;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
form1.Comm1.CommName:=form1.ComboBox1.Text;
end;
//关闭串口
procedure TForm1.FormClose(Sender:TObject;var Action:TCloseAction);
begin
form1.comm1.StopComm;//关闭窗体时,将comm1控件关闭
end;
procedure TForm1.Button1Click(Sender: TObject);
var LenFH,LenFL:longint;
viewstring1:string;
begin
form1.Comm1.CommName:=form1.ComboBox1.Text;
form1.Comm1.BaudRate:=38400;
form1.Comm1.Parity:=None;
form1.Comm1.ByteSize:=_8;
form1.Comm1.StopBits:=_1;
form1.comm1.StartComm;
//sleep(2);
memo1.Clear;
memo2.Clear;
if (OpenDialog1.Execute) and (Opendialog1.FileName<>'' )then
ReadFile0(Opendialog1.FileName);
if LenF>256 then
begin
LenFH:=LenF div 256;
LenFL:=LenF-256*LenFH;
end
else
begin
LenFH:=$00;
LenFL:=LenF;
end;
sbuf[0]:=$EB;//帧头
sbuf[1]:=LenFH;
sbuf[2]:=LenFL;
fs:=0;
commflg:=true;
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end;
if not commflg then MessageDlg('发送失败!',mterror,[mbyes],0)
else
begin
viewstring1:='';
viewstring1:=inttohex(sbuf[fs],2)+' ';
form1.Memo2.Lines.Add(viewstring1);
inc(fs);
end;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
r:array[0..1024]of byte;
//viewstring2:string;
begin
move(buffer^,r,bufferlength);
rbuf[0]:=r[0];
if (fs=1) and (rbuf[0]=$EB) then
begin
for i:=1 to 5 do
begin
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end;
inc(fs);
sleep(2);
end;
end;
if (fs=6) and (rbuf[0]=$55) then
begin
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end;
inc(fs);
sleep(2);
end;
while fs<=LenF+2 do
begin
for fs:=7 to LenF+2 do
begin
if rbuf[0]=sbuf[fs-1] then
begin
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end;
sleep(2);
end;
end;
end;
if fs=LenF+2 then form1.Memo2.Lines.Add('下载成功');
form1.ProgressBar2.Max:=LenF+2;
form1.ProgressBar2.Step:=1;
form1.ProgressBar2.Position:=0;
if not eof(F) then form1.ProgressBar2.Position:=fs;
Application.ProcessMessages;
end;
end.
相关推荐
LabVIEW边写边读文件.rar
在LabVIEW中实现边写边读文件,主要涉及以下知识点:1.
STM32手势控制小车:从Paj7620U2传感器到PWM电机驱动完整实现
手势识别作为人机交互的一种基础技术,在嵌入式领域常被误解为必须依赖复杂AI算法。实际上,在MCU上实现手势控制的核心在于将连续的传感器信号转化为离散的动作指令。本文从手势识别的基本原理出发,讲解如何通过I2C总线读取Paj7620U2手势传感器数据,利用C语言编写状态机完成手势判据,再通过TIM定时器输出PWM信号驱动直流电机,实现小车前进、后退与转向。该方案响应快、代码量小,非常适合作为STM32课程设计、电赛或毕业设计选题。文章还涵盖硬件选型、寄存器配置、滤波防抖、电压补偿等工程细节,帮助开发者避开常见
AD8232心电采集实战:从Arduino信号处理到Processing可视化
生物电信号是理解心脏活动的重要窗口,ECG(心电)采集技术被广泛应用于医疗监护与可穿戴健康设备。心电信号微弱且噪声复杂,通常需经过模拟前端放大、滤波与数字化处理。AD8232作为专用心电模拟前端芯片,高度集成仪表放大器、高低通滤波及右腿驱动电路,大幅降低硬件设计门槛。在Arduino平台采集该信号后,需通过数字滤波去除基线漂移与工频干扰,再借助R峰检测与阈值判断计算瞬时心率。实时可视化方面,Processing通过串口通信接收数据,以环形缓冲绘制滚动波形,并对BPM进行平滑显示,从而构建从电极到屏幕的完整采
node.js 利用流实现读写同步,边读边写的方法
实现边读边写的基本步骤如下:1. 引入 fs 模块并创建可读流和可写流实例。2. 监听可读流的 data 事件,每次触发时读取数据块。3.
Node.js 使用流实现读写同步边读边写功能
在实现边读边写的过程中,我们将这两个流结合在一起。在提供的代码示例中,可以看到两种不同的实现方式:1.


语言基础/算法/系统设计
