串口通信中死机现象的处理(100分)

  • 主题发起人 主题发起人 hns
  • 开始时间 开始时间
H

hns

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个串口发送的程序,一边发送,另一边接收,但偶尔会死机,必须重新启动机器才行。请问各位高人,是不是有些出错未处理好
 
可否发给我一份
zeropointzero@21cn.com
 
如果你用线程控制,就不会死机,顶多死线程.死机一般是缓冲区溢出造成的
 
可否发给我一份:xiaohuaw@263.net

 
使用控件,还是直接对端口操作?
最好把你认为有问题的代码贴出来。
当然,你也可以看一下,spcomm 的原码。
 
我的程序:
procedure TFormReal.FormShow(Sender: TObject);
var
Bool : boolean;
TimeOut : _COMMTIMEOUTS;
//wNum : Cardinal; //LPDWORD;
//ErrorCode: longint;
//Pol : Overlapped;
begin
SuccessBool := true;
TabBpGst.Active := true;
SecondCount := 0;
hComm:=CreateFile('COM2',GENERIC_READ or Generic_Write,0,nil,
Open_Existing,File_Attribute_Normal or File_Flag_Overlapped,0);
if (hComm = INVALID_HANDLE_VALUE) then
begin
ShowMessage('串口无法打开!');
application.Terminate;
end;

//设置串口缓冲区
Bool := SetupComm(hComm,4096,4096);
if Bool = false then
begin
ShowMessage('设置串口失败');
application.Terminate;
end;

GetCommState(hComm,lpDCB);
lpDCB.BaudRate := CBR_9600;
lpDCB.ByteSize := 8;
lpDCB.Parity := NoParity;
lpDCB.StopBits := 0;
Bool := SetCommState(hComm,lpDCB);
if Bool = false then
begin
ShowMessage('设置串口失败');
application.Terminate;
end;

Bool := GetCommTimeouts(hComm,TimeOut);
if Bool = false then
begin
ShowMessage('设置串口失败');
application.Terminate;
end;

TimeOut.ReadTotalTimeoutConstant := 12000;
Bool := SetCommTimeouts(hComm,TimeOut);
if Bool = false then
begin
ShowMessage('设置串口失败');
application.Terminate;
end;

TimerInterval.Enabled := true;

end;



写串口是在一个一秒钟触发一次的定时中做的,是不是定时触发后需要先关闭,处理完再开启定时?请各位大侠发表高见
 
我以为hns说"定时触发后需要先关闭,处理完再开启定时 "正确,
定时器(线程)时进行串口读写操作时,需要将读区信息“写回”主线程窗口,
在Delphi 线程中调用S...(XXX),造成当前线程假停止进入程序主线程执行“写回”操作
如果一切正常的话,大概不会当机;否则。。。。。
我在实际编程中使用的是Aysnc32的组件,出现过类似问题。解决办法较土:
串口读写操作成功时,采用PostMessage( )通知主窗口,主窗口采用消息过程来响应处理。
我的例子:
采样线程中
procedure thReadOmn.Execute;
begin
repeat
if rdThreadTerminated then Terminate;
//加入读写串口操作
PostMessage(MainForm.Handle,CM_POINTCRV,0,0);
//CM_POINTCRV 位自定义消息
until Terminated;
end;
 
多人接受答案了。
 
后退
顶部