我用delphi7和SPCOMM2.5做串口通信,下位机发给我的时候每个数据帧是13个字节,每次点击下游设备的按钮就发一个数据帧过来,如果对方点击的时候不抖动,我的接收是正常的,但有时候操作着急会出现下游机连续点击2到3次的情况,这个时候我的上位机接收就会报错:
'access violation at 0x004059bd:write of address 0x00dd0de8'. Process Stopped. Use Setp or Run to continue
我的串口速率是288000;是下游设备串口的规定值,是不是太快了?我查到坛子上有几个类似的帖子,但是没有得到结论,特在此请各位帮忙。项目急多谢了!
'access violation at 0x004059bd:write of address 0x00dd0de8'. Process Stopped. Use Setp or Run to continue
我的串口速率是288000;是下游设备串口的规定值,是不是太快了?我查到坛子上有几个类似的帖子,但是没有得到结论,特在此请各位帮忙。项目急多谢了!
Access violation at address 00403EDA in module "project1.exe",Read of address 00000054
当点了一次把它禁用,过一段时间再开(Enabled=True)
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
receivebuf:array[1..60] of byte;
begin
move(buffer^,pchar(@rbuf)^,bufferlength);
end;
下游设备是买来的,也不知道他们处理按键抖动没有。不过要是连续按键,似乎在下位机就当作抖动了也不很科学。可能他们处理抖动的按键间隔时间设置的不好。
但是我现在只能从上位机来解决了。
还有接收数据时,最好是独占线程的,就是不要进行其他串口操作,这个很重要
receivebuf:array[1..60] of byte;
move(buffer^,pchar(@rbuf)^,bufferlength);
好可怕的指令!!!如果bufferlength这个值超出了rbuf的长度,一定会内存溢出。
别谈什么VB,VB是傻瓜式的东西,你没有用到低级的指针操作,当然不会出问题。receivebuf是做什么的?
我的解决方案是,在SPCOMM控件的自身接收事件里面(不是用户的那个接收事件,切记不要弄混),我用了一个sleep,人为地加上延时,把数据帧的间隔拉大,现在这个故障就消失了。大家如果有人遇到类似故障,可以试试,没有解决的人我们在一起探讨。