串口通讯,速度不同(50分)

  • 主题发起人 主题发起人 chentieliang
  • 开始时间 开始时间
C

chentieliang

Unregistered / Unconfirmed
GUEST, unregistred user!
你好:
我编了一个串口通讯程序,时时扫描串口但接收数据,设置(波特率=19200,8位,1位,1位)
发现程序在我得电脑上接收数据很快(3毫秒),但在某一些电脑上,接收数据得速度慢了,且慢的程度不一样,我试着换了CPU,但结果还是一样的.
请问串口速度是否跟主板或者其他设备或配置有关.
 
基本没有关系,除非你用查询方式,中断方式不会出现这样的情况
 
to TK128
我用的是Timer计时器每隔1毫秒扫描一次串口(外部有个发数据的硬件和电脑串口相连),
发现情况是上面所说的,请帮我分析下原因
谢谢
 
不知道你测试时用的电脑和后来用的电脑配置是否相差很多,还有接受消息最好不要用Timer计时器,因为这个不太好。
 
我做过串口通讯程序
1、你最好不要用Timer来定时扫描串口,这样很耗资源。
2、通讯方式有二种:同步和异步方式,根据实际需求而定,可以参考API中的CreateFile、WiteFile、ReadFile用法。
>>
通讯速度跟主板或者其他设备或配置无关的,你所提供的信息不太全,不发作分析。

 
你们好:
我的程序是用轮循方式去查询挂在串口的硬件,步骤如下
1.发<询问是否有数据>命令给第一个硬件,第一个硬件接到命令后发一个响应命令上来
软件先缓存命令.在其他线程处理.
2.发<询问是否有数据>命令给第二个硬件,后面步骤一样
3.发<询问是否有数据>命令给第三个硬件,..
4....
现在是,我的硬件必须接收到询问命令才会发数据,并且硬件数量多.所以我采用Timer(2Ms)扫描.我用的是API.
COM_H:=CreateFile(pchar(COMM),generic_read or generic_write,0,nil,open_existing,0,0);//打开串行口同步方式.
ClearCommError(COM_H,dwError,@CS)
ReadFile(COM_H, inbuff,cs.cbInQue,nBytesRead,nil);

我感觉思路和方法应该没错(硬件也没错),但出现速度不一,真费解!
请各位帮忙解解.

 
我曾经发现过同样的问题。
当时用的是Mscomm控件,因为是与PLC通讯,所以有一个发送数据后,延时几十毫秒读取返回数据两步,如果读取返回不对,就表示这次发送没有成功。
同样的程序、同样的PLC,只是计算机是不同品牌,在前一工程都正常的,但在另一工程就不行了,老是提示发送没有成功。经过调试发现,如果将发送数据后,等待接收数据的延时调大20MS后,程序接收正常。所以我觉得不同的计算机,特别是不同的厂家计算机是可能会出现串口收发数据延时不一致的可能的。
 
我也发现相同的情况,应该是电脑硬件不同造成的
 
我也用串口通讯的,昨天无意中看陈宽达的《DELPHI下深度历险》中提到NT/WIN98下Timer是有精度误差的,NT下好象是10MS,98下要大点,就是说平时用的sleep(1)和sleep(10)是没有什么区别的,另外系统提供高精度的时间控制函数,不过用了一下太耗CPU资源,不知道哪位大哥有更好的解决方法......
 
用Timer控件还和当前使用计算机的系统资源,CPU资源有关
 
to nicai_wgl
精确延时
procedure Delay(Ms: dword); //毫秒
var
S1, E1, freq: Int64;
begin
//QueryPerformanceFrequency 为主频 次/秒 QueryPerformanceCounter 为当前次数.
QueryPerformanceCounter(S1);
QueryPerformanceFrequency(freq);
E1 := round(Ms*freq/1000);
E1 := E1+S1;
Repeat
QueryPerformanceCounter (freq);
Until freq>=E1;
end;
 
用Timer查询接收的方法很笨的,采用事件通知的办法吧!
 
最好是使用线程吧
 
QueryPerformanceCounter(S1);
QueryPerformanceFrequency(freq);这两个函数也试过太耗CPU资源。
我们现在用的也是轮询串口方式,写没有问题,读是次数限制,耗资源,后来我改成延迟+次数限制,可是放MP3或运行大的程序的时候通讯就不好,怀疑是延迟不准,后来看了些控件的源代码,一般是用线程+事件的方式来读数据,小弟API不太熟,那位大哥有现成的供小弟参考一下。
 
使用Timer控件和电脑资源占有率有关,如果系统很忙的话会有延迟,而且时间不固定,想要获得高精度的时间控制,请示用高频计数器或者使用多媒体定时器。
 
我也遇到同样的问题,我的也是用TIME控件来控制循环,和楼主的情况一模一样,在我的机器上可以,但拿到别人的机器上一试,竟然接收不到信号,我的解决办法是将延时加长,我使用的是SPCOMM控件.因为我们这个对时间要求不是很高.
 
to 草木心
高频计数器或者多媒体定时器,是什么东东,哪里有[?]
 
大家好:
用线程+事件是监听串口的好办法,
我现在的外部硬件情况必须要用轮循的方式,必须一问一答.否则数据会对不上号.
所以我的做法是:
发查询-等待串口数据(if 超次 or 接到数据 then 中断,一次2ms).
发下一台查询-....
...
有没有更好的方法,请大侠们给一个更好的.

 
可以的啊。
线程+事件没有问题的嘛 事件接收到数据后立即返回一个信号嘛! [^]
 
To chenjianzu
我第一次就用线程,但我感觉线程不很稳定,只要出点异常,就自动中断了.并且无法用Try
except 拦截.
 
后退
顶部