大家好,我是Delphi的新手,求救Delphi关于串口通信的问题,在Delphi中我用了第三方控件SPCOMM,也下了串口调试助手(精装版 v3.5) 但是在Delphi运行之后点击memo1,出现数据发送失败,在调试助手中有已发送的字节数,但却接收不到任何的字节数,请高手们帮我指点下,急!
另外能不能指导我下串口调试助手具体要怎么用,我不知道是不是我的操作问题
下面是我做串口时用的源代码(对串口这块一窍不通,所以先从网上的教程上下了一段,想先对串口进行熟悉)
unit Comm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm, Buttons;type
TFCOMM = class(TForm)
Comm6: TComm;
Btn_send: TBitBtn;
BitBtn2: TBitBtn;
memo1: TMemo;
Comm4: TComm;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure senddata;
procedure Btn_sendClick(Sender: TObject);
procedure Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); private
{ Private declarations }
public
{ Public declarations }
end;//变量说明
var
fcomm: TFCOMM;
var
viewstring:string;
i:integer;
rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}//变量说明
//var
//fcomm: TFCOMM;
//viewstring:string;
//i:integer;
//rbuf,sbuf:array[16] of byte;
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm6.StartComm;
end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm4.StopComm;
end; //自定义发送数据过程
procedure TFCOMM.senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:='' ;
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm4.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring + inttohex(sbuf[i],2)+'' ;
end;
viewstring:='发送'+ viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
if not commflg then messagedlg('发送失败!' ,mterror,[mbyes],0);
end;
//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(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($f0); //帧尾
senddata;//调用发送函数
end; //接收过程
procedure TFCOMM.Comm6ReceiveData(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[i],2)+'' ;
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
end;
procedure TFCOMM.BitBtn2Click(Sender: TObject);
begin
close;
end;end.该段源码我编译没有错,但是在运行的时候却一直出现数据发送失败,请大家指教,谢谢!!
另外能不能指导我下串口调试助手具体要怎么用,我不知道是不是我的操作问题
下面是我做串口时用的源代码(对串口这块一窍不通,所以先从网上的教程上下了一段,想先对串口进行熟悉)
unit Comm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm, Buttons;type
TFCOMM = class(TForm)
Comm6: TComm;
Btn_send: TBitBtn;
BitBtn2: TBitBtn;
memo1: TMemo;
Comm4: TComm;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure senddata;
procedure Btn_sendClick(Sender: TObject);
procedure Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); private
{ Private declarations }
public
{ Public declarations }
end;//变量说明
var
fcomm: TFCOMM;
var
viewstring:string;
i:integer;
rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}//变量说明
//var
//fcomm: TFCOMM;
//viewstring:string;
//i:integer;
//rbuf,sbuf:array[16] of byte;
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm6.StartComm;
end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm4.StopComm;
end; //自定义发送数据过程
procedure TFCOMM.senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:='' ;
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm4.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring + inttohex(sbuf[i],2)+'' ;
end;
viewstring:='发送'+ viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
if not commflg then messagedlg('发送失败!' ,mterror,[mbyes],0);
end;
//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(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($f0); //帧尾
senddata;//调用发送函数
end; //接收过程
procedure TFCOMM.Comm6ReceiveData(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[i],2)+'' ;
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
end;
procedure TFCOMM.BitBtn2Click(Sender: TObject);
begin
close;
end;end.该段源码我编译没有错,但是在运行的时候却一直出现数据发送失败,请大家指教,谢谢!!
解决方案 »
- 怎么实现用户登陆后能使用自己的信息?
- delphi 判定文本框输入值是否在0到10之间
- 控件自身释放的问题: 如何在KeyDown中Free自己?
- 关于的delphi中的指针问题(感兴趣者进,为了分数者免)
- @#@关于MSComm发送数据, 请教高手将 VC++.net 的内容译为 Delphi 7 的代码, 在线等,帮顶有分@#@
- 关于打印设置问题?
- 请问我想执行外部程序怎么办?
- InterBase的数据库如何才能转为其它格式的数据库??
- 怎样将倚天码的汉字转换成BIG5码或GB码?或有什么编辑软件可对倚天汉字进行编辑????
- 初学者的问题,有人回答我吗?我一定把我的全部分数给!
- 搞不懂这个具体哪里错了,实现不了功能
- Delphi7 调用 C 的DLL的问题,急!
comm6.BaudRate:=9600;
comm6.ByteSize:=_8;
comm6.ParityCheck:=false;
comm6.Parity:=none;
Comm6.StopBits := _1;
comm6.StartComm;这样就可以了
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm, Buttons;type
TFCOMM = class(TForm)
Comm6: TComm;
Btn_send: TBitBtn;
BitBtn2: TBitBtn;
memo1: TMemo;
Comm4: TComm;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure senddata;
procedure Btn_sendClick(Sender: TObject);
procedure Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); private
{ Private declarations }
public
{ Public declarations }
end;//变量说明
var
fcomm: TFCOMM;
var
viewstring:string;
i:integer;
rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}//变量说明
//var
//fcomm: TFCOMM;
//viewstring:string;
//i:integer;
//rbuf,sbuf:array[16] of byte;
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm6.StartComm;
comm4.StartComm;
end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm4.StopComm;
comm6.StopComm;
end; //自定义发送数据过程
procedure TFCOMM.senddata;
var
//i:integer;
commflg:boolean;
begin
viewstring:='' ;
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm4.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring + inttohex(sbuf[i],2)+'' ;
end;
viewstring:='发送'+ viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
if not commflg then messagedlg('发送失败!' ,mterror,[mbyes],0);
end;
//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(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($f0); //帧尾
senddata;//调用发送函数
end; //接收过程
procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
//var
//i:integer;
begin
viewstring:='' ;
move ( buffer^, pchar(@rbuf)^,bufferlength);
//move(buffer ,rbuf,bufferlength);
//move(buffer ,rbuf[1],bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+'' ;
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
end;
procedure TFCOMM.BitBtn2Click(Sender: TObject);
begin
close;
end;end.我用的是USB转串口的线,一共两个串口,分别是com4和com6,我本来的打算是一个串口作为接收,另一个作为发送……
我在串口这一块是完全的新手,希望大家多多帮忙!
想问下,接收和发送数据只要一个串口就可以解决了么??
还有串口调试助手具体是怎么结合Delphi用的啊,应该先运行Delphi还是串口助手啊?急
我现在改为用同一个串口进行发送和接收了,现在已经可以正常发送,但是无法正常接收,我在procedure TFCOMM.Btn_sendClick(Sender: TObject); 想调用接收函数procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); 但是无法通过编译,请各位指教这是什么原因,错误为:[Error] Comm.pas(101): Not enough actual parameters
怎么样才能正常接收数据??
procedure TFCOMM.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
//var
//i:integer;
begin
viewstring:='' ;
move ( buffer^, pchar(@rbuf)^,bufferlength);
//move(buffer ,rbuf,bufferlength);
//move(buffer ,rbuf[1],bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+'' ;
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
application.ProcessMessages;
end;
我需要编一个测试系统,需要通过两个串口分别与PLC和PC进行通信,传输数据的,所以我打算先用网上的关于串口通行的程序进行尝试
想请教下,我需要在我的测试系统中写关于底层串口的通信,如:readtesterport,writetesterport,readplcort,writeport要具体怎么写啊,我用的是SPCOMM控件。我是2个月前刚入手Delphi的,还不大懂,特别是串口这一块,请各位多多帮忙啊,急!!
还有麻烦告诉我我现在的这段程序和我要做的到底相不相关啊,到时有没有用,谢谢啊
另外两个串口互相通讯要注意接线问题,要用交叉线。另外接受端和发送端当然可以在一台机器,只要有硬件接口
我机器上还4个串口呢用了PCI转串口卡=。=
我测试时用的4头线,一个串口发,一个串口接设备,一个串口监听发出的,一个串口监听设备回送的
把^提到括号里面来就行了 pchar(@rbuf^),