B
bawgijfd
Unregistered / Unconfirmed
GUEST, unregistred user!
小弟现在设计一个程序,主要用来发送点阵字符到单片机.
设计思路如下:
输入一个字符串,通过查询16*16汉字库和ASCII字库,把每个字对应的字符点阵取出来.显示每个汉字需要32字符,ASCII需要16个字符.
现在已经完成字库的读取,但是找到该字的字库位置后,连续读取的汉字代码不是我要的,
for m:=0 to 15 do begin
all[j]:=pasc^[off+m]; //同上,都是错误的地方
这两条语句,我的想法是把该汉字的32个字符点阵放到all数组里,再通过spcomm串口控件的发送函数发出去,我要发出去的数据是16进制的,我不明白在 all[j]:=pasc^[off+m] 这个语句里读取到的是不是16进制数据,但这个all数组已经定义是byte型的.出错在哪里啊,我用showmessage看过all数组里面的数据,但不确定是什么.
get_code(memo1.Text); //将字符串转化到all数组
for i:=1 to length(memo1.text)*16 do begin //发送函数
frmmain.comm1.writecommdata(@all,1); //发送到单片机
下面是发送函数的说明
frmmain.comm1..WriteCommData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean;
第一个参数,表明的是缓存区的起始地址,第二个参数,说明这是这缓冲区有多大(以byte
为单位),也就是说,要发送多少个字节。
这里的.代码如下:
说明: pasc 和phzk 是自己定义的类型
Type
byteAll= array[0.1000] of byte;
ByteArray = array [0..0] of byte;
PpByte = ^ByteArray;
Pasc,phzk : ppbyte;
Pasc 和 phzk 是指向字库资源的指针.
All : byteAll;
首先来定位程序中的点阵资源,即完成HandleRes函数,程序段如下:
procedure TMainForm.HandleRes; //载入字库,使phzk,pasc指针指向字库
var
hres : HRSRC;
begin
hres := FindResource(0,PChar(201),“HZK16”);
//查找汉字点阵资源
if hres <> 0 then begin
hhzk := LoadResource(0,hres);
//载入汉字点阵资源
if hhzk <> 0 then begin
phzk := LockResource(hhzk);
//锁定,得到资源指针
end;
end;
hres := Find Resource(0,PChar(202),“ASC16”);
//查找ASC字符资源
if hres <> 0 then begin
hasc := LoadResource(0,hres);
//载入ASC字符资源
if hasc <> 0 then begin
pasc := LockResource(hasc);
//锁定,得到资源指针
end;
end;
if (phzk = nil) or (pasc = nil) then begin
MessageDlg(“Can not load resource!”#10#13“Program stopped!”,
mtWarning,[mbOk],0);
Application.Terminate;
end;
end;
procedure TFrmMain.get_code(str: string); //这个过程是将字符串转成点阵字符形式,存到数组中
var
i : integer;
m : integer;
leng : integer;
off : integer;
begin
i := 1;
j:=1;
leng := Length(str); //字符串总长度
while(i<=leng) do begin
if (i<leng) and boolean(byte(str) and $80)
and boolean(byte(str[i+1]) and $80) then begin //判别是否属于汉字
off := ((byte(str)-$a1) and $7f) * 94 + ((byte(str[i+1])-$a1) and $7f); //该字符在字库中的起始位置
off := off * 32;
//获取该字符点阵代码 32个字节
for m:=0 to 31 do begin
all[j]:=phzk^[off+m]; //这里就是出错的地方,phzk将什么东西放到了all里面??
inc(j);
end;
inc(i,2); //读取下一个字符
end else begin // 该字符不是汉字就是ASCII字符
off := byte(str)*16; //该字符在ASCII字库中的位置
//获取ASC库点阵代码 16个字节
for m:=0 to 15 do begin
all[j]:=pasc^[off+m]; //同上,都是错误的地方
inc(j);
end;
inc(i);
end;
end;
end;
设计思路如下:
输入一个字符串,通过查询16*16汉字库和ASCII字库,把每个字对应的字符点阵取出来.显示每个汉字需要32字符,ASCII需要16个字符.
现在已经完成字库的读取,但是找到该字的字库位置后,连续读取的汉字代码不是我要的,
for m:=0 to 15 do begin
all[j]:=pasc^[off+m]; //同上,都是错误的地方
这两条语句,我的想法是把该汉字的32个字符点阵放到all数组里,再通过spcomm串口控件的发送函数发出去,我要发出去的数据是16进制的,我不明白在 all[j]:=pasc^[off+m] 这个语句里读取到的是不是16进制数据,但这个all数组已经定义是byte型的.出错在哪里啊,我用showmessage看过all数组里面的数据,但不确定是什么.
get_code(memo1.Text); //将字符串转化到all数组
for i:=1 to length(memo1.text)*16 do begin //发送函数
frmmain.comm1.writecommdata(@all,1); //发送到单片机
下面是发送函数的说明
frmmain.comm1..WriteCommData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean;
第一个参数,表明的是缓存区的起始地址,第二个参数,说明这是这缓冲区有多大(以byte
为单位),也就是说,要发送多少个字节。
这里的.代码如下:
说明: pasc 和phzk 是自己定义的类型
Type
byteAll= array[0.1000] of byte;
ByteArray = array [0..0] of byte;
PpByte = ^ByteArray;
Pasc,phzk : ppbyte;
Pasc 和 phzk 是指向字库资源的指针.
All : byteAll;
首先来定位程序中的点阵资源,即完成HandleRes函数,程序段如下:
procedure TMainForm.HandleRes; //载入字库,使phzk,pasc指针指向字库
var
hres : HRSRC;
begin
hres := FindResource(0,PChar(201),“HZK16”);
//查找汉字点阵资源
if hres &lt;&gt; 0 then begin
hhzk := LoadResource(0,hres);
//载入汉字点阵资源
if hhzk &lt;&gt; 0 then begin
phzk := LockResource(hhzk);
//锁定,得到资源指针
end;
end;
hres := Find Resource(0,PChar(202),“ASC16”);
//查找ASC字符资源
if hres &lt;&gt; 0 then begin
hasc := LoadResource(0,hres);
//载入ASC字符资源
if hasc &lt;&gt; 0 then begin
pasc := LockResource(hasc);
//锁定,得到资源指针
end;
end;
if (phzk = nil) or (pasc = nil) then begin
MessageDlg(“Can not load resource!”#10#13“Program stopped!”,
mtWarning,[mbOk],0);
Application.Terminate;
end;
end;
procedure TFrmMain.get_code(str: string); //这个过程是将字符串转成点阵字符形式,存到数组中
var
i : integer;
m : integer;
leng : integer;
off : integer;
begin
i := 1;
j:=1;
leng := Length(str); //字符串总长度
while(i<=leng) do begin
if (i<leng) and boolean(byte(str) and $80)
and boolean(byte(str[i+1]) and $80) then begin //判别是否属于汉字
off := ((byte(str)-$a1) and $7f) * 94 + ((byte(str[i+1])-$a1) and $7f); //该字符在字库中的起始位置
off := off * 32;
//获取该字符点阵代码 32个字节
for m:=0 to 31 do begin
all[j]:=phzk^[off+m]; //这里就是出错的地方,phzk将什么东西放到了all里面??
inc(j);
end;
inc(i,2); //读取下一个字符
end else begin // 该字符不是汉字就是ASCII字符
off := byte(str)*16; //该字符在ASCII字库中的位置
//获取ASC库点阵代码 16个字节
for m:=0 to 15 do begin
all[j]:=pasc^[off+m]; //同上,都是错误的地方
inc(j);
end;
inc(i);
end;
end;
end;