我用delphi7和SPCOMM2.5做串口通信,下位机发给我的时候每个数据帧是13个字节,每次点击下游设备的按钮就发一个数据帧过来,如果对方点击的时候不抖动,我的接收是正常的,但有时候操作着急会出现下游机连续点击2到3次的情况,这个时候我的上位机接收就会报错:
'access   violation   at   0x004059bd:write   of   address   0x00dd0de8'.   Process   Stopped.   Use   Setp   or   Run   to   continue
我的串口速率是288000;是下游设备串口的规定值,是不是太快了?我查到坛子上有几个类似的帖子,但是没有得到结论,特在此请各位帮忙。项目急多谢了!

解决方案 »

  1.   

    好像也是这样的。我记得不是很清晰了
    Access   violation   at   address   00403EDA   in   module   "project1.exe",Read   of   address   00000054
      

  2.   

    应该是点击频率太快,你把按钮限制时间
    当点了一次把它禁用,过一段时间再开(Enabled=True)
      

  3.   

    接收处理处加个sleep(500)延迟试试看。
      

  4.   

    谢谢各位关心,源码跟很多帖子上的都没什么区别,就是move了一下,等我贴一下哈。
     procedure   TForm1.Comm1ReceiveData(Sender:   TObject;   Buffer:   Pointer;   
          BufferLength:   Word);   
      var   
          receivebuf:array[1..60]   of   byte;   
      begin   
          move(buffer^,pchar(@rbuf)^,bufferlength);   
      end;  
      

  5.   

    我在vb里面用mscomm接收下位机就没遇到这个问题,下位机连续点几下我都能收到,也不报错
      

  6.   

    TO xiaocongzhi 
    下游设备是买来的,也不知道他们处理按键抖动没有。不过要是连续按键,似乎在下位机就当作抖动了也不很科学。可能他们处理抖动的按键间隔时间设置的不好。
    但是我现在只能从上位机来解决了。
      

  7.   

    波特率呢,如果波特率很低的话,接收数据延迟太大,也有可能,timeouts设大点试试,
    还有接收数据时,最好是独占线程的,就是不要进行其他串口操作,这个很重要
      

  8.   

    var  
          receivebuf:array[1..60]  of  byte;  
    move(buffer^,pchar(@rbuf)^,bufferlength);  
    好可怕的指令!!!如果bufferlength这个值超出了rbuf的长度,一定会内存溢出。
    别谈什么VB,VB是傻瓜式的东西,你没有用到低级的指针操作,当然不会出问题。receivebuf是做什么的?
      

  9.   

    回“快乐老猫”,这样的指令肯定很可怕,一般都应该是用动态数组来做接收,从健壮性上来说,才更可靠,程序是我带的一个小伙子写的,我也不喜欢这样固定长度,不过,我的数据帧都是13个字节一帧的,数据上传的密度不大,最多看到过52个字节的情况(这已经是异常了),我也就许可这样操作了。
    我的解决方案是,在SPCOMM控件的自身接收事件里面(不是用户的那个接收事件,切记不要弄混),我用了一个sleep,人为地加上延时,把数据帧的间隔拉大,现在这个故障就消失了。大家如果有人遇到类似故障,可以试试,没有解决的人我们在一起探讨。