在spcomm控件里,有一个语句不会用。诚恳求助大虾。(30分)

  • 主题发起人 主题发起人 carrie4002
  • 开始时间 开始时间
C

carrie4002

Unregistered / Unconfirmed
GUEST, unregistred user!
在spcomm控件里,有一个语句不会用。
for i:=1 to 6 do
begin
if not form1.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(22);
str1:=str1+inttohex(sbuf,2)+'';
end;
上面form1.comm1.writecommdata(@sbuf,1)这条语句,似乎写不进通讯口的缓存里去,因为总报错“发送失败”。
诚恳求助大虾。
 
怎么没人关注呢?高手请!
 
不用循环,直接发送
form1.comm1.writecommdata(@sbuf,6);
sleep(100);//给设备接收留出时间
 
使用前要先打开串口,我想你应该知道
 
谢谢。
用串口短接的方式在单机上测试的。想测试串口是否正常通讯,
在短接时发送的数据会及时返回。所以,用这段代码想实现将
发送的内容返回,并显示在memo2里。可没反应。
端口的方式是“使用”。
到底哪里出错了?
 
你这样试试看,把sbuf转成内容放的PCHAR类型,然后直接用writecommdata(PCHAR(N),1)发送,用循环要做线程,以为发送的同时还要接收呢。
 
TO wanchi:谢谢你。看了你很多的回帖。
我测试了,应该只是接收过程没执行。字符串已经是常量,它的测试没问题。
问题是:
1、这个线程怎么做?
2、线程和接收过程二者有什么关系?接收过程的语句没有执行过。
3、我只在单机上将com1串口的2、3脚短接,发送时应该是自动返回的。
这样做测试可行吗?
我希望得到这三个问题的答案。谢谢。
 
第3个问题的回答是不行的,去买一条专门测试COM口通讯线,或交叉线;{想想看数据发送时有发送正(TX+)和发送负(TX-)接收时也是(RX+)(RX-),还有转换电平DC(+,-)短接2脚怎么可以呢};
第2个问题,串口数据接收过程的监听工作就是一个在线程中执行的无穷循环。串口通讯是有状态的,接收过程没执行没有说明数据接收标志位为0,SPCOMM控件里已经做了状态位标志。下面是SPCOMM控件里的一段源码,希望对你有所启示。
[blue]function TComm.WriteCommData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean;
var
Buffer: Pointer;
begin
if (WriteThread <> nil) and (dwSizeofDataToWrite <> 0) then
begin
Buffer := Pointer(LocalAlloc( LPTR, dwSizeofDataToWrite+1 ));
Move( pDataToWrite^, Buffer^, dwSizeofDataToWrite );
if PostThreadMessage( WriteThread.ThreadID, PWM_COMMWRITE,
WPARAM(dwSizeofDataToWrite), LPARAM(Buffer) ) then
begin
FSendDataEmpty := False;
Result := True;
Exit
end
end;

Result := False
end; {TComm.WriteCommData}[/blue]

对于第一个问题呢,我只能提供个范例,你可以参考:
---这是个创建线程的API函数,你也可以用TTHREAD类来在做----
procedure TForm1.UsedThreadClick(Sender: TObject);
var
hThread:Thandle;//定义一个句柄
ThreadID:DWord;
begin
//创建线程,同时线程函数被调用
hthread:=CreateThread(nil,0,@MyThreadfunc(你的线程函数地址),nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
end;
 
TO wanchi:
谢谢你。你的代码也许对我以后的工作有启发和帮助。
只是想对通讯有个概念,只在单机上做测试。我现在用的
com口用汇编测试过,在汇编环境里,只要接上这个com头,
发送的数据立刻会返回显示。该测试应该也可行的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3384059
我用这个地址的代码来做测试的,别人都能调通,可我的机子就不行。
我想知道原因。
 
你用串口调试助手测试一下你的串口
 
to jamcky:谢谢你。
&quot;串口调试助手&quot;?
 
没错,你也可以使用‘超级终端’
 
我不懂。怎么做?
 
3、我只在单机上将com1串口的2、3脚短接,发送时应该是自动返回的。
这样做测试可行吗?


这样做就可以了,然后打开超级终端,设置你的串口,如果你用的是2000以上系统,一定要注意串口设置,默认设置是会出现假死状态。
 
我用2000。很可能是出现了你所说的假死机。
调试时接收过程一句都没见执行。
把系统默认设置改成怎样呢?
 
楼上的各位兄弟,串口传输文件怎么传啊
有这样的控件吗,TCommPortDriver这个控件可不可以,谁有这样的控件,可否传给我
我的邮箱是guodengyun1203◎163.com
 
to jamcky:
超级终端该如何设置啊?
急等。
 
自定义的发送过程
unit Unit1;

interface

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

type
TFCOMM = class(TForm)
Comm1: TComm;
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
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;
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;


implementation
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;

{$R *.dfm}

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;

procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var i:integer;
rbuf:array[0..16] of byte;

begin

viewstring:='';

move(buffer^,pchar(@rbuf)^,bufferlength);

for i:=0 to bufferlength-1 do

viewstring:=viewstring+inttohex(rbuf,2)+' ';

viewstring:='接受'+viewstring;

memo1.lines.add(viewstring);

memo1.lines.add('');

end;

end.
 
是串口流控设置,如果你软件能够控制好串口的收发,就把流控去掉,要是对方设备强烈要求采用流控的话,就不能够去掉了,那么你就需要严格按照标准串口制作连线了,普通的串口只需要 2、3、5三个脚就可以了,要是要求流控的话,那么9个脚都必须做,就像modem连线。
一般测试时,我们都去掉了流控设置,只用到2、3、5(DB9),要是在同一串口自环,那么只需要2、3短接就行了。要是自环测试不通过,那么,你的串口有故障。
对于spcomm控件,也是需要对串口设置的,默认情况一般是不需要流控的,至于有没有接收到,你可以在发送、接收部分设置断点,进行调试,看有没有进入你的代码。首先看数据发送部分有没有执行,其次,接受部分能不能够进入断点。
 
to jamcky,:
测试后应该是接收代码没有执行。
你告诉我是在超级终端的设置问题,想问问你,只单机测试,
超级终端怎样设置?就是单个计算机的状态,外加2、3脚短接的串口。
 
后退
顶部