spcomm控件问题(数据发送不出)

qlonsh 2008-04-28 05:07:16
程序概述:
1.先将统计数据库的记录数,每16条记录为一组数据,然后计算出有多少组数据;
2.用循环将每组数据写入单片机内
3.数据写入单片机时,要将记录如(1A2A3A4A)转换成字节(26,42,58,74),之后再用Comm1.WriteCommData方法写
数据进行第一次循环时能把数据顺利写进单片机内,但是进行第二次循环时,就不能写进了,该如何解决呢?急解决(QQ:373136091)
procedure TFrmMain.ButDownLoadTecClick(Sender: TObject);
var
i:integer;
begin
teacher:=true;
ADOQueryTecher.First;
totalteacher:=DBGridTeacher.DataSource.DataSet.RecordCount;
sectornumber:=(totalteacher div 16)+1;
if sectornumber>=217 then sectornumber:=216;
for i:=0 to sectornumber-1 do
begin
SLEEP(100);
writeTEic(i); //调入写函数
end;
end;

function TFrmMain.writeTEic(sector: integer): integer;
var
i,j:integer;
s:string;
begin
//向IC卡机写教师卡
//FOR I:=1 TO 73 DO CStr[I]:=0;
CStr[1]:=254;
CStr[2]:=$0f0; //0f0为透明传送指令;
CStr[3]:=73; //总指令长度;
CStr[4]:=0; //0为不等待应答,1=等500ms应答;
CStr[5]:=$0d; //address
CStr[6]:=$0b1; //写存储器指令
CStr[7]:=sector; //写存储器地址(0-216教师卡地址)

for i:=sector*16 to sector*16+15 do //取出数据库的值赋给数组变量
begin
if (totalteacher-1)>=i then
begin
icnumber[i-sector*16]:=ADOQueryTecher.FieldByName('icnumber').AsString; 如:1A2A3A4A
ADOQueryTecher.Next;
end
else icnumber[i-sector*16]:='00000000';
end;

for i:=0 to 15 do //将数组变量转换成字节
begin
CStr[7+i*4+1]:=(pos(icnumber[i][1],cScaleChar)-1)*16+(pos(icnumber[i][2],cScaleChar)-1);
CStr[7+i*4+2]:=(pos(icnumber[i][3],cScaleChar)-1)*16+(pos(icnumber[i][4],cScaleChar)-1);
CStr[7+i*4+3]:=(pos(icnumber[i][5],cScaleChar)-1)*16+(pos(icnumber[i][6],cScaleChar)-1);
CStr[7+i*4+4]:=(pos(icnumber[i][7],cScaleChar)-1)*16+(pos(icnumber[i][8],cScaleChar)-1);
end;

j:=0;
for i:=5 to 71 do j:=j+CStr[i];
CStr[72]:=j mod 256;
CStr[73]:=255;

try
s:='';
sleep(100);
for i:=1 to 73 do s:=s+chr(CStr[i]);
if not Comm1.SendDataEmpty then
begin
if Comm1.WriteCommData(Pchar(s),Length(s)) then SLEEP(100) else showmessage('fdf');
if Comm1.WriteCommData(Pchar(s),Length(s)) then SLEEP(100) else showmessage('fdf');
end;
except
exit;
end;
end;
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
什么呀
luxuewei5214 2008-04-29
  • 打赏
  • 举报
回复
writecommdata();
sleep();
//同一条语句为什么要执行两次?
qlonsh 2008-04-29
  • 打赏
  • 举报
回复
不好意思,我没有那句的,忘记删除了,
数据进行第一次循环时能把数据顺利写进单片机内,但是进行第二次循环时,就不能写进了,该如何解决呢?
try
s:='';
sleep(100);
for i:=1 to 73 do s:=s+chr(CStr[i]);
if Comm1.WriteCommData(Pchar(s),Length(s)) then SLEEP(100) else showmessage('fdf');
if Comm1.WriteCommData(Pchar(s),Length(s)) then SLEEP(100) else showmessage('fdf');
except
exit;
end;
小呆之家 2008-04-29
  • 打赏
  • 举报
回复

先不管你的数据是如何组织的,你用这一句代码的意义是什么呢?

if not Comm1.SendDataEmpty then //如果没有发送完成当前数据,你就接着发数据?

我一般操作串口也用SPCOMM,但我对发送的数据与接收的数据都用一个数组来完成;
且先定义成一种数据类型;
type TDataBuff=array [0..255] of char;


将对应的发送数据写入到数组内,然后发送;
var
sendbuff:tdatabuff;
sendlen:integer;


//....组织数据
comm1.startcomm;
sleep(10);
comm1.writecommdata(sendbuff,sendlen);
//...在这儿为止,就发送完成了.

把上面的功能写成一个功能函数,就可以实现发送数据到串口了;

function SendDataToCOMM(sendbuff:tdatabuff;sendlen:integer):boolean;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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