打印
[STM32F1]

有什么好方法是W5500 正在读写操作数据立刻停止

[复制链接]
2538|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子过客|  楼主 | 2016-7-22 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有个工程要求进行 freemodbus 通讯,  平时是不通讯的,  
平时就是W5500读写外部的数据,  要求 一有MODBUS 通讯就 停止W5500的操作  处理MODBUS的数据
能及时响应,  有啥好办法啊,
现在  问题是 在执行W5500读写操作时候  ,modbus数据 不能及时响应
各位有啥好办法
沙发
qbasicljx| | 2016-7-22 10:36 | 只看该作者
中断 多任务 .... 各种方法都可以啊

使用特权

评论回复
板凳
电子过客|  楼主 | 2016-7-22 13:18 | 只看该作者
qbasicljx 发表于 2016-7-22 10:36
中断 多任务 .... 各种方法都可以啊

我没有弄操作系统,
modbus是移植的 他的发送和接收都是在中断,
W5500是在主程序查询的, 仿真时候没有成功

使用特权

评论回复
地板
E-Kaia| | 2016-7-22 16:03 | 只看该作者
只能用中断方法,一定要注意保护

使用特权

评论回复
5
mmuuss586| | 2016-7-22 16:52 | 只看该作者
中断的级别设高点看下;

另外你操作W5500的时候其它中断能进入吗?

使用特权

评论回复
6
Kua_Max| | 2016-7-22 18:27 | 只看该作者
5500用的spi口,和你的modbus压根没关系吧。。。。。。。。。
有通讯为什么就不能让5500工作 ?

你左手拿了东西,右手就必须不能动 ?

怀疑你是刚写程序 ??????

使用特权

评论回复
7
Kua_Max| | 2016-7-22 18:30 | 只看该作者
以前写的一个项目,5500用500K速度上传数据给PC机,还要兼顾与PC间其他通讯,同时250K的速度采集adc数据,同时需要250K的速度切换一些IO口,MCU是103,72M主频,毫无压力。。。。。

使用特权

评论回复
8
电子过客|  楼主 | 2016-7-27 14:27 | 只看该作者
mmuuss586 发表于 2016-7-22 16:52
中断的级别设高点看下;

另外你操作W5500的时候其它中断能进入吗?

其他中断可以, 这里有2个时间中断均可以进入中断

使用特权

评论回复
9
电子过客|  楼主 | 2016-7-27 14:30 | 只看该作者
Kua_Max 发表于 2016-7-22 18:27
5500用的spi口,和你的modbus压根没关系吧。。。。。。。。。
有通讯为什么就不能让5500工作 ?

理论上 5500与modbus真的没关系, 可惜在仿真时候发现 modbus 不能及时响应,
停止时仿真时候  程序停留在W5500读写操作上边

使用特权

评论回复
10
电子过客|  楼主 | 2016-7-27 14:33 | 只看该作者
Kua_Max 发表于 2016-7-22 18:30
以前写的一个项目,5500用500K速度上传数据给PC机,还要兼顾与PC间其他通讯,同时250K的速度采集adc数据, ...

我的W5500是在回环测试中 发送一个命令  , 接收 服务器返回的数据,  也没有做其处理
有modbus 通讯时候响应 通讯

使用特权

评论回复
11
yklstudent| | 2016-7-27 14:58 | 只看该作者
把modbus的处理任务放在W5500处理前面任务

使用特权

评论回复
12
电子过客|  楼主 | 2016-7-27 15:45 | 只看该作者
yklstudent 发表于 2016-7-27 14:58
把modbus的处理任务放在W5500处理前面任务

之前是  int main(void)
{
      if ( time == 100 ) //定时 10s 网口采集数据
     {
        time =0;       
     TCP_RECE( );
     }
  else
    { eMBPoll();  }

}
有时候MODBUS 就没来及反应
改写下
  int main(void)
{

     eMBPoll();  


      if ( time == 100 ) //定时 10s 网口采集数据
     {
        time =0;       
     TCP_RECE( );
     }



}
有时候MODBUS 有所改观,  不知为何, 在测试下看看



                                                                               
                          




使用特权

评论回复
13
yklstudent| | 2016-7-27 16:41 | 只看该作者
TCP_RECE很占用时间?

使用特权

评论回复
14
电子过客|  楼主 | 2016-7-27 16:51 | 只看该作者
yklstudent 发表于 2016-7-27 16:41
TCP_RECE很占用时间?

void do_tcp_client(void)
{       
          uint16 len=0;

        switch(getSn_SR(SOCK_TCPC))                                                                                                           /*获取socket的状态*/
        {
                case SOCK_CLOSED:                                                                                                                         /*socket处于关闭状态*/
                        socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND);
                  break;
               
                case SOCK_INIT:                                                                                                                                 /*socket处于初始化状态*/
                        connect(SOCK_TCPC,remote_ip,remote_port);                /*socket连接服务器*/
                  break;
               
                case SOCK_ESTABLISHED:                                                                                                              /*socket处于连接建立状态*/
                        if(getSn_IR(SOCK_TCPC) & Sn_IR_CON)
                        {
                                setSn_IR(SOCK_TCPC, Sn_IR_CON);                                                                  /*清除接收中断标志位*/
                        }
                  
                         len=getSn_RX_RSR(SOCK_TCPC);                                                                                    /*定义len为已接收数据的长度*/
                          //send(SOCK_TCPC,ucTCPResponseFrame,12);
                          
                         send(SOCK_TCPC, ucKLTCPResponseFrame, ucTCPResponseLen);
                                        if(len>0)
                               
                        {
                                 if(bFrameSent)  
          {  
          bFrameSent = FALSE;  

          send(SOCK_TCPC, ucKLTCPResponseFrame, ucTCPResponseLen);
          }  
                                  
                                  recv(SOCK_TCPC,buff,len);                                                            /*接收来自Server的数据*/
                                  //buff[len]=0x00;
                                  // recv(SOCK_TCPC, ucTCPRequestFrame, ucTCPRequestLen);                 //w5500接收数据
                                                                                                                             
                                  
             
                        }                  
                  break;
                       
                case SOCK_CLOSE_WAIT:                                                                                                              /*socket处于等待关闭状态*/
                        close(SOCK_TCPC);
                  break;

        }
       
          
}


上边是子程序
是一个监听模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

205

帖子

2

粉丝