关于从串口提取数据后的处理问题(50分)

  • 主题发起人 主题发起人 onet
  • 开始时间 开始时间
O

onet

Unregistered / Unconfirmed
GUEST, unregistred user!
把工业机输出的数据通过串口接收到数据库中DB1.db。由于事先不知道数据格式,所以数据库表中只定义了一个宽字段REC,将输出的数据全放在这个字段中。取数据相关代码如下:
QueryData.SQL.Clear;
QueryData.SQL.Add('insert into db1 values (:Rec)');
QueryData.ParamByName('Rec').AsString:=bakS; //变量bakS是取得的一条完整的数据记录,将其放入数据库REC字段中。
根据得到的数据,知道了数据的格式。按照得到的数据格式,建立一张新数据表DB2.db,字段与其宽度和工业机输出的一样,更改程序代码如下:
QueryData.SQL.Clear;
QueryData.SQL.Add('insert into db2 '+
'(audt,typ,st,strt,date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,cr cos,'+
'acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val) values'+
'(:audt,:typ,:st,:strt,:date/time,:end time,:cr sw#,:ani sta#,:cr sta#,:cr tg#,:cr ckt#,'+
':cr cos,:acc cod,:sel fac,:sel sta#,:sel tg#,:sel ckt#,:sel pat#,:dialed number,:code val)');
QueryData.ParamByName('audt,typ,st,strt,date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,'+
'cr cos,acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val').AsString:=bakS;
这样做的目的是想让工业机输出的数据可以“对号入座”,但程序编译运行后,会有错误提示:
QueryData:parameter'audt,typ,st,strt,date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,cr cos,acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val'not found
为什么会提示找不到这些参数?怎样做可以达到目的?
 
怎么没人回答我呀??[:(]
 
(:audt,:typ,:st,:strt,:date/time,:end time,:cr sw#,:ani sta#,:cr sta#,:cr tg#,:cr ckt#,'+
':cr cos,:acc cod,:sel fac,:sel sta#,:sel tg#,:sel ckt#,:sel pat#,:dialed number,:code val
你这样写是多个参数.
而你这样写:
QueryData.ParamByName('audt,typ,st,strt,date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,'+
'cr cos,acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val').AsString
是一个参数.

多看看基础书吧!!!
 
......
querydata.sql.clear;
querydata.sql.add('insert into db1(field1,field2,field3...)
values(:string1,:string2,:string3....)');
querydata.parambyname('string1').asstring:=list.strings[0];
querydata.parambyname('string2').asstring:=list.strings[1];
querydata.parambyname('string3').asstring:=list.strings[2];
......
是这样操作多个参数吗?
 
我按照这个思路将程序改后重编译,错误提示没有了,但数据库收不到任何数据,这是为什么??是方法错误吗?
 
把问题分开解决:
1、看看是否确实从串口收到数据
2、模拟把固定数据保存到表中看是否有问题
3、如果前两者都没问题再一起调试
 

这个问题还没解决呀??
 
我现在在做计费程序。因为不知道要接收的数据格式,所以在数据表中定义一个长字段,将一条计费信息全收到一个字段中(现已能正确接收),然后根据得到的数据格式重新重义一个数据表,能够将一条计费信息(包含多个字段)放入各个字段,而不是一个字段中。根据这个想法,我改动程序,但程序运行后,数据表接收不到数据,这是什么原因?
 
你把代码贴出来呀
 
问题是你是否接收了有效的数据?
接收了有效的数据后采用这样方式不妥。
 
原码如下:
procedure TFormMain.MSCommT1Comm(Sender: TObject);
var
s:string;
bakS:string;
begin //串口事件
s:=MSCommT1.Input; //读串口数据
RevData:=RevData+s; //保存到RevData中
if(pos(#10,s)<>0)or(pos(#13,s)<>0) then //如果是回车符
begin
list.add(RevData); //添加RevData到list列表中
RevData:='';
if not IfBusy then //如果"正在存盘",则退出。因为异步存盘的过程可能很久。
begin
IfBusy:=true; //设置"正在存盘"
while list.Count>0 do
begin
bakS:=list.strings[0]; //取出list列表中的一项
while copy(bakS,1,1)=#0 do delete(bakS,1,1); //把行首多余的0去掉
QueryData.SQL.Clear;
QueryData.SQL.Add('insert into ReceiveData '+
'(audt,typ,st,strt date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,cr cos,'+
'acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val) values'+ '(:audt,:typ,:st,:strt date/time,:end time,:cr sw#,:ani sta#,:cr sta#,:cr tg#,:cr ckt#,'+
:cr cos,:acc cod,:sel fac,:sel sta#,:sel tg#,:sel ckt#,:sel pat#,:dialed number,:code val)');
Querydata.parambyname('audt').asstring:=list.strings[0];
Querydata.parambyname('typ').asstring:=list.strings[1];
Querydata.parambyname('st').asstring:=list.strings[2];
Querydata.parambyname('strt date/time').asstring:=list.strings[3];
Querydata.parambyname('end time').asstring:=list.strings[4];
Querydata.parambyname('cr sw#').asstring:=list.strings[5];
Querydata.parambyname('ani sta#').asstring:=list.strings[6];
Querydata.parambyname('cr sta#').asstring:=list.strings[7];
Querydata.parambyname('cr tg#').asstring:=list.strings[8];
Querydata.parambyname('cr ckt#').asstring:=list.strings[9];
Querydata.parambyname('cr cos').asstring:=list.strings[10];
Querydata.parambyname('acc cod').asstring:=list.strings[11];
Querydata.parambyname('sel fac').asstring:=list.strings[12];
Querydata.parambyname('sel sta#').asstring:=list.strings[13];
Querydata.parambyname('sel tg#').asstring:=list.strings[14];
Querydata.parambyname('sel ckt#').asstring:=list.strings[15];
Querydata.parambyname('sel pat#').asstring:=list.strings[16];
Querydata.parambyname('dialed number').asstring:=list.strings[17];
Querydata.parambyname('code val').asstring:=list.strings[18];
if (length(QueryData.ParamByName('audt,typ,st,strt,date/time,end time,cr sw#,ani sta#,cr sta#,cr tg#,cr ckt#,cr cos,acc cod,sel fac,sel sta#,sel tg#,sel ckt#,sel pat#,dialed number,code val').AsString)>10) then
begin //如果数据长度小于或等于10,说明是程控机输出的非计费记录
try
QueryData.ExecSQL; //存盘
except
application.ProcessMessages;
try QueryData.ExecSQL;
except
end;
end;
end;
list.delete(0);
end;
IfBusy:=false; //解除"正在存盘"
end;
end;
end;
 
有人可以帮帮我吗?
 
建议你将整个过程拆成两个过程来测试:
第一个就是串口采集的,可以存到一个临时文件来检查是否成功;
第二个才是数据转换,可以利用上面成功的临时文件来测试;
这样有助于分析问题;即使你坚持用一个过程来实现,最后也可以合成一个的呀[:D]
 
我建议你安装一个串口调试程序
 
To:中鼎
你有什么好的"串口调试程序"可以推荐的么[?]
我最近也在做些软串口的相关程序,找不到好写的串口监控程序[:(]
先谢了不[:)]
 
后退
顶部