OpenEdv-开源电子网

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

关于以太网与网络调试助手之间的信息互发和文件下载

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
发表于 2015-11-25 21:08:59 | 显示全部楼层 |阅读模式
5金钱
        求教大神,我有一个项目是有关于利用ARM下载二进制文件并存储进外部FLASH中,目前做这样的一个测试:
        电脑作为服务器端,ARM作为客户端
        通过网络调试助手发送命令:FileRecv,然后希望得到ARM的回复:File Receive Ready!
        然后发送一个txt文件,希望ARM接收并存储在外部的FLASH中。
        再然后,发送ReadFile命令,希望把发送过去数据能从外部FLASH中原样都回到服务器端(即电脑上)
    但是,现在问题是:修改了原例程的代码后,MDK上仿真无错误无警告,但是烧写到ARM上后却出现了ENC28J60 Init Error!,而且奇怪的是,有时候过了很长一段时间之后出现了该显示的内容:如 IP:192.168.149.42 TCP Client Connected.但是有时候又不是,一直反复出现ENC28J60 Init Error!,然后再重新把光盘里给的以太网例程.hex文件烧写进去后,又是可以的,正常显示和工作的,实在是搞不明白是怎么事,求助大神帮忙解决下,以下附上本人改的代码,只更改了两个代码,tcp_client_demo.c和main.c。并且把tcp_server_demo.c给注释掉了

//修改子ENC28J60网络实验的tcp_client_demo.c
//tcp_client_demo.c是完成一个简单的TCP客户端应用,实现与电脑TCP服务端的数据收发
//此时ARM作为客户端
#include "tcp_demo.h"
#include "flash.h"
#include "sys.h"
#include "uip.h"
#include "delay.h"

#include "lcd.h"
#include <string.h>
#include <stdio.h>   
//////////////////////////////////////////////////////////////////////////////////  
//ALIENTEK战舰STM32开发板
//uIP TCP Client测试 代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/28
//版本:V1.0    
//////////////////////////////////////////////////////////////////////////////////

u8 tcp_client_databuf[1024];   //发送数据缓存,最好在编写上位机程序的时候约好,发送数据的缓存定为1024字节
u8 tcp_client_sta; //客户端状态
//[7]:0,无连接;1,已经连接;
//[6]:0,无数据;1,收到客户端数据
//[5]:0,无数据;1,有数据需要发送

u32 RECVFILEADDR=(1024*6+500)*1024;//FLASH存放FPGA配置文件默认是6M的地址
u32 offset; //文件偏移地址
u32 fileLength;
//u32 FLASH_SIZE_CLIENT=8*1024*1024; //FLASH 大小为8M字节

 
void tcp_client_demo_appcall(void)
{  
  struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;
if(uip_aborted())tcp_client_aborted(); //连接终止   
if(uip_timedout())tcp_client_timedout(); //连接超时   
if(uip_closed())tcp_client_closed(); //连接关闭   
  if(uip_connected())tcp_client_connected(); //连接成功    
if(uip_acked())tcp_client_acked(); //发送的数据成功送达 
 

//接收到一个新的TCP数据包
if (uip_newdata())   //收到客户端发过来的数据
{
if((tcp_client_sta&(1<<6))==0)//还未收到数据,即发送过来的数据还未接收
{

offset=0;
fileLength=0;

/*准备接收文件语法:RecvRdy */
//uIP通过函数uip_input()和全局变量uip_buf、uip_len来实现与设备驱动的接口。
//uip_buf用于存放接收到的和要发送的数据包,为了减少存储器的使用,
//接收数据包和发送数据包使用相同的缓冲区。uip_len表明接收发送缓冲区里的数据长度,
//通过判断uip_len的值是否为0来判断是否接收到新的数据,是否有数据要发送
if(uip_len==7&&(memcmp("RecvRdy",uip_appdata,7)==0))
{
LCD_ShowString(60,10,200,16,16,"File Receive Ready!");
sprintf((char *)tcp_client_databuf,"File Receive Ready!");
s->textptr=tcp_client_databuf;
s->textlen=20;
tcp_client_senddata();
//uip_send("File Receive Ready!\n",20);
//应用程序通过使用uIP函数uip_send()发送数据。
//uip_send()函数采用两个参数;一个指针指向发送数据起始地址,另一个指明数据的长度。
tcp_client_sta|=1<<6;//表示收到客户端数据
}
else if(uip_len==8&&(memcmp("ReadFile",uip_appdata,8)==0))
{
LCD_ShowString(5,50,200,16,16,"Reading File...");

SPI_Flash_Read((u8*)tcp_client_databuf,RECVFILEADDR,fileLength);
s->textptr=tcp_client_databuf;
s->textlen=fileLength;
tcp_client_senddata();
//sprintf((char*)tcp_client_databuf,"\n");  
//delay_ms(100);
}
else //if(uip_len>1023)
{
//((u8*)uip_appdata)[1023]=0; //超出缓冲区的数据直接丢弃,等待下次再接收
LCD_ShowString(5,5,200,16,16,"Start Write W25Q64...."); //进行flash读写的提示信息
delay_ms(10);
SPI_Flash_Write((u8 *)uip_appdata,RECVFILEADDR+offset,uip_datalen());
fileLength+=uip_datalen();
offset+=uip_datalen();
LCD_ShowString(5,20,200,16,16,"File Recv Finished");
LCD_ShowString(5,35,200,16,16,"The length of the file:");
LCD_ShowNum(180,35,fileLength,8,16);

}
}
}else if(tcp_client_sta&(1<<5))//有数据需要发送
{
s->textptr=tcp_client_databuf;
s->textlen=strlen((const char*)tcp_client_databuf);

//sprintf("Reading File...\n",(char *)tcp_client_databuf);
//uip_send("Reading File...\n",16);
//SPI_Flash_Read((u8*)tcp_client_databuf,RECVFILEADDR,fileLength);
//uip_send(tcp_client_databuf,fileLength);
//sprintf(tcp_client_databuf);
tcp_client_sta&=~(1<<5);//清除标记
}  
//当需要重发、新数据到达、数据包送达、连接建立时,通知uip发送数据 
if(uip_rexmit()||uip_newdata()||uip_acked()||uip_connected()||uip_poll())
{
tcp_client_senddata();
}   
}
//这里我们假定Server端的IP地址为:192.168.149.103(就是ARM的IP地址)
//这个IP必须根据Server端的IP修改.这里电脑即为Client端(192.168.149.42),ARM即为服务器端
//尝试重新连接
void tcp_client_reconnect()
{
uip_ipaddr_t ipaddr;
uip_ipaddr(&ipaddr,192,168,149,42); //设置IP为192.168.149.42,这是电脑的IP地址,
uip_connect(&ipaddr,htons(1400)); //端口为1400
}
//终止连接    
void tcp_client_aborted(void)
{
tcp_client_sta&=~(1<<7); //标志没有连接
tcp_client_reconnect(); //尝试重新连接
uip_log("tcp_client aborted!\r\n");//打印log
}
//连接超时
void tcp_client_timedout(void)
{
tcp_client_sta&=~(1<<7); //标志没有连接   
uip_log("tcp_client timeout!\r\n");//打印log
}
//连接关闭
void tcp_client_closed(void)
{
tcp_client_sta&=~(1<<7); //标志没有连接
tcp_client_reconnect(); //尝试重新连接
uip_log("tcp_client closed!\r\n");//打印log
}  
//连接建立
void tcp_client_connected(void)

struct tcp_demo_appstate *s=(struct tcp_demo_appstate *)&uip_conn->appstate;
  tcp_client_sta|=1<<7; //标志连接成功
  uip_log("tcp_client connected!\r\n");//打印log
s->state=STATE_CMD; //指令状态
s->textlen=0;
s->textptr="ALIENTEK STM32 Board Connected Successfully!\r\n";//回应消息
s->textlen=strlen((char *)s->textptr);  
}
//发送的数据成功送达
void tcp_client_acked(void)
{    
struct tcp_demo_appstate *s=(struct tcp_demo_appstate *)&uip_conn->appstate;
s->textlen=0;//发送清零
uip_log("tcp_client acked!\r\n");//表示成功发送  
}
//发送数据给服务端
void tcp_client_senddata(void)
{
struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;
//s->textptr:发送的数据包缓冲区指针
//s->textlen:数据包的大小(单位字节)   
if(s->textlen>0)uip_send(s->textptr, s->textlen);//发送TCP数据包  
}


然后是main.c
//本main()函数修改自ENC28J60网络实验的main()函数,仅仅是稍微修改了下
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"  
#include "rtc.h" 
#include "adc.h"
#include "tsensor.h"
#include "enc28j60.h"
#include "uip.h"
#include "uip_arp.h"
#include "tapdev.h"
#include "timer.h"   
#include "math.h"
#include "string.h"  

#include "flash.h"

//ALIENTEK战舰STM32开发板实验52
//ENC28J60网络 实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  
void uip_polling(void);
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])  
extern u32 LCD_Pow(u8 m,u8 n);
extern u32 fileLength;
//数字->字符串转换函数
//将num数字(位数为len)转为字符串,存放在buf里面
//num:数字,整形
//buf:字符串缓存
//len:长度
void num2str(u16 num,u8 *buf,u8 len)
{
u8 i;
for(i=0;i<len;i++)
{
buf=(num/LCD_Pow(10,len-i-1))%10+'0';
}
}
//获取STM32内部温度传感器的温度
//temp:存放温度字符串的首地址.如"28.3";
//temp,最少得有5个字节的空间!
void get_temperature(u8 *temp)
{  
u16 t;
float temperate;   
temperate=T_Get_Adc_Average(ADC_CH_TEMP,10);  
temperate=temperate*(3.3/4096);        
temperate=(1.43-temperate)/0.0043+25; //计算出当前温度值
t=temperate*10;//得到温度
num2str(t/10,temp,2);   
temp[2]='.';temp[3]=t%10+'0';temp[4]=0; //最后添加结束符
}
//获取RTC时间
//time:存放时间字符串,形如:"2012-09-27 12:33"
//time,最少得有17个字节的空间!
void get_time(u8 *time)
{
RTC_Get();
time[4]='-';time[7]='-';time[10]=' ';
time[13]=':';time[16]=0; //最后添加结束符
num2str(calendar.w_year,time,4); //年份->字符串
num2str(calendar.w_month,time+5,2); //月份->字符串  
num2str(calendar.w_date,time+8,2); //日期->字符串
num2str(calendar.hour,time+11,2); //小时->字符串
num2str(calendar.min,time+14,2); //分钟->字符串      
}

 int main(void)
 {  
u8 key;
// u8 tcp_server_tsta=0XFF;
u8 tcp_client_tsta=0XFF;
  uip_ipaddr_t ipaddr;

delay_init();     //延时函数初始化  
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
  LED_Init();     //LED端口初始化
LCD_Init();
KEY_Init(); //初始化按键
RTC_Init(); //初始化RTC
T_Adc_Init(); //初始化ADC  

// POINT_COLOR=RED; //设置为红色   
// LCD_ShowString(60,10,200,16,16,"WarShip STM32");
// LCD_ShowString(60,30,200,16,16,"ENC28J60 TEST");
// LCD_ShowString(60,50,200,16,16,"ATOM@ALIENTEK");
  while(tapdev_init()) //初始化ENC28J60错误
{
POINT_COLOR=RED;   
LCD_ShowString(60,70,200,16,16,"ENC28J60 Init Error!");  
delay_ms(200);
POINT_COLOR=BLUE;
LCD_ShowString(50,80,200,16,16,"Why ENC28J60 Init Error!");
  LCD_Fill(60,70,240,86,WHITE);//清除之前显示
};
uip_init(); //uIP初始化  
// LCD_ShowString(60,70,200,16,16,"KEY0:Server Send Msg");  
// LCD_ShowString(60,90,200,16,16,"KEY2:Client Send Msg");
POINT_COLOR=RED;  
LCD_ShowString(5,150,200,16,16,"IP:192.168.149.42");      
// LCD_ShowString(60,130,200,16,16,"MASK:255.255.255.0");      
// LCD_ShowString(5,150,200,16,16,"GATEWAY:192.168.149.254");      
POINT_COLOR=BLUE;
  LCD_ShowString(5,200,200,16,16,"TCP RX:");      
LCD_ShowString(5,220,200,16,16,"TCP TX:");
         
LCD_ShowString(5,270,200,16,16,"TCP RX:");      
LCD_ShowString(5,290,200,16,16,"TCP TX:");      
  
 
  uip_ipaddr(ipaddr, 192,168,149,103); //设置本地设置IP地址
uip_sethostaddr(ipaddr);    
uip_ipaddr(ipaddr, 192,168,149,254); //设置网关IP地址(其实就是你路由器的IP地址)
uip_setdraddr(ipaddr);  
uip_ipaddr(ipaddr, 255,255,255,0); //设置网络掩码
uip_setnetmask(ipaddr);

uip_listen(HTONS(1200)); //监听1200端口,用于TCP Server
uip_listen(HTONS(80)); //监听80端口,用于Web Server
  tcp_client_reconnect();      //尝试连接到TCP Server端,用于TCP Client
// tcp_server_reconnect();      //尝试连接到TCP Client端,用于TCP Server
while (1)
{
uip_polling(); //处理uip事件,必须插入到用户程序的循环体中  
key=KEY_Scan(0);
// if(tcp_server_tsta!=tcp_server_sta)//TCP Server状态改变
// {  
// if(tcp_server_sta&(1<<7))LCD_ShowString(30,180,200,16,16,"TCP Server Connected   ");
// else LCD_ShowString(30,180,200,16,16,"TCP Server Disconnected");
// if(tcp_server_sta&(1<<6)) //收到新数据
// {
//// LCD_Fill(86,200,240,216,WHITE); //清除之前显示
//// LCD_ShowString(86,200,154,16,16,tcp_server_databuf);
////     printf("TCP Server RX:%s\r\n",tcp_server_databuf);//打印数据
// tcp_server_sta&=~(1<<6); //标记数据已经被处理
// }
// tcp_server_tsta=tcp_server_sta;
// }
// if(key==KEY_RIGHT)//TCP Server 请求发送数据
// {
// if(tcp_server_sta&(1<<7)) //连接还存在
// {
// //LCD_Fill(10,10,240,236,WHITE); //清除之前显示
//
//
//// LCD_ShowString(10,10,300,16,16,tcp_server_databuf);//显示当前发送数据
// tcp_server_sta|=1<<5;//标记有数据需要发送
// //tcnt++;
// }
// }
if(tcp_client_tsta!=tcp_client_sta)//TCP Client状态改变
{
POINT_COLOR=RED;  
if(tcp_client_sta&(1<<7))LCD_ShowString(5,65,200,16,16,"TCP Client Connected   ");
else LCD_ShowString(5,65,200,16,16,"TCP Client Disconnected");
  if(tcp_client_sta&(1<<6)) //收到新数据
{
LCD_Fill(5,80,240,286,WHITE); //清除之前显示
LCD_ShowString(10,65,1000,16,16,tcp_client_databuf);
printf("%s\r\n",tcp_client_databuf);
    //sprintf("TCP Client RX:%s\r\n",(char *)tcp_client_databuf);//打印数据
tcp_client_sta&=~(1<<6); //标记数据已经被处理
}
tcp_client_tsta=tcp_client_sta;
}
if(key==KEY_LEFT)//TCP Client 请求发送数据
{
if(tcp_client_sta&(1<<7)) //连接还存在
{

//LCD_Fill(10,100,240,306,WHITE); //清除之前显示
// LCD_ShowString(10,100,300,16,16,tcp_client_databuf);//显示当前发送数据
tcp_client_sta|=1<<5;//标记有数据需要发送
//tcnt++;
}
}
delay_ms(1);
}  

//uip事件处理函数
//必须将该函数插入用户主循环,循环调用.
void uip_polling(void)
{
u8 i;
static struct timer periodic_timer, arp_timer;
static u8 timer_ok=0;  
if(timer_ok==0)//仅初始化一次
{
timer_ok = 1;
timer_set(&periodic_timer,CLOCK_SECOND/2);  //创建1个0.5秒的定时器 
timer_set(&arp_timer,CLOCK_SECOND*10);   //创建1个10秒的定时器 
}  
uip_len=tapdev_read(); //从网络设备读取一个IP包,得到数据长度.uip_len在uip.c中定义
if(uip_len>0) //有数据
{   
//处理IP数据包(只有校验通过的IP包才会被接收) 
if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包? 
{
uip_arp_ipin(); //去除以太网头结构,更新ARP表
uip_input();   //IP包处理
//当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0
//需要发送的数据在uip_buf, 长度是uip_len  (这是2个全局变量)    
if(uip_len>0)//需要回应数据
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}else if (BUF->type==htons(UIP_ETHTYPE_ARP))//处理arp报文,是否是ARP请求包?
{
uip_arp_arpin();
  //当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量)
  if(uip_len>0)tapdev_send();//需要发送数据,则通过tapdev_send发送  
}
}else if(timer_expired(&periodic_timer)) //0.5秒定时器超时
{
timer_reset(&periodic_timer); //复位0.5秒定时器 
//轮流处理每个TCP连接, UIP_CONNS缺省是40个  
for(i=0;i<UIP_CONNS;i++)
{
uip_periodic(i); //处理TCP通信事件  
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
if(uip_len>0)
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}
#if UIP_UDP //UIP_UDP 
//轮流处理每个UDP连接, UIP_UDP_CONNS缺省是10个
for(i=0;i<UIP_UDP_CONNS;i++)
{
uip_udp_periodic(i); //处理UDP通信事件
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
if(uip_len > 0)
{
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
}
}
#endif 
//每隔10秒调用1次ARP定时器函数 用于定期ARP处理,ARP表10秒更新一次,旧的条目会被抛弃
if(timer_expired(&arp_timer))
{
timer_reset(&arp_timer);
uip_arp_timer();
}
}
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-25 22:22:37 | 显示全部楼层
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-11-27 13:23:58 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
具体怎么解决下呢,请问计将安出啊
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-11-29 16:35:42 | 显示全部楼层
回复【3楼】ihdu_arm:
---------------------------------
今天又查了下,导致一直显示 ENC28J60 Init Error! 的原因是:tapdev_init() 返回1,而这个tapdev_init()函数
u8 tapdev_init(void)
{     
u8 i,res=0;   
res=ENC28J60_Init((u8*)mymac); //初始化ENC28J60   
//把IP地址和MAC地址写入缓存区
  for (i = 0; i < 6; i++)uip_ethaddr.addr=mymac;  
    //指示灯状态:0x476 is HLCON LEDA(绿)=links status, LEDB(红)=receive/transmit
  //PHLCON:PHY 模块LED 控制寄存器     
ENC28J60_PHY_Write(PHLCON,0x0476);
return res;
}
中的返回值为res,再往ENC28J60_Init((u8*)mymac)查看,有两处原因会导致该函数返回1的,第一个是时钟不稳定,如下:
while(!(ENC28J60_Read(ESTAT)&ESTAT_CLKRDY)&&retry<500)//等待时钟稳定
{
retry++;
delay_ms(1);
};
if(retry>=500)return 1;//ENC28J60初始化失败
另一个是:
if(ENC28J60_Read(MAADR5)== macaddr[0])return 0;//初始化成功
else return 1;    
可能是MAC地址设置方面的问题不对,按照我板子出现的问题,应当是时钟不稳定,那么请教原子哥,如何能让时钟稳定,以及什么原因导致时钟不稳定的呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-29 23:47:58 | 显示全部楼层
回复【4楼】ihdu_arm:
---------------------------------
不要用杜邦线连接,ENC28J60离MCU越近越好
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-11-30 15:57:55 | 显示全部楼层
回复【5楼】正点原子:
--------------------------------
我的网络模块和MCU是两个独立的模块,不用杜邦线连接那怎么用呢,现在的问题依然如此,搞得心里憔悴了,还有就是当连接上去的时候,网络调试助手无法收到ARM发回来的数据,只能收到刚开始连接上去时候有发回来的一连串数据,还是16进制的数据,并不是在程序里写好的什么 ALIENTEK Welcome什么之类的提示语,然后无论怎么按键,网络助手就是收不回一点信息,有时候能收回来信息,但是还是看不懂的数字串,请问是怎么回事啊
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-11-30 16:00:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
以下就是ARM作为服务器时刚刚connect上网络助手收到的消息,然后就再无信息发回了,无论按什么按键
【Receive from 192.168.149.103: 1200】:43 6F 6E 6E 65 63 74 20 74 6F 20 41 4C 49 45 4E 54 45 4B 20 53 54 4D 33 32 20 42 6F 61 72 64 20 53 75 63 63 65 73 73 66 75 6C 6C 79 21 0D 0A
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-11-30 16:04:51 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
而且,很奇怪的是,有时候TCP Server能连得上去,但是TCP Client连不上去,或者有时候TCP Client能连的上去,但是TCP Server又连不上去,有时候两者或者都连得上去,或者都连不上去,真的是操碎了心,求原子哥指教啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-30 22:50:57 | 显示全部楼层
回复【6楼】ihdu_arm:
---------------------------------
试试lwip吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-12-1 14:07:46 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
我用的网络模块是ENC28J60,又不是DMA9000模块,移植的系统是用的uIP,这难道不是LWIP么?板子上没有自带MAC模块啊,网络的所以硬件上的设备全部都在ALIENTEK ENC28J60 网络模块上啊,请问,我该如何是好呢?
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-12-2 14:20:29 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
网络实验中,串口返回以下log表示哪儿出现什么问题啊
uIP log:ip: invalid version or header length.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-2 23:03:39 | 显示全部楼层
回复【11楼】ihdu_arm:
---------------------------------
通信数据有问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-12-6 12:28:54 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
计将安出?
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-12-7 15:09:25 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
请问原子哥,单片机里面全局变量的数据如何能保存到下次开机时还能存在或者是复位后这个全局变量还保存着,要如何做到?还有就是有没有相关的单片机对于通过网线下载电脑文件的操作啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-10 00:26:26 | 显示全部楼层
回复【14楼】ihdu_arm:
---------------------------------
不能。
存eeprom或者flash
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-1-12
在线时间
0 小时
 楼主| 发表于 2015-12-13 16:41:13 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
STM32F103ZET的战舰开发板能不能移植Linux系统,请问你有没有相关的教程可以知道Linux系统的移植过程。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-16 23:40:23 | 显示全部楼层
回复【16楼】ihdu_arm:
---------------------------------
不能
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 18:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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