spcomm问题求教!急急急!(100分)

  • 主题发起人 主题发起人 faint83
  • 开始时间 开始时间
F

faint83

Unregistered / Unconfirmed
GUEST, unregistred user!
用spcomm进行串口通讯时碰到如下问题
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: array of char;
str1:string;
result:double;
i,j: integer;
begin
try
setlength(str,bufferlength);
move(buffer^,Pchar(str)^,bufferlength);
str1:='';
for j:=0 to 11 do
begin
if (str[j]=#02) and (str[j+11]=#03) then
begin
for i:=j+2 to j+7 do
str1:=str1+str;
result:=strtofloat(str1);
........

主要问题是 和其他进程如 qq 和摄像头的冲突问题,如果不开摄像头,可以正常接收
如果开了摄像头 我用
move(buffer^,Pchar(str)^,bufferlength);
edit1.text:=inttostr(bufferlength);
查看 bufferlength 值,发现其固定为8。因为我只接收下位机数据,下位机发来的一贞数据由12组组成,其中的第3组到第8组为数据。这样导致常常无法接收完整的一贞数据来进行处理
而不开摄像头或qq时 bufferlength为8到80跳动,接收正常!这是第一个运行点的情况,且readintevalouttime只能设为15 否则读不到数据

第二个运行点 :下位机一贞数据为8组 开摄像头后虽然bufferlength也被固定为8,但可正常显示,readintevalouttime为500 这个点运行正常

主要是第一个点的问题 ,本来以为是摄像头冲突,今天发现开qq也会影响bufferlength
有人说是readintevaltimeout=15 这里有问题?超时时间太快?请教高手了 该如何解决
是否可以设bufferlength长度?
 
我觉得你没有必要设置bufferlength长度,你把 readintevaltimeout=100这样设置成默认值试试。
 
你是不是使用USB转串口的转换器?可能是你电脑的USB HUB有问题,或者驱动程序有问题。
 
to zywcd readintevaltiome<=15才能读到数据。。大于15读不到数据
to jamcky 串口是直接接九针串口 摄像头是通过pci插槽的采集卡连接。串口驱动应该没问题
 
SPCOMM 的缓冲区的默认大小为2048,默认读超时为100MS,所以当下位机连续发数据间隔小于100MS时则直到缓冲区中数据达到2048B 才触发OnReceiveData

也就是说onreceivedata时间 要么 读超时触发,要么达到2048触发。那我读出来的bufferlength长度一直是80以下或固定为8,那就是一直是读超时触发的?bufferlength是否就是当前缓冲区的长度?
 
我不知道你下位机是怎么发送数据。是连续不断发送还是怎么处理。
前一段时间在这里一个人遇到这样一个问题,后来一起在QQ解决了。
他使用上位机不停接收下位机发送的数据,但是经常遇到不完整。是不是可能遇到不完整的数据帧。造成监控系统出现问题。后来发现是一次spcomm接收数据的事件触发时,可能没有接收到一个完整包,包的一部分在下一次触发事件才回来。他使用的方式和你现在差不多,认为一次会接收到完整包。接收事件触发后,马上就在这个过程进行数据处理。后来的是这样处理的,使用全局变量接收数据,spcomm事件触发后,只是把接收到的数据追加到全局变量后面,让专门的处理程序去分析处理,在处理前检查包的完整性。
个人意见,你可以采用这样的方式试试。
 
to zywcd 是连续不断发送,和那位朋友的问题很可能是一个问题 我试试看 如果
有这一段的原代码 可以发给我吗?不胜感谢
 
我在做串口程序也存在楼主提出的现象,楼主再看下,打开一个Flash动画是不是也对接收数据有影响。
 
试试这样的方式?
var rec_str:string;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: array of char;
result:double;
i,j: integer;
str1:string;
begin
try
setlength(str,bufferlength);
move(buffer^,Pchar(str)^,bufferlength);
tstrpcopy(str1,str);
rec_str:=rec_str+str1;
end;
当你处理完接收数据以后,记住清除rec_str:='';
 
建议你还是用TurboPower 的Apro中的ApdComport串口控件。
 
问题解决 就是按zywcd的办法
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部