请问在串口小数据量通信时如何提高通信速度,急!谢谢!(200分)

  • 主题发起人 主题发起人 norlon
  • 开始时间 开始时间
N

norlon

Unregistered / Unconfirmed
GUEST, unregistred user!
上位机同时和很多下位机通信(>1000,可能达到一万+),通信协议很简单,每次通信需要得数据量很小,就几个字节。所有的下位机用485组网,上位机依次与每个下位机通信,如果每个都要100ms的话,那么全部完成一次通信就需要好几分钟,而这是不允许的。
因为通信的数据量很小,所以波特率其实并不是最主要的,主要是通信时串口的等待时间。我发现上位机发数据的时候每发完一个字节就会等待一个时间再发下一个字节,发完后去接收也要等待一个时间再去接收,而这些等待的时间在设置的时候是以毫秒为单位的,也就是说至少是一毫秒,这样让我受不了,请大家帮忙看看有什么办法可以解决这一难题?很急!谢谢大家!
 
1、多串口数据同时发送。你可以使用线程,或者定时器是多个串口的通讯同时进行。而且,你那么多设备也必须使用很多过串口吧。
2、不知道你的下位机信息返回包含地址信息没有,如果有,你是不是可以做这样的测试,一个下位机命令发出之后,不等信息返回就继续发下一个。下位机数据返回自然会触发数据接收事件。(这是个人想法,具体的可能需要测试,另外,你的通讯网络,如果是全双工的,也许可以。)
 
谢谢!
1.上位机只有一个串口,所以使用多线程也没效果
2.你说的这个方法好像可以试试,但是因为这个网络不是全双工的,我怀疑实际操作过程中的等待时间还是不能避免。
 
波特率定后用多线程
 
那我就没有理解。安装现场总线,485,422都是挂接32台设备,你的可以超过1000,甚至到1万?
 
加了hub的
 
Function TCommForm.SendData() : Boolean;
Var
i : integer;
CommFlg : Boolean;
begin
CommFlg := True;
m_Sbuf[BN] := 0;
for i := 1 to (BN - 1) do
m_Sbuf[BN] := m_Sbuf[BN] + m_Sbuf; //累加和作为校验码
sleep(1);//这个一毫秒也不能省,省就发送数据错误,不知道为啥,郁闷
if not comm1.writecommdata(@m_Sbuf[1],BN) then CommFlg:=false;
if not CommFlg then //发送失败
Raise exception.Create(str_SendDataFailure);
SendData := True;
end;
BN = 6,发送六个字节,每发送一个要等一毫秒,这样加头加尾的,发送六个字节要开销二十几毫秒
以上是程序,请帮忙分析一下
 
我觉得你不使用sleep(1)这样的方式,这样是让计算机停止等待啊 ,
你应该加上Application.ProcessMessages;测试,看是不是会通讯出错,如果真的需要,你都应该使用另外的延时等待方式。
比如下面这样,
// 准确延时。...延时间隔是us.
procedure delay(delay_time:integer);
var t,t1,c:TLargeInteger;
begin
QueryPerformanceFrequency(c);
QueryPerformanceCounter(t);
repeat
QueryPerformanceCounter(t1);
until (t1-t)*1000000/c>=delay_time;
end;
 
谢谢,这一毫秒不是问题的关键,关键是不明白为什么发送六个字节要销耗将近二十毫秒,波特率是9600
 
我现在做着与你类似的项目,希望能多交流...
大概是10条线程(10个串口),每个串口带32台下位机,各下位机有地址区别.
使用查询的方式,也就是说,某一时刻只有某台下位机或上位机在通信.

[red]六个字节要销耗将近二十毫秒[/red]
发送1个字节需要1毫秒,6*1*2,大概就系12毫秒了...
会不会是SPCOM中的读写线程间的协作耗去部分时间了?

方便的话,最好再贴上部分代码让大家帮你分析看看.

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3600177
---这是我遇到的问题,恳请指点迷津..
 
如果只是一个串口,可以试试用TComPort,效率挺高的.
 
9600 / 8 = 1200, 就是说发送6个字节的理论时间是 6 * 1000 / 1200 = 5(ms);
还要握手,检测返回还需要时间。
提高速度的方法:
1、提高波特率,但楼主的数据量不大,效果不明显。
2、扩展串口,1个-->>2个,速度就扩展一倍了。
3、优化通讯算法,再压缩,也不可能低于理论时间,而且有可能会导致系统不稳定,需要留一定的余量。
 
楼上的没算 起始位,停止位,校验位。。。
 
来自:delphi_delphi, 时间:2006-10-19 12:38:33, ID:3600207
串口问题而已,http://www.feiyang.net.cn/index.
------------------------------------------------------
竟然有病毒。。。。。
 
用单片机做一个通讯控制模块,直接在单片机上完成数据交换,以缓冲区的方式向PC提交。这恐怕是最彻底的方法
 
delphi_delphi
---------
这个人经常在论坛上放病毒链接,
建议老大清除掉他,
我已经看到好几次了,
 
我觉得程序上能减少的时间可能并不多。
另,你用的hub是什么型号的,能带那么多的点?
 
后退
顶部