大虾,救我,帮我找一下代码中的错误,一个关于字符串点阵发送的问题!(100分)

  • 主题发起人 主题发起人 sarny
  • 开始时间 开始时间
S

sarny

Unregistered / Unconfirmed
GUEST, unregistred user!
这段代码想实现发送英文字母的功能,点阵库是asc16,以一个字节的形式保存,
共用了二个控件发送方法,用控件1(mscomm)不能编绎,用控件2(spcomm)能编绎通过,
但不能发送成功,
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MSCommLib_TLB, SPComm, StdCtrls,unit2;
type
Tsendform = class(TForm)
SendComm: TMSComm;
sendbutton: TButton;
inputedit: TEdit;
Button1: TButton;
Comm1: TComm;
procedure FormCreate(Sender: TObject);
procedure sendbuttonClick(Sender: TObject);
private
{ Private declarations }
public
stime,smode,ppage:integer;
//次数,速度,屏数,
tmp:byte;
{ Public declarations }
end;

var
sendform: Tsendform;
procedure headfile(file3:string);
implementation
{$R *.dfm}
procedure Tsendform.FormCreate(Sender: TObject);
//初使化串口
begin
sendcomm.Settings:='9600,e,8,1';
sendcomm.inputmode:=0;
ppage:=0;
smode:=1;
stime:=1;
end;

procedure Tsendform.sendbuttonClick(Sender: TObject);
var
f1,f2,f3:file of byte;
str:string;
strpchar:array[0..15]of char;
//字符数组
one,two,no,i,j:integer;
str1,inputdat:array[0..15]of byte;
sendbyte:array[0..127]of byte;
begin
str:=trimright(inputedit.Text);
//全英文输入测试
if length(str)<17 then
begin
//测试只有一屏
strpcopy(strpchar,str) ;
//补足一屏
for i:=length(str) to 16do
begin
strpchar:=' ';
end;
end
else
begin
delete(str,17,length(str)-16);
strpcopy(strpchar,str);
end;
str:='asc16';
//读取字库并写到TWO。RES文件中
one:=fileopen(str,fmopenread);
if FileExists (str) then
deletefile(str);
filecreate(str);
str1:=inputdat;
str:='two.res';
two:=fileopen(str,fmopenreadwrite);
if two=-1 then
showmessage('failtwo')else
for no:=0 to 15do
begin
i:=byte(strpchar[no]);
fileseek(one,i*16,0);
fileread(one,inputdat,16);
fileseek(two,16*no-1,0);
filewrite(two,inputdat,16);
end;
fileclose(one);
fileclose(two);
str:='thr.res';
headfile(str) ;//生成头文件, 也是联接单片机的协议
assignfile(f3,str);
//联接头文件与字库文件
reset(f3);
//打开第一个文件
str:='one.res';
assignfile(f1,str);
one:=fileopen(str,fmopenwrite);
if one=-1 then
showmessage('第1个文件未打开');
fileseek(one,0,0);
while not eof(f3)do
begin
read(f3,tmp);
filewrite(one,tmp,1);
end;
closefile(f3);
str:='two.res';
assignfile(f2,str);
reset(f2);
while not eof(f2)do
begin
read(f2,tmp);
filewrite(one,tmp,1);
end;
fileclose(one);
closefile(f2);
sendComm.InBufferCount := 0;//方法1
sendcomm.OutBufferCount := 0 ;
If sendComm.PortOpen then
else
sendComm.PortOpen := True;
str:='one.res';
assignfile(f3,str);
one:=fileopen(str,fmopenread);
if one>0 then
else
showmessage('adfa');
for i:=0 to 4do
begin
fileread(one,sendbyte,16);
sendcomm.output:=sendbyte;
end;
sendComm.PortOpen:=false;
fileclose(one);
str:='one.res';
assignfile(f3,str);
one:=fileopen(str,fmopenread);
comm1.StartComm;
for i:=0 to 7do
begin
for j:=0 to 15do
fileread(one,sendbyte,1);
comm1.writecommdata(@sendbyte,16);
end;
fileclose(one);
comm1.StopComm;
end;

procedure headfile(file3:string);
//生成头文件
var
i,thr:integer;
tmp:byte;
begin
thr:=fileopen(file3,fmopenwrite);
if thr=-1 then
showmessage('生成');
tmp:=byte($55);
fileseek(thr,0,0);
filewrite(thr,tmp,1);
tmp:=byte($AA);
fileseek(thr,1,0);
filewrite(thr,tmp,1);
tmp:=(sendform.ppage+1);
fileseek(thr,2,0);
filewrite(thr,tmp,1);
for i:=1 to sendform.ppage+1do
begin
tmp:=sendform.smode;
fileseek(thr,i+2,0);
filewrite(thr,tmp,1);
end;
for i:=1 to sendform.ppage+1do
begin
tmp:=sendform.stime;
fileseek(thr,2*i+2,0);
filewrite(thr,tmp,1);
end;
fileclose(thr);
end;
end.
 
建议使用MSCOMM发送。
从你的方式看应该发送二进制数据
将MSCOMM的 sendcomm.inputmode:=0;改成sendcomm.inputmode:=1;
你的错误在于发送的数据类型错误。给你一个发送二进制的函数。
Function sj_fsr(dd:TMSComm;str_fs:array of byte):Boolean;
var
i:Integer;
MyVariant: Variant;
begin
Try
MyVariant :=VarArrayCreate ([0,High(str_fs)-1], varByte);
for i:=0 to High(str_fs)-1do
MyVariant:=str_fs;
dd.Output:=MyVariant;
Result:=True;
Except
Result:=False;
end;
end;

将你的
sendcomm.output:=sendbyte;
改成
sj_fsr(sendcomm,sendbyte);
即可。
 
先谢了,发送成功了,只是发送的二进制的文件有一点问题,在单片机上不能正确显示,
呵呵,还请你帮我检查一下,
要是分数不够的话,我还有22分,嘻
 
在单片机上是不是一定要求你以二进制方式发送的?如果单片机是自己设计的话,可以用上位机和
下位机一起进行DEBUG调试,这样查问题比较方便。
 
接受答案了.
 
后退
顶部