从SPCOMM中读取数据(100分)

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

zhangyq2125

Unregistered / Unconfirmed
GUEST, unregistred user!
所有数据为ASC码,10位一组,第一位为起始位,第十位为停止位,中间位为数据位,设备与计算机用RS232端口联接。
 
我先给你个测试程序,看能不能收到?

能收到再给你源码!!
 
现在收到信号没问题,就是看不懂。
FE0603000000
FE0603000000
FE0603000000 //以上为数据为0时
FE0600009E001E00 //以下为有数时
FE06030078C0CF00
FE0600001E301E00
FE060300809E00
数据为十六制,但我对接取的东西无法分出有用的部分
 
这是地磅有关的东西, 不知道数据格式,只知道是10位ASC码
 
........
难道你就没有协议吗?
 
没有,应该分析出来就可以了,谢谢了!
 
你用ascii码显示看看?

还有应该是你自己最好分析.

磅一次东西,就接收.
接收的东西与磅显示的东西比较呀
 
var
Data,Temp:string;
Begin
Temp:='FE06030078C0CF00';
Data:=COPY(Temp,3,12); //有用的数据部份
//根据有用的数据,分离数据程序,要清楚数据格式才能分析出来
End;
本人经常写关于16进制与ASCII转换的程序.

 
石嶷山友同志说的情况应该是对的,但怎么转换成ASC码或分析出有用的部分
 
我以前用过一个串口调试工具。先调试出可用参数,再在程序里设置就可以了。不知道这个方法对你有没有用。
 
问题我已解决,谢谢大家!
var s:string;
i:integer;
begin
s:='';
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=2 to bufferlength do begin
s;=inttostr(rbuf div 16)+inttostr(rbuf mod 16)+s;
end; //接收数据为十进制要转换为十六制,实际接收:255/96/37/0/0,吨数为2560
另外存有13360:255/1/96/51/1的现象经观察,255后的无实际意义.但出现原因还不知道,我想是不是吨数变化过程产生的垃圾.

另外如何防错误的发生,如端口打开不正常的处理???
 
我想问个问题
是不是使用SPCOMM时要在USES里面添加什么?
为何我用时都会提示在move(buffer^,pchar(@rbuf)^,bufferlength);
这出错?
[Error] Unit1.pas(159): Pointer type required
这是什么原因?
请大家教教我,先谢了!
 
首先要先装SPCOMM 控件,然后就可以正常使用呀
 
>>>另外如何防错误的发生,如端口打开不正常的处理???


try
....
except
//错误处理
end;
 
我安装了SPCOMM,在SYSTEM里也可以找到,但在使用时会出错
源码如下:
unit Unit1;

interface

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

type
Tfcomm = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Comm1: TComm;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure comm1receivedata(sender:tobject;buffer:pointer;bufferlength:word);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fcomm: Tfcomm;
i:integer;
viewstring:string;
rbuf,sbuf:array[1..6] of byte;
implementation

{$R *.dfm}


procedure senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(2);
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
viewstring:='发送'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
if not commflg then messagedlg('发送失败',mterror,[mbyes],0);
end;
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
viewstring:='';
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+inttohex(rbuf,2)+'';
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end;

procedure Tfcomm.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;

procedure Tfcomm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;

procedure Tfcomm.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($f0);
sbuf[2]:=byte($01);
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($01);
sbuf[6]:=byte($0f);
senddata;
end;

end.
它会在move(buffer^,pchar(@rbuf^),bufferlength);这行提示出错
Build
[Error] Unit1.pas(63): Pointer type required
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
请问这个怎么决解?
 
我对串口和地磅程序很熟,有事和我联系,我目前在攻关象地磅打印机一样快的电脑打印。
 
它会在move(buffer^,pchar(@rbuf^),bufferlength);这行提示出错

改为:move(buffer^,pchar(@rbuf)^,bufferlength);就OK了
 
谢谢,改了之后真的可以了。
 
不客气,有机会的话给点分数。
我的QQ:5438418 MESSAGE:CANAANIT@HOTMAIL。COM
有对串口及单片机51系列编程的朋友请加我。
 
又有一个问题出现了
改了之后程序是可以运行
可是没有接收到数据
能不能再帮我看一下是什么问题!
 
后退
顶部