关于spcomm通讯,读取汉字库的问题? ( 积分: 100 )

  • 主题发起人 主题发起人 bawgijfd
  • 开始时间 开始时间
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;
 
这是第一次提问题,自己顶一个。做了两天的程序,就差这一点拉,望大家帮忙,看看拉。[:(]
 
我不会,也想学习,帮你顶一下
 
for m:=0 to 31 do begin
all[j+m]:=phzk^[off+m]; //把点阵复制过去,all的下标也要跟着变
 
GSM短信远程抄表系统管理端源代码(pc控制手机模块收发GSM短信)
http://www.pgz8.cn/Software/Catalog93/4151.html

串口操作等,都是自己写的代码.不用现成控件的.你可以下载来看看,还有实现了pc控制手机模块收发gsm短信,函数都是自己写的。线程方式操作,提高效率。短信模块用的是西门子的。

可能对你有帮助.

下面是他的说明:

系统说明:GSM短信远程抄表系统管理端(原理:pc控制手机模块收发GSM短信)
作者:Cooling
QQ: 21156410
Email: 21156410@qq.com
主页:http://www.pgz8.cn
可以任意传播,但请保留以上信息,有任何问题,欢迎交流。谢谢
这是一个商业软件的demo部分,收发短信的部分函数,全部是站长2002年写的,不用现成控件,线程操作.或许对短信系统开发有帮助.当时没有实现中文短信的收发,这个系统中也不需要.所以如果哪位朋友有兴趣,可以完善下,如果你写好了,也希望能给我发来一个哦.谢谢

用户名密码都是admin,在界面上右键操作.
 
后退
顶部