各位大侠,我亟待解决如下问题,请指点:
485要处理的工作是:从机先发送数据给PC,PC做相应处理将结果返回给从机;当只有一台从机时,可以很正常的工作,从即接受也没有延迟,但是当挂上多台从机后,其中一台从机的接收就正常,其它从机的接收就有一定的延迟,大约有1S左右,这是只有两台从机的情况下测试的,如果有多台从机的情况下,就出现从机接收故障
从机接收采用的是中断方式,从机发送信号后就检测是否有来自主机的应答,如果两秒未接收到主机应答,则认为此次通信失败
我是做从机也就是硬件部分的,软件编程是在Delphi7下编写的(同事)
会不是是由于PC机处理速度返回的数据慢引起的呢?
多谢各位大侠了……帮我解决的看看这是什么原因???
485要处理的工作是:从机先发送数据给PC,PC做相应处理将结果返回给从机;当只有一台从机时,可以很正常的工作,从即接受也没有延迟,但是当挂上多台从机后,其中一台从机的接收就正常,其它从机的接收就有一定的延迟,大约有1S左右,这是只有两台从机的情况下测试的,如果有多台从机的情况下,就出现从机接收故障
从机接收采用的是中断方式,从机发送信号后就检测是否有来自主机的应答,如果两秒未接收到主机应答,则认为此次通信失败
我是做从机也就是硬件部分的,软件编程是在Delphi7下编写的(同事)
会不是是由于PC机处理速度返回的数据慢引起的呢?
多谢各位大侠了……帮我解决的看看这是什么原因???
很可能是一个口中断发生后,其他口的中断触发不了(不管是多口共享中断还是各自使用独立的中断),这样就造成某些口的中断处理延迟。
解决方法是主机上在中断处理中先发送EOI命令,不要等接收、发送处理结果之后再发送,这样允许一口中断没处理完之前响应其他口中断。
PC采用接收一条 返回一条的机制工作 但是从接收到处理直至PC发送数据到从机这一过程 需要的时间我就不是很清楚了 同事说 不用怀疑上位机处理的的问题 目前我市比较迷茫的
个人认为是PC处理速度问题 因为如果在2S内 我都可以接收到 超过这个时间范围 我就无法接收了
并非只有一个串口啊,很多接口卡带2~4个485串口,每个都可以有自己的IRQ和端口地址。
我是每一台从机都有一个485口 但是在计算机终端我用的是一个485转换器 对PC来讲是只有一个口的
总之,就是要想办法把接收和处理分开来做。串口只负责发送和接收数据,线程负责处理数据。
你要是只想不出错的话,还有个简单点的办法,就是从机发送完数据后不释放总线,从机一直等,等PC把数据处理好发送给你之后再释放总线。这样就彻底把PC当成一个单任务操作系统来用了。因为毕竟,一次完整的任务处理应该是从从机发送原始数据开始直到主机发送完处理后数据为止。
20s太慢了吧,也许2s?
还有,主机上不需要轮询啊,有数据过来就产生中断了。估计中断处理程序不是你们自己写的,是用驱动虚拟了一个串口,你们自己写的服务程序是一个应用程序。
这样的话,程序打开串口应该用异步方式(overlapped),读一个数据块,比如16字节,然后等待系统回调就行了,系统接收满16个字节之后,就会调用你的回调过程。
不过这些都是主机上的处理过程了,你可能也管不着。:)
你这个从上位机角度而言就是一主多从,需要轮训读取,建议你修改你的通信协议,大致如下:
上位机发送数据读取命令: STX+下位机地址+命令符号+校验和+ETX下位机返回:STX+下位机地址+命令符号+数据+校验和+ETX这是通常情况下地串口通信协议结构,楼主可以借鉴一下这个方式。其实做自己的串口通信时,通信协议很重要,一个合适的通信协议常常会给你的数据处理带来很大的便利。
写错了 是20ms的 呵呵 上位机那边的我不是很清楚,是同事做的,下位机这是我做的。他那边没有采用线程,是这样的:如果同时收到两条来自下位机的请求命令(当然他们肯定是有先后的),那么PC就先处理先到的,然后返回结果给下位机,完成后,在处理稍慢的那一条数据。我觉得这样第二条肯定是会有延迟的,时间长短也跟那边的程序及处理有关。
也就是说,你的下位机也是在外部条件下才会给上位机发送数据?如果是这样的话,我觉得你最好还是修改一下你的通信方式,因为上位机可能要处理很多消息(Windows的需要处理很多系统事件和消息,不可能对你的下位机响应的很及时),鉴于此,你必须保证上位机处于主动的状态。具体的处理方法:你可以把外部环境给下位机的数据存储在一个区域中(数据组成一个队列),每次上位机发送读命令,就从队列中读取一个数据。处理完毕再发送反馈给下位机。