使用SPCOMM控件与串口通信,为什么收不到下位机返回的数据??? ( 积分: 100 )

  • 主题发起人 主题发起人 jinms
  • 开始时间 开始时间
J

jinms

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用SPCOMM控件连接汇邦的转速表,发送完读测量值的数据后,没有返回值,
转速表连在我机器的COM1口上;
我用我的发送程序发送数据,没问题,COM1发的数据,COM2用超级终端显示都能正确收到;
其中读测量值的数据格式和转速表返回的数据格式如下:
主方发送帧格式信息如下:
地址 代码 地址 字数 CRC16
01 03 高位 低位 高位 低位 高位 低位
00 04 00 03 40 CA
------------------------------------------------------------------------------
从方应答发送帧格式信息如下:
地址 代码 数据字节长度 数据 CRC16
01 03 06 00 03 0D 41 00 02 79 84
-------------------------------------------------------------------------------
各位大侠帮我看看问题可能出在哪里,代码如下:
-------------------------------------------------------------------------------
unit Unt_send;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls, Buttons, ExtCtrls, CPort;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Timer1: TTimer;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
BitBtn2: TBitBtn;
Edit3: TEdit;
Label1: TLabel;
Edit4: TEdit;
Label2: TLabel;
Edit5: TEdit;
Label3: TLabel;
CheckBox1: TCheckBox;
Edit6: TEdit;
Label4: TLabel;
Comm1: TComm;
ComPort1: TComPort;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.StartComm;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
tmpStr :string;
fg :Boolean;
begin
if BitBtn1.Caption='发送数据'then
begin
BitBtn1.Caption :='停止';
tmpStr :='010300040003';
Comm1.WriteCommData(pchar(tmpStr) , length(tmpStr));
end
else begin
BitBtn1.Caption :='发送数据';
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Comm1.StopComm;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpStr :string;
begin
SetLength(tmpStr , BufferLength);
Move(Buffer^,Pchar(tmpStr)^,BufferLength);
memo1.Lines.Add(tmpStr);
end;
end.
 
我使用SPCOMM控件连接汇邦的转速表,发送完读测量值的数据后,没有返回值,
转速表连在我机器的COM1口上;
我用我的发送程序发送数据,没问题,COM1发的数据,COM2用超级终端显示都能正确收到;
其中读测量值的数据格式和转速表返回的数据格式如下:
主方发送帧格式信息如下:
地址 代码 地址 字数 CRC16
01 03 高位 低位 高位 低位 高位 低位
00 04 00 03 40 CA
------------------------------------------------------------------------------
从方应答发送帧格式信息如下:
地址 代码 数据字节长度 数据 CRC16
01 03 06 00 03 0D 41 00 02 79 84
-------------------------------------------------------------------------------
各位大侠帮我看看问题可能出在哪里,代码如下:
-------------------------------------------------------------------------------
unit Unt_send;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls, Buttons, ExtCtrls, CPort;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Timer1: TTimer;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
BitBtn2: TBitBtn;
Edit3: TEdit;
Label1: TLabel;
Edit4: TEdit;
Label2: TLabel;
Edit5: TEdit;
Label3: TLabel;
CheckBox1: TCheckBox;
Edit6: TEdit;
Label4: TLabel;
Comm1: TComm;
ComPort1: TComPort;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.StartComm;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
tmpStr :string;
fg :Boolean;
begin
if BitBtn1.Caption='发送数据'then
begin
BitBtn1.Caption :='停止';
tmpStr :='010300040003';
Comm1.WriteCommData(pchar(tmpStr) , length(tmpStr));
end
else begin
BitBtn1.Caption :='发送数据';
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Comm1.StopComm;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpStr :string;
begin
SetLength(tmpStr , BufferLength);
Move(Buffer^,Pchar(tmpStr)^,BufferLength);
memo1.Lines.Add(tmpStr);
end;
end.
 
Comm1.WriteCommData(pchar(tmpStr) , length(tmpStr));
这句你为什么不向下面的这样写啊!你动态跟踪的时候能保证你写入的数据就是你给出的数据吗?
Move(Buffer^,Pchar(tmpStr)^,BufferLength);
 
to :我就是一个问题
先谢谢你的关注,我用我的发送程序发出‘010300040003’
在超级终端监测的COM2口上收到的就是发出‘010300040003’
应该没问题,但不知为什么,下位机就不给返回数据
 
每次发送的时候要清除读写缓冲区的内容
你读取数据的时间间隔是多少?
 
TO:wanshi131
每次发送的时候要清除读写缓冲区的内容
-----------------------------------
怎么清除读写读写缓冲区的内容??
///////////////////////////////////
你读取数据的时间间隔是多少?
-----------------------------------
ReadIntervalTimeout :=100
 
PurgeComm(Comm1.hCommFile, PURGE_RXCLEAR + PURGE_TXCLEAR);//清发送和接收缓冲区

你可以把设置长一点试试,也可以直接引用SPCOMM.PAS调试一下看看问题在什么地方
 
我再试试
 
不知道需要发送的数据格式是怎么样的,这你需要确定好了,我想你要发的数据不会十进制的吧?
 
串口的波特率等参数设置是否正确,看看设备的串口工作参数。
 
用 PComm 试试,这里有基于 PComm 的控件。
http://www.anylib.com
 
看看与下位机的通讯协议,估计是:你发给下位机的数据格式有问题,使得下位机无应答,
因而理所当然的,上位机接不到数据
 
谢谢各位大侠的关心,此题已解决,是因为下位机的通讯规约太旧了,参数的地址已经发生变化,所以取不到数
 
汇邦公司下位机通地址我发给你了
 
多人接受答案了。
 
后退
顶部