完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用的是STM32F107VC+DP83848VV,RMII模式,不接其他外设只测试网口的话很稳定,但是接上外设之后,每个十几分钟网络就会自动断开,再连就连接不上,只有复位之后才能再次连接,在网络任务中设置断点发现UCOS竟然切换不进去,其他的任务运行都很正常232、485的收发都没有问题,我已经把网络任务的优先级设置成最高了,哪位大神遇到过这样的问题,怎么解决
|
|
相关推荐
8个回答
|
|
别沉啊。。。
|
|
|
|
帮顶。。。。
|
|
|
|
|
|
不贴代码谁知道啊
|
|
|
|
不知道应该贴哪部分啊,昨天又试了下,发现我把发送关了,就坚挺了,是不是发送函数没有释放内存啊,但是不知道那哪里释放。
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连接上服务器,主机端口号为:%drn",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("发送失败rn"); } 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断开与服务器的连接rn",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]); break; } LwIP_Periodic_Handle(); } } else { } //delay_ms(100); } } |
|
|
|
这个是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 |
|
|
|
请教楼主,如何解决这个问题的?
|
|
|
|
我也遇到这个问题,求楼主指教
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2551 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2336 浏览 5 评论
3167 浏览 3 评论
2809 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2769 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
622浏览 1评论
863浏览 0评论
981浏览 0评论
633浏览 0评论
458浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 10:04 , Processed in 1.269343 second(s), Total 60, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号