OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5398|回复: 8

关于UCOS+LWIP问题,用板子做服务器,通过TCP&UDP调试助手发数据,每过十几分钟就会断开连接,哪位做过LWIP帮忙解决下

[复制链接]

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
发表于 2015-12-7 10:10:14 | 显示全部楼层 |阅读模式
5金钱
我用的是STM32F107VC+DP83848VV,RMII模式,不接其他外设只测试网口的话很稳定,但是接上外设之后,每个十几分钟网络就会自动断开,再连就连接不上,只有复位之后才能再次连接,在网络任务中设置断点发现UCOS竟然切换不进去,其他的任务运行都很正常232、485的收发都没有问题,我已经把网络任务的优先级设置成最高了,哪位大神遇到过这样的问题,怎么解决

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-12-7 10:39:07 | 显示全部楼层
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2015-12-7 10:54:27 | 显示全部楼层
帮顶。。。。
活着才是王道!健康是一切的前提!
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-12-7 11:10:38 | 显示全部楼层
回复【3楼】lison0103:
---------------------------------
多谢
回复

使用道具 举报

13

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-1-6
在线时间
20 小时
发表于 2015-12-7 14:59:52 | 显示全部楼层
不贴代码谁知道啊
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-12-8 09:11:31 | 显示全部楼层
回复【5楼】wangjakn:
---------------------------------
不知道应该贴哪部分啊,昨天又试了下,发现我把发送关了,就坚挺了,是不是发送函数没有释放内存啊,但是不知道那哪里释放。
static err_t
low_level_output(struct netif *netif, struct pbuf *p)//这是发送底层
{
  struct pbuf *q;
  int l = 0;
//  u32_t result;
  u8 *buffer =  (u8 *)ETH_GetCurrentTxBuffer();
  
  for(q = p; q != NULL; q = q->next) 
  {
    memcpy((u8_t*)&buffer[l], q->payload, q->len);
l = l + q->len;
  }

  ETH_TxPkt_ChainMode(l);


  return ERR_OK;
}
void tcp_server_thread(void *arg)//这个线程使用的原子哥例程里的
{
OS_CPU_SR cpu_sr;
u32 data_len = 0;
struct pbuf *q;
err_t err;
u8 remot_addr[4];
struct netconn *conn, *newconn;
static ip_addr_t ipaddr;
static u16_t  port;

LWIP_UNUSED_ARG(arg);

conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
if(conn !=NULL)
{
err=netconn_bind(conn,IP_ADDR_ANY,TCPSERVER_PORT_NO);  //绑定端口 
if(err==ERR_OK)
{
netconn_listen(conn);  //进入监听模式
conn->recv_timeout = 10;  //禁止阻塞线程 等待10ms
}
}
while (1) 
{
newconn = netconn_accept(conn);  //接收连接请求
if(newconn!=NULL) newconn->recv_timeout = 10;

if (newconn!=NULL)    //处理新连接的数据

struct netbuf *recvbuf;

netconn_getaddr(newconn,&ipaddr,&port,0); //获取远端IP地址和端口号

remot_addr[3] = (uint8_t)(ipaddr.addr >> 24); 
remot_addr[2] = (uint8_t)(ipaddr.addr>> 16);
remot_addr[1] = (uint8_t)(ipaddr.addr >> 8);
remot_addr[0] = (uint8_t)(ipaddr.addr);
printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port);

while(1)
{
if((tcp_server_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
{
err = netconn_write(newconn ,tcp_server_sendbuf,strlen((char*)tcp_server_sendbuf),NETCONN_COPY); //发送tcp_server_sendbuf中的数据
if(err != ERR_OK)
{
printf("发送失败\r\n");
}
tcp_server_flag &= ~LWIP_SEND_DATA;
memset(tcp_server_sendbuf,0,sizeof(tcp_server_sendbuf));
}
ERR_CHERK= newconn->err;
if((recvbuf = netconn_recv(newconn)) != NULL)   //接收到数据
{
OS_ENTER_CRITICAL(); //关中断
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零
for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
{
//判断要拷贝到TCP_SERVER_RX_BUFSIZE中的数据是否大于TCP_SERVER_RX_BUFSIZE的剩余空间,如果大于
//的话就只拷贝TCP_SERVER_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
if(q->len > (TCP_SERVER_RX_BUFSIZE-data_len)) memcpy(tcp_server_recvbuf+data_len,q->payload,(TCP_SERVER_RX_BUFSIZE-data_len));//拷贝数据
else memcpy(tcp_server_recvbuf+data_len,q->payload,q->len);
data_len += q->len;  
if(data_len > TCP_SERVER_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
}
OS_EXIT_CRITICAL();  //开中断


data_len=0;  //复制完成后data_len要清零。
netbuf_delete(recvbuf);
}else if(newconn->err==ERR_CLSD)   //关闭连接
{
netconn_close(newconn);
netconn_delete(newconn);
printf("主机:%d.%d.%d.%d断开与服务器的连接\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
break;
}
    LwIP_Periodic_Handle();

}
}
else
{


}
//delay_ms(100);
}
}
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-12-8 09:12:59 | 显示全部楼层
这个是MAC DMA设置
 /* Fill ETH_InitStructure parametrs */
  /*------------------------ ETH_MACCR-----------------------------------*/
    //参数是否自动配置,选择disable需要自动配置默写参数(auto模式在网线没插上时会导致超时,初始化失败)
  ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
    ETH_InitStructure.ETH_Watchdog = ETH_Watchdog_Disable;                            //关闭看门狗定时器,允许接收超长帧
    ETH_InitStructure.ETH_Jabber = ETH_Jabber_Disable;                                //关闭jabber定时器,允许发送超长帧
    ETH_InitStructure.ETH_InterFrameGap = ETH_InterFrameGap_40Bit;           //发送帧间间隙
    ETH_InitStructure.ETH_Speed = ETH_Speed_100M;                                     //快速以太网速度
    ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;                    //不启用自循环模式
    ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;                                 //全双工模式
  
    /*自动填充/CRC剥离处理不执行,转发所有帧*/
    ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;   
#if CHECKSUM_BY_HARDWARE
  ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable; //IPV4头文件硬件校验
#endif

    /*------------------------ ETH_MACFFR----------------------------------*/
  ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;                                   //MAC过滤只接受通过源目的地址的数据
    ETH_InitStructure.ETH_SourceAddrFilter = ETH_SourceAddrFilter_Normal_Enable;                 //MAC过滤源地址错误帧?
    ETH_InitStructure.ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;                    //MAC不转发任何控制帧
    ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;        //接收广播帧
    ETH_InitStructure.ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;              //目的地址过滤结果正常
    ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;                         //混杂模式,启用帧过滤
    ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;             //过滤器正常工作,不传送控制帧
    ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;                 //单播帧目的地址完美过滤

   /*------------------------   DMA  ETH_DMAOMR -----------------------------------*/  
   /* When we use the Checksum offload feature, we need to enable the Store and Forward mode: 
   the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, 
   if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
    /*丢弃校验错误帧不执行(因为未进行硬件校验)*/
    ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
    ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;              //接收数据超过阈值转发
    ETH_InitStructure.ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;                 //描述符被占用和接收FIFO不可用时清空FIFO(解决堵塞)
    ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;            //发送数据完整帧转发
    ETH_InitStructure.ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;    //发送阈值为64Bytes
    ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;                //接收FIFO丢弃所有错误帧
    
    /*接收FIFO上传长度不够的好帧*/
ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Enable;  
ETH_InitStructure.ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;       //接收阈值为64Bytes
    ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;                  //DMA直接发送第二个帧,不需要之前帧回复
    
    /*------------------------   DMA  ETH_DMABMR -----------------------------------*/      
    ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;                //传输地址对齐
    ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;                                  //固定的突发
    ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;                              
    ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
    ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;             //发送和接收比例(上传数据时重要) 2:1
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-6-30
在线时间
71 小时
发表于 2016-10-6 17:21:15 | 显示全部楼层
请教楼主,如何解决这个问题的?
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2015-1-16
在线时间
10 小时
发表于 2016-12-30 21:14:13 | 显示全部楼层
我也遇到这个问题,求楼主指教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-9 01:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表