各位大侠,我亟待解决如下问题,请指点: 
485要处理的工作是:从机先发送数据给PC,PC做相应处理将结果返回给从机;当只有一台从机时,可以很正常的工作,从即接受也没有延迟,但是当挂上多台从机后,其中一台从机的接收就正常,其它从机的接收就有一定的延迟,大约有1S左右,这是只有两台从机的情况下测试的,如果有多台从机的情况下,就出现从机接收故障
从机接收采用的是中断方式,从机发送信号后就检测是否有来自主机的应答,如果两秒未接收到主机应答,则认为此次通信失败
我是做从机也就是硬件部分的,软件编程是在Delphi7下编写的(同事)
会不是是由于PC机处理速度返回的数据慢引起的呢?
多谢各位大侠了……帮我解决的看看这是什么原因??? 

解决方案 »

  1.   

    现在我是从机主动  从机有数据时 就主动发送数据到PC PC处理完后 再将结果返回给下位机  用户直接在下位机查看判断结果  PC就是服务器,只是将接收到的下位机信息存储
      

  2.   

    这应该是中断嵌套的问题。
    很可能是一个口中断发生后,其他口的中断触发不了(不管是多口共享中断还是各自使用独立的中断),这样就造成某些口的中断处理延迟。
    解决方法是主机上在中断处理中先发送EOI命令,不要等接收、发送处理结果之后再发送,这样允许一口中断没处理完之前响应其他口中断。
      

  3.   

    因为主机PC是接收到从机请求后才做应答的  应答内容其实就是从机需要的结果  
    PC采用接收一条 返回一条的机制工作   但是从接收到处理直至PC发送数据到从机这一过程 需要的时间我就不是很清楚了  同事说 不用怀疑上位机处理的的问题   目前我市比较迷茫的  
    个人认为是PC处理速度问题 因为如果在2S内 我都可以接收到  超过这个时间范围 我就无法接收了 
      

  4.   


    并非只有一个串口啊,很多接口卡带2~4个485串口,每个都可以有自己的IRQ和端口地址。
      

  5.   

    上位机用个串口监控软件,就知道是上位机响应速度问题,还是你的下位机问题了,PortMonitor这个串口监控小工具就挺好用的
      

  6.   

    finewind 讲问题讲的很透彻  
        我是每一台从机都有一个485口  但是在计算机终端我用的是一个485转换器  对PC来讲是只有一个口的
      

  7.   

    这个,那其实就是多个从机对应主机的一个串口,这样就比较麻烦了。最关键的就是,必须要把数据处理和数据接收分离开来做,让串口只管数据发送和接收,让线程处理来做接收完数据之后的处理工作,处理完之后再调用串口把处理结果发送给从机。线程是平等的,所以对于每个从机能得到的系统时间都是差不多的,也就不会存在一个从机有延时另一个从机没有延时了。你试试这样行得通不,在主机上为每个从机建立专门的数据存储区,为每一个从机分别建立一个相应的线程处理函数。设计从机和主机通信帧的时候,做个标记从机号的字节,主机接收到一帧数据之后,判断是哪个从机号的数据,然后把数据放入相应的数据区,然后调用处理线程,这个时候串口就可以空出来接收或者发送其他的从机数据了,等线程处理完数据之后,调用串口把处理结果发送给相应的从机。
        总之,就是要想办法把接收和处理分开来做。串口只负责发送和接收数据,线程负责处理数据。
        你要是只想不出错的话,还有个简单点的办法,就是从机发送完数据后不释放总线,从机一直等,等PC把数据处理好发送给你之后再释放总线。这样就彻底把PC当成一个单任务操作系统来用了。因为毕竟,一次完整的任务处理应该是从从机发送原始数据开始直到主机发送完处理后数据为止。
       
      

  8.   

     因为我这边是从机主动发送,然后主机响应,我为了保证这种通讯同时希望PC能够采取稍微主动地方式,所以我事先定好一条总线下最多挂20台从机,主机20s查询一次(轮询方式),查询各个从机有没有信号过来
      

  9.   


    20s太慢了吧,也许2s?
    还有,主机上不需要轮询啊,有数据过来就产生中断了。估计中断处理程序不是你们自己写的,是用驱动虚拟了一个串口,你们自己写的服务程序是一个应用程序。
    这样的话,程序打开串口应该用异步方式(overlapped),读一个数据块,比如16字节,然后等待系统回调就行了,系统接收满16个字节之后,就会调用你的回调过程。
    不过这些都是主机上的处理过程了,你可能也管不着。:)
      

  10.   


    你这个从上位机角度而言就是一主多从,需要轮训读取,建议你修改你的通信协议,大致如下:
    上位机发送数据读取命令: STX+下位机地址+命令符号+校验和+ETX下位机返回:STX+下位机地址+命令符号+数据+校验和+ETX这是通常情况下地串口通信协议结构,楼主可以借鉴一下这个方式。其实做自己的串口通信时,通信协议很重要,一个合适的通信协议常常会给你的数据处理带来很大的便利。
      

  11.   


    写错了 是20ms的  呵呵  上位机那边的我不是很清楚,是同事做的,下位机这是我做的。他那边没有采用线程,是这样的:如果同时收到两条来自下位机的请求命令(当然他们肯定是有先后的),那么PC就先处理先到的,然后返回结果给下位机,完成后,在处理稍慢的那一条数据。我觉得这样第二条肯定是会有延迟的,时间长短也跟那边的程序及处理有关。
      

  12.   


    也就是说,你的下位机也是在外部条件下才会给上位机发送数据?如果是这样的话,我觉得你最好还是修改一下你的通信方式,因为上位机可能要处理很多消息(Windows的需要处理很多系统事件和消息,不可能对你的下位机响应的很及时),鉴于此,你必须保证上位机处于主动的状态。具体的处理方法:你可以把外部环境给下位机的数据存储在一个区域中(数据组成一个队列),每次上位机发送读命令,就从队列中读取一个数据。处理完毕再发送反馈给下位机。