使用spcomm控件读、写串口操作,有时可以写成功,有时写不成功,请各位大虾帮帮忙 (50分)

L

lsha

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在遇到这样的问题,我的程序思路是这样的,用spcomm打开串口后,
向串口发!abc*,串口连接的模块就会给我发回一些数据,
只是我用WriteCommData()这个函数向串口发数据时,
有时这个函数返回True,有时返回False,感觉很不稳定。
请各位大虾帮帮忙好不好!小弟在这边先谢过了!!
我的邮箱地址:lsh78@163.net
QQ:25444343
MSN:lsh7834@hotmail.com
 
把你的代码贴出来看看
 
向串口写数据的代码
procedure TForm1.Button2Click(Sender: TObject);
var
send_txt: Pchar;
begin
send_txt := '!abc*';
try
comm1.StopComm;
comm1.StartComm;
except
Showmessage('串口打开失败!');
Exit;
end;
if comm1.WriteCommData(send_txt, 5) then
Showmessage('发送数据成功!')
else
Showmessage('发送数据失败!')
end;

spcomm控件接收串口数据的事件
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
RecStr: string;
begin
// 接收RS232的数据 //
SetLength(RecStr, BufferLength);
Move(Buffer^, PChar(RecStr)^, BufferLength);
Memo1.Lines.Add(RecStr);
end;
 
建议对COM初始化部分(参数设置以及打开等放到FORMCREAT中)
不要每次发送时都 comm1.StartComm;

试试。。。

 
to youou:还是不行
 
var
send_txt:string;
begin
if comm1.WriteCommData(pchar(send_txt), 5) then
begin
end;
end;
 
或则
procedure TForm1.Button2Click(Sender: TObject);
var
send_txt: Pchar;
begin
allocmem(length('!abc*'));
send_txt := '!abc*';
try
comm1.StopComm;
comm1.StartComm;
except
Showmessage('串口打开失败!');
Exit;
end;
if comm1.WriteCommData(send_txt, 5) then
Showmessage('发送数据成功!')
else
Showmessage('发送数据失败!')
FreeMem( send_txt);
end;
 
串口是否应该先打开,在FormCreate里先打开呢?
在 Close时,再关上串口,
在程序运行时,串口应该一直开着吧。
要不每次初始化串口,可能会出很多怪问题。
 
一般情况下,将FormCreate里完成串口的打开工作,完了后要将串口关闭
 
同意wzca
要不再查查参数设置有否对?
一般设置一些波特率,字长,停只位 就行了。其它的可以默认设置。。。

那你就单步跟踪一下看是出了什么错。。。。
 
send_txt := '!abc*';
try
comm1.StopComm;
comm1.StartComm;
except
Showmessage('串口打开失败!');
Exit;
end;
if comm1.WriteCommData(send_txt, 5) then
Showmessage('发送数据成功!')
else
Showmessage('发送数据失败!
--------------------
不要这么写了

try
comm1.StopComm;
comm1.StartComm;
except
Showmessage('串口打开失败!');
Exit;
end;
上面这些放到FORMCREATE中。。
退出程序时再将COM关掉。。
一般不会有什么问题的。。

 
已经在FormCreate里先打开呢,
在 Close时,再关上串口,
但是问题还是存在,我看了一下这个贴子,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=678999
但是他们没有把答案公布出来!!
哎!!
请各位大侠继续多多指教!!
 
这是从我原来做的项目中截取改写的,反正我用起来很好的
procedure Tfrmmain.FormCreate(Sender: TObject);
var
comname,baudrate:string;
begin
{初始化串口}
comm1.BaudRate:=19200; //波特率
try
comm1.StartComm; //打开串口
except
Application.MessageBox ('通讯串口错!','提示',0);
end;
end;


procedure Tfrmmain.Timer1Timer(Sender: TObject);
var
sbuf:Array [1..15] of byte;
begin
{定时向串口传送}
sbuf[1]=byte($EF)
if not Comm1.WriteCommData(@sbuf[1],1) then
begin
showmessage('error!');
break;
end;;//发送
end;

procedure Tfrmmain.FormClosek(Sender: TObject);
begin
timer1.Enabled:=false;
comm1.StopComm;
close;
end;

 
俺用 spcomm 操作 wavecom modem 里的一段
//****************************//
//** 打开 COM 口 **//
//****************************//
Function TComm.OpenComm(CommPort: String): Boolean;
begin
ComPort.Close;
Result := false;
ComPort.Port := CommPort;
ComPort.BaudRate := br9600; // 波特率: 9600
ComPort.DataBits := dbEight; // 数据位: 8
ComPort.Parity.Bits := prNone; // 奇偶位: None
ComPort.Parity.Check := False; // 奇偶校验位:0
ComPort.StopBits := sbOneStopBit; // 停止位: 1
ComPort.Events := [];
ComPort.FlowControl.ControlDTR := dtrEnable;
ComPort.FlowControl.ControlRTS := rtsEnable;
try
ComPort.Open;
except
nErrMessage := 'Open Comm Port Error!';
Exit;
end;
if not SendToPort('AT'+#13,'OK') then
begin
nErrMessage := 'Send AT happen Error!';
Exit;
end;
Result := true;
end;
 
谢谢agangr、youou、wzca三位大虾,分实在是太少了,对不住了!!:(
 
顶部