救命!读电子磅串口程序 ( 积分: 50 )

  • 主题发起人 主题发起人 zjwyyh
  • 开始时间 开始时间
Z

zjwyyh

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spomm组件,读 METTER TOLEDO M8141 电子称串口数据。 为什么能检测到有接受数据,但数据总为空呢?
急!!
谢谢!
 
我用spomm组件,读 METTER TOLEDO M8141 电子称串口数据。 为什么能检测到有接受数据,但数据总为空呢?
急!!
谢谢!
 
现在的连接方式是 地磅上有一根9针串口线连接在一个仪表盘上,称量显示数据很正常。我把线从仪表盘上拔下通过转接头连接到计算机串口。出现上面现象。
难道从地磅出来的9针线上的数据信号不是数字信号?
 
检查波特率、校验位等,最好用现成的串口测试软件试试。
 
我使用了测试软件,也反复改变了波特率、校验位、起始位等 但没有接受到任何数据,我才用delphi自己编了一段串口接受程序。发现当串口打开时,接受事件被触发了。但发现接受buffer里的数据总为空(当按acsii 码方式时)后者为0(当按16进制时)。
是不是从地磅出来的数据在进入仪表盘前还是模拟信号?
 
检查你的协议,估计是你的协议不对,得到的不是重量值
,我没有作过托力多的,我做过金钟的
 
我给你别人写的两段代码,第一段是称重显示仪设置, 第一段是过磅数据采集,
你看吧:unit c_ChengZhongYi;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, OleCtrls, MSCommLib_TLB, StdCtrls, Grids, DBGrids, Db, DBTables,
Buttons, DBCtrls;

type
TChengZhongYi = class(TForm)
Label4: TLabel;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Timer1: TTimer;
Button3: TButton;
DataSource1: TDataSource;
BitBtn1: TBitBtn;
Bevel2: TBevel;
Bevel3: TBevel;
GroupBoxCom: TGroupBox;
Rcom1: TRadioButton;
Rcom2: TRadioButton;
Label1: TLabel;
Edit2: TEdit;
MSComm1: TMSComm;
DBGrid1: TDBGrid;
GroupBox1: TGroupBox;
verify1: TRadioButton;
verify2: TRadioButton;
verify3: TRadioButton;
verify4: TRadioButton;
GroupBox2: TGroupBox;
B1200: TRadioButton;
B2400: TRadioButton;
B4800: TRadioButton;
B9600: TRadioButton;
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ChengZhongYi: TChengZhongYi;
implementation

uses PublicValues,c_DataM;

var
dk01:string[1];
verify01 :string[1];
Baud01 :string[4];
zhong01:string;
zhong02:Integer;
{$R *.DFM}

procedure TChengZhongYi.Button3Click(Sender: TObject);
begin
Close;
end;

procedure TChengZhongYi.Timer1Timer(Sender: TObject);
begin
zhong01 :=MSComm1.input;
Edit1.text :=zhong01;
zhong02 :=pos(verify01,zhong01);
if zhong02>0 then
edit2.text :=' '+IntTostr(StrToInt(copy(zhong01,zhong02+4,5)))
Else
Edit2.Text :='设置错误,无法读取数据!';
end;

procedure TChengZhongYi.Button1Click(Sender: TObject);
begin
if Button1.Caption='停 止' then
begin
Timer1.Interval :=0;
MSComm1.PortOpen :=False;
Edit2.Text :='';
Button1.Caption :='测 试';
Exit;
end;
if verify1.Checked then
Verify01 :='*'
else if verify2.Checked then
Verify01 :=')'
else if verify3.Checked then
Verify01 :='0'
else if verify4.Checked then
Verify01 :='2';
if B1200.Checked then
Baud01 :='1200'
else if B2400.Checked then
Baud01 :='2400'
else if B4800.Checked then
Baud01 :='4800'
else if B9600.Checked then
Baud01 :='9600';
if Rcom1.Checked=True Then
dk01 :='1'
Else
dk01 :='2';
if MSComm1.PortOpen=True Then
MSComm1.PortOpen :=False;
MSComm1.CommPort :=StrToInt(dk01);
MSComm1.Settings :=Baud01+',e,7,1';
MSComm1.PortOpen :=True;
Timer1.Interval :=500;
Button1.Caption :='停 止';
end;

procedure TChengZhongYi.Button2Click(Sender: TObject);
begin
if verify1.Checked then
Verify01 :='*'
else if verify2.Checked then
Verify01 :=')'
else if verify3.Checked then
Verify01 :='0'
else if verify4.Checked then
Verify01 :='2';
if B1200.Checked then
Baud01 :='1200'
else if B2400.Checked then
Baud01 :='2400'
else if B4800.Checked then
Baud01 :='4800'
else if B9600.Checked then
Baud01 :='9600';
if not gbData.TBSheZhi.FindKey(['Verify']) then
gbData.TBSheZhi.Append;
gbData.TBSheZhi.edit;
gbData.TBSheZhi.FieldByName('Name').AsString:='Verify';
gbData.TBSheZhi.FieldByName('Values').AsString:=Verify01;
gbData.TBSheZhi.Post;
gbData.TBSheZhi.FlushBuffers;
if not gbData.TBSheZhi.FindKey(['Baud']) then
gbData.TBSheZhi.Append;
gbData.TBSheZhi.edit;
gbData.TBSheZhi.FieldByName('Name').AsString:='Baud';
gbData.TBSheZhi.FieldByName('Values').AsString:=baud01;
gbData.TBSheZhi.Post;
gbData.TBSheZhi.FlushBuffers;
Application.MessageBox('已经保存当前设置,重新启动本系统后设开始生效 !','系统信息',mb_ok+mb_IconInformation);
end;

procedure TChengZhongYi.BitBtn1Click(Sender: TObject);
begin
Application.HelpContext(103);
end;

procedure TChengZhongYi.FormCreate(Sender: TObject);
var verify01,baud01:string;
begin
if gbData.TBSheZhi.FindKey(['Verify']) then
verify01:=gbData.TBSheZhi.FieldByName('values').AsString;
if gbData.TBSheZhi.FindKey(['Baud']) then
baud01:=gbData.TBSheZhi.FieldByName('values').AsString;
if verify01='*' then
verify1.Checked:=true
else if verify01=')' then
verify2.Checked:=true
else if verify01='0' then
verify3.Checked:=true
else if verify01='2' then
verify4.Checked:=true;
if baud01='1200' then
B1200.Checked:=true
else if baud01='2400' then
B2400.Checked:=true
else if baud01='4800' then
B4800.Checked:=true
else if baud01='9600' then
B9600.Checked:=true;
end;

end.
 
第一段是过磅数据采集,

unit c_gbCom;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, OleCtrls, MSCommLib_TLB;

type
TgbCom = class(TForm)
Timer1: TTimer;
Button1: TButton;
Panel1: TPanel;
Label1: TLabel;
Panel2: TPanel;
TxtZL: TEdit;
Label3: TLabel;
Panel3: TPanel;
Label4: TLabel;
Label5: TLabel;
MSComm1: TMSComm;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
gbCom: TgbCom;

implementation
uses PublicValues;
{$R *.DFM}

procedure TgbCom.Button1Click(Sender: TObject);
begin
Timer1.Interval :=0;
MSComm1.PortOpen :=False;
Close;
end;

procedure TgbCom.Timer1Timer(Sender: TObject);
var zhong01 : string;
zhong02: integer;
begin
zhong01 :=MSComm1.input;
if length(trim(zhong01))=0 then exit;
zhong02 :=pos(verify99,zhong01);
if zhong02>0 then
TxtZL.text :=copy(zhong01,zhong02+4,5);
end;

procedure TgbCom.FormActivate(Sender: TObject);
begin
Timer1.Interval :=0;
if banghao99=1 Then
MSComm1.CommPort :=mzh99
Else
MSComm1.CommPort :=pzh99;
MSComm1.Settings :=Baud99+',e,7,1';
MSComm1.InputLen :=0;
MSComm1.InBufferSize :=30;
if MSComm1.PortOpen =False then
MSComm1.PortOpen :=True ;
Timer1.Interval :=500;
end;

end.
 
谢谢老兄的回答:
但,我现在不太关心怎样读取数据,应为我借助串口测试软件,调对了波特率等参数就因该能接受到数据。
我更担心的是连线是否正确。当我从仪表盘上拔下接地磅的9针线缆时发现它是一个9针的公头,而计算机上的串口也是公头 没法连。于是我找了俩个9针串口(母头)连接头和一根,将他们的2 3 5 针连接在一起,其它线没连。 这样一头连在地磅出来的9针电缆上一头连在计算机串口上。
我连接的不正确吗? 或是这个地磅不是数字地磅,从地磅出来的电缆传出的是模拟信号,所以接受到的数据总是空或者0呢?
谢谢呀,我快急疯了.!!!!
 
做一根线将 计算机串口 和 读重器的RS232输出口 连接,然后设置好波特率等参数,应该就能读了。试试吧。
读重器一般有三个接口:
1、信号输入口(接地秤)
2、打印机输出口(接打印机)
3、RS232及大屏幕输出口(接大屏幕、计算机串口等)
 
注:读重器=仪表盘=称重显示器=。。。
计算机串口不要直接跟地秤连接,跟仪表盘的输出口连接即可。
 
谢谢,amao123, 我明天试试.
 
哎!!!! 仪表盘外面没有提供串口或并口,我今天将仪表盘打开,发现电路板下方有两组针脚, 一组标着 channel1(标号一端为1,另一端9 , 但没有4号指脚) 另一组标着channel2 ,
(标号一端1 另一端14 ,中间也缺一根针).
我现在只有外接一个串口了. 但因为没有这款 M8141仪表的资料,不知道怎样焊接9针的串口线.. 能帮上忙吗?
谢谢啊!!
 
网速太慢,大概在网上找了一下这方面的资料,没找到。找找仪表盘的说明书吧,上面应该有详细说明。现在没有资料,实在帮不上什么忙了。
 
谢谢啊,amao123兄:
我们向厂家联系了,这个表很麻烦。因为是防爆的,所以输出信号要经过光电转换设备进行转换。而且这款仪表相当老了,所以资料很难找到,最后给了个不带图示的英文说明。
我们决定放弃了。决定换一个仪表台。
谢谢各位大哥的热心帮助。再过两天,我就结贴。
衷心感谢!
 
多人接受答案了。
 
后退
顶部