使用delphi编写的程序,SPCOMM控件,以前发送和接收数据都正常,后来不知什么原因就会出现串口接收数据不全的情况,接收部分代码主要是
begin
setLength(str,Bufferlength);
viewstring:='';
move(buffer^,rbuf,bufferlength);
//检查校验和
if checksum(rbuf,bufferlength)=false then
exit;
下面是校验处理部分了,并且有的时候串口发送不出去数据,单步调试的话就会提示access violation at address 0044D97E in module 这样的错误,不知道这是怎么回事?大家帮着看看,谢谢!下面是发送代码
procedure senddata(length: integer);
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to length do
begin
if not welcome.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
sleep(2); viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
end;
end;
begin
setLength(str,Bufferlength);
viewstring:='';
move(buffer^,rbuf,bufferlength);
//检查校验和
if checksum(rbuf,bufferlength)=false then
exit;
下面是校验处理部分了,并且有的时候串口发送不出去数据,单步调试的话就会提示access violation at address 0044D97E in module 这样的错误,不知道这是怎么回事?大家帮着看看,谢谢!下面是发送代码
procedure senddata(length: integer);
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to length do
begin
if not welcome.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
sleep(2); viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
end;
end;
其实串口通讯用什么组件都没关系,但是要理解串口通讯的原理。组件都是封装 windows串口通讯的几个函数。
这时用户拔掉串口设备,这时我的串口组件无法操作串口了,也无法关掉,一操作就会报“系统错误”
这时程序就死了! 我目前的解决方法是在操作前都会检测一下串口设备是否接在电脑上。因为我们的串口设备都在注册表中有
注册。暂时可以解决这个问题。 新问题来了,如果用户拔下了设备,又插上了设备。那么我的程序又能检测到设备,但是因为comport串口中断了,所以
操作时还是会报错,程序会挂掉。 我现在的解决方法是,如果串口报异常,程序给用户一些提示信息后 就自动结束掉,如果我还检测到有串口设备,就重新运行一个实例。 程序如何才能在串口设备不存在的情况,对于先前已打开的串口,正常关闭,程序不挂掉?