用SPCOMM3.0竞然有这样的问题.请大虾们相助.. ( 积分: 20 )

  • 主题发起人 主题发起人 sxwy
  • 开始时间 开始时间
S

sxwy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在使用SPCOMM控件时,要动态改变comm1的参数,比如要变换波特率等,但是每次将comm1参数赋值过去后,再comm1.START,然后发送数据,然后再关闭,但在实际的过程中却发现comm1的参数跟本没有随着我的每次赋值而改变.
我是这样用的.
procedure TForm1.Button1Click(Sender: TObject);
begin
setcom('COM2','9600,n,8,1');//在这个过程里我会调用不同的参数来改变comm1的值
comm1.StartComm ;//打开
//发送过程
comm1.stopcom;
end;
问题的关键就是在于上面的过程里setcom,我在这个过程里改变了comm1的配置,但改变配置后再用COM.START,却发现没有改过来。真是怪事。。。更改参数过程如下。
function tform1.setcom(comname:string;seting:string):boolean;//传入COM名和参数
var tmp:tparity;
c_size:tbytesize;
baudrate,parity,bytesize,stopbit:string;
i,j,k,ilen:integer;
begin try
ilen:=length(seting);
i:=pos(',',seting);//寻找','的位置
baudrate:=copy(seting,1,i-1);//取波特率
parity:=copy(seting,i+1,1);//取校验位
bytesize:=copy(seting,i+3,1);//取数据位
stopbit:=copy(seting,i+5,3);//取停止位
comm1.CommName :=comname;//赋值端口名
comm1.BaudRate :=strtoint(baudrate);//赋值波特率
comm1.Parity:=resultparity(parity);//赋值校验位
comm1.ByteSize :=resultbytesize(bytesize);赋值数据位
comm1.StopBits :=resultstopbit(stopbit);//赋值停止位
setcom:=true;
except
setcom:=false;
end;
end;
 
我在使用SPCOMM控件时,要动态改变comm1的参数,比如要变换波特率等,但是每次将comm1参数赋值过去后,再comm1.START,然后发送数据,然后再关闭,但在实际的过程中却发现comm1的参数跟本没有随着我的每次赋值而改变.
我是这样用的.
procedure TForm1.Button1Click(Sender: TObject);
begin
setcom('COM2','9600,n,8,1');//在这个过程里我会调用不同的参数来改变comm1的值
comm1.StartComm ;//打开
//发送过程
comm1.stopcom;
end;
问题的关键就是在于上面的过程里setcom,我在这个过程里改变了comm1的配置,但改变配置后再用COM.START,却发现没有改过来。真是怪事。。。更改参数过程如下。
function tform1.setcom(comname:string;seting:string):boolean;//传入COM名和参数
var tmp:tparity;
c_size:tbytesize;
baudrate,parity,bytesize,stopbit:string;
i,j,k,ilen:integer;
begin try
ilen:=length(seting);
i:=pos(',',seting);//寻找','的位置
baudrate:=copy(seting,1,i-1);//取波特率
parity:=copy(seting,i+1,1);//取校验位
bytesize:=copy(seting,i+3,1);//取数据位
stopbit:=copy(seting,i+5,3);//取停止位
comm1.CommName :=comname;//赋值端口名
comm1.BaudRate :=strtoint(baudrate);//赋值波特率
comm1.Parity:=resultparity(parity);//赋值校验位
comm1.ByteSize :=resultbytesize(bytesize);赋值数据位
comm1.StopBits :=resultstopbit(stopbit);//赋值停止位
setcom:=true;
except
setcom:=false;
end;
end;
 
COMM1和COM是一个东西吗?
 
是的.我的思路是每次按下BUTTON后,都要跟据不同的串口配置再对COMM1进行配置,然后再COMM1.START,然后再发送数据,然后再将COMM1.STOPCOM.但是有的时候COMM1的配置改变了,有的时候却还是按照上一次的配置发数据,我用了一个串口调试工具在监视才发现这个现像的,但到最后,我在COMM1.START后,加入一定的延时,然后再发送数据,有一点效果,但还是不稳定.真是怪事.
 
我觉得是你的配置代码有问题,和控件无关。
你在每次COMM1.START前用MESSAGEBOX把配置显示出来看一下
 
不是呀.我现在如果不用我的那个SETCOM函数,直接在COMM1的面板属性里更改波特率,也会出现更改不过来的现像,真是怪事呀.请问你有QQ吗,能否把源码发给你看看.
 
我没QQ,发我邮箱吧
maxim88@tom.com
 
我发了,你收到了吗.请你看一下.
 
更改串口和波特率之前,要先Comm1.StopCom,然后修改,之后再Comm1.StartCom
 
我是这样的呀,我的第一帖就是这样写的呀.在串口没有打开之前进行配置,然后再COMM1.START,然后是发送过程,然后再COMM1.STOPCOM,第二次发送依然是要先配置串口,然后再COMM1.START,然后发送数据,再COMM1.STOPCOM.过程是没有错的.不知哪里错了.没有办法了..
 
看了一下你的程序,有一些问题。
1.你在打开串口后立即启动发送过程,这样会出现没有发送的现象,解决办法是打开串口后SLEEP(10),我测试最小要SLEEP(2)再发送才能成功,你的参数修改不正确可能也与此有关。。
2.数据发送需要时间,你在启动发送过程后立即关闭了串口,所以会发送失败或发送不全。
3.建议你像其它串口调试软件一样,设置一个独立的“打开/关闭串口”按钮,参数修改和串口的开闭均在此按钮事件中处理。
 
spcomm组件当你修改波特率是无须重初始化端口
 
我的设置串口参数过程如下,请你们看看,现在是有时能正常设置成功,有时不能;
function tform1.setcom(comname:string;seting:string):boolean;//传入串口名,参数
var tmp:tparity;
c_size:tbytesize;
baudrate,parity,bytesize,stopbit:string;
i,j,k,ilen:integer;
begin//9600,n,8,1
try
ilen:=length(seting);
i:=pos(',',seting);
baudrate:=copy(seting,1,i-1);
parity:=copy(seting,i+1,1);
bytesize:=copy(seting,i+3,1);
stopbit:=copy(seting,i+5,3);
comm1.CommName :=comname;
comm1.BaudRate :=strtoint(baudrate);//波特率
comm1.Parity:=resultparity(parity);//校验位
comm1.ByteSize :=resultbytesize(bytesize);//数据位
comm1.StopBits :=resultstopbit(stopbit);//停止位
setcom:=true;
except
setcom:=false;
end;
end;
function tform1.resultparity(char:string):tparity;//返回校验位方式
begin
if char='n'then
result:=none;
if char='N' then
result:=none;
if char='m' then
result:=mark;
if char='M' then
result:=mark;
if char='o' then
result:=odd;
if char='O' then
result:=odd;
if char='e' then
result:=even;
if char='E' then
result:=even;
if char='s' then
result:=space;
if char ='S' then
result:=space;
end;
function tform1.resultbytesize(char:string):tbytesize;//数据位返回
var i:integer;
begin
i:=strtoint(char);
case i of
5:
begin
end;
6:
begin
end;
7:
begin
end;
8:
begin
end;
end;
end;
function tform1.resultstopbit(char:string):tstopbits;//停止位返回
var i:double;
begin
if char='1' then
result:=_1;
if char='1.5' then
result:=_1_5;
if char='2' then
result:=_2;
end;
延时函数如下:
procedure tform1.timedelay(t:integer); //timedelay procedure
var i:integer;
begin
i:=gettickcount();
repeat
application.ProcessMessages ;
until gettickcount-i>t;
// application.ProcessMessages ;
end;
MAXIM88大虾:不知SLEEP和我这个TIMEDELAY()延时函数有何不同。我在里面加了转移控制权指令的目的是为了延时的时候不会产生‘程序死机’的现像。在这个程序的实验中。我将SLEEP加到20串口参数设置还是不灵敏。有时候好像反映不过来一样。有时在COMM1。STOPCOM后,再SETCOM将串口参数配置后,再COMM1。START,但是串口的波特率还是上一次的波特率。真是怪事。
 
把你的程序清理了一下,这个简版的是可以正常发送的,其中BUTTON2该为串口打开按钮
你在这个基础改进一下试试。
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var tmpstr:string;
sendstr,s:string;
begin
s:=Memo1.Text;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comm1.StopComm
end;

procedure TForm1.Button2Click(Sender: TObject);
var s:string;
begin
comm1.CommName:='com1';
comm1.BaudRate:=38400;
comm1.Parity:=none;
comm1.ByteSize:=_8;
comm1.StopBits:=_1;
Try comm1.StartComm
except
ShowMessage('串口'+Comm1.CommName+'不存在或被占用');
exit;
end;
sleep(5);
s:=Memo1.Text;
Comm1.WriteCommData(PAnsiChar(s),Length(s));

end;

end.
 
我现在怀疑是不是我的SPCOM3.0有问题,我将你的代码拷贝过去都没有用.只不过将COM口改了一个为COM2,真是怪事呀.要使用COMM1还要进行其它的设置吗?
 
给你回信了,如果直接用那个可执行文件还不行那就得考虑是别的问题了
 
真是怪事,我直接人SYSTEM面板里拖放一个COMM1到窗体上,然后用你的代码放入窗体编译运行,竞然发现程序是执行了,数据没有发出去.后来我从网上下了一个例子,看了一下,直接从面板上拖放的COMM1的初始化设置与网上下的例子有点不一样,所以我想问一下,如果就直接通信的话,是否还要其它设置障,另请你能否讲一下这COMM1其它属情的作用,谢谢了.
我从网上下的例子的COMM1与我直接从SYSTEM拖放的COMM1在以下属性上不一样:
直接拖放的COMM:

comm1.Inx_XonXoffFlow:=false;
comm1.Outx_CtsFlow:=true;
comm1.Outx_DsrFlow :=true;
comm1.Outx_XonXoffFlow :=false;
comm1.ReadIntervalTimeout :=10;
comm1.XoffLimit :=10;
comm1.XonLimit :=10;
而网上下载的能发数据的COMM1的配置为:
comm1.Inx_XonXoffFlow:=true;
comm1.Outx_CtsFlow:=false;
comm1.Outx_DsrFlow :=false;
comm1.Outx_XonXoffFlow :=true;
comm1.ReadIntervalTimeout :=1;
comm1.XoffLimit :=500;
comm1.XonLimit :=500;
请问这些不一样会影响到通信吗。谢谢
 
流控制通常都是关闭的
comm1.Inx_XonXoffFlow:=false;
comm1.Outx_CtsFlow:=true;
comm1.Outx_DsrFlow :=true;
comm1.Outx_XonXoffFlow :=false;
comm1.XoffLimit :=10;
comm1.XonLimit :=10;
帧间隔一般是100,即100毫秒无数据认为一帧数据接收完成
comm1.ReadIntervalTimeout :=10;

你的SPCOMM属性设置没问题,在我机器上是正常的。
我给你发的程序能正常运行吗?
 
现在可以了,谢谢你们
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
746
SUNSTONE的Delphi笔记
S
后退
顶部