使用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;

解决方案 »

  1.   

    用串口调试助手的话收发还都正常,就是用软件就会出现这个问题,要是单步调试的话就报错,这个错step over 之后就运行到重新create form。然后可能就好了。这样会是程序编写问题么?
      

  2.   

    串口处理速度慢,延时要设置好,我以前都是sleep(100)以上,你试试,看看是不是这个原因
      

  3.   

    我在网上看用map地址查程序崩溃的位置,结果找出来的代码是commreceive函数下面begin这一句,不知道这是怎么回事呢?
      

  4.   

    我在网上看用map地址查程序崩溃的位置,结果找出来的代码是commreceive函数下面begin这一句,不知道这是怎么回事呢?我一般用 TCComp组件。 SpComm在网上常见,版本多,稳定性不了解。
    其实串口通讯用什么组件都没关系,但是要理解串口通讯的原理。组件都是封装 windows串口通讯的几个函数。
      

  5.   

    我作串口通讯程序,组件TCCom,有这样一个问题,我用串口组件打开一个串口设备,正常通讯都没有问题。
     这时用户拔掉串口设备,这时我的串口组件无法操作串口了,也无法关掉,一操作就会报“系统错误”
    这时程序就死了! 我目前的解决方法是在操作前都会检测一下串口设备是否接在电脑上。因为我们的串口设备都在注册表中有
     注册。暂时可以解决这个问题。 新问题来了,如果用户拔下了设备,又插上了设备。那么我的程序又能检测到设备,但是因为comport串口中断了,所以
     操作时还是会报错,程序会挂掉。 我现在的解决方法是,如果串口报异常,程序给用户一些提示信息后 就自动结束掉,如果我还检测到有串口设备,就重新运行一个实例。 程序如何才能在串口设备不存在的情况,对于先前已打开的串口,正常关闭,程序不挂掉?
      

  6.   

    现在出现的问题是,我用串口调试助手进行数据接收的时候,要是用QT写的串口调试助手就能正确接收,但是要是用DELPHI写的串口调试助手就会少一个字节,18个字节的数据,只能收到17个,每次都是少第14个字节,不知道这是怎么回事啊?
      

  7.   

    查看下你的BufferLength设置,是不是缓冲太小了~~~~~