微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用stm32的lwip TCP/IP协议栈的通信的思路

利用stm32的lwip TCP/IP协议栈的通信的思路

时间:12-03 来源:互联网 点击:
利用stm32f103vet6作为平台,enc28j60网卡,lwip tcp/ip作为协议栈进行相应的程序编写。

Stm32作为服务器与stm32作为客户端程序编写的基本步骤,思路清理:

1、stm32作为服务器端

当stm32作为服务器端的时候,首先有一点要明确的是端口与ip的确定性,当然,后期需要改变的是,如果服务器地址的变动,就需要相应的做些程序的改变。

程序的步骤如下所示:

1、利用lwip对网卡做相应的初始化工作,例如ip地址,网络掩码,以及网关的操作。

2、对服务器端的相应操作。(包括pcb控制块的获取,结构体的初始化工作。)

3、绑定相应的远程计算机,设置相应的ip地址和端口。

4、监听相应的信息

注意:监听的时候,需要重新设置的是pcb结构体的内存布局,节省内存空间。监听其实也是一个获取信息的过程,控制块在进行回调的时候,是有主机相关的参与,控制块也会相应的改变。

5、连接

在监听相应的端口的操作完毕之后,数据的接收和发送的工作就在这个时刻完成,在接收数据的程序当中,相应的可以通过一个tcp_write的操作将数据显示在浏览器当中。需要明确的是,一个send的数据,和一个write的功能是有差别的。

最后注意一点:

由于stm32是一个服务器端,因此不可避免的是,服务器端的tcp连接是不用手动进行断开的,那么有两个操作是附带的。一个是pcb控制块的内存空间是不用进行释放的,另外一个就是tcp的连接是不用断开的。

2、stm32作为客户端

Stm32作为客户端,所需要的操作和stm32作为服务器端的思想有一个转变的过程,思路如下:

1、初始化网卡的相关信息。客户端的相关操作有,ip地址,掩码,网关的操作。

2、pcb块的获取。进行相关的结构体的初始化,分配内存空间。

3、进行连接。前提是有Ip地址和相应的端口可以给出,这里API给出了相关的回调方法(函数)。

4、释放掉pcb块的内存。

5、断开tcp的连接。

2013年7月11日晚上:

今天一天都在调试tcp_connect()函数,唉,现在分析一下原因:一、网上的资料,弄来弄去,都是一个将stm32当作服务器,很少是将stm32当作客户端的,也许,配置pc服务器对它们来说是一件费力的事情。二、没有资料,只好自己一下下花时间的去调试,可悲的是,晚上才明白原来自己把网络的远程地址的赋值方法设置的是有一定问题的,我是按照给的方案塞地址的,这种方法不对。三、我怀疑的是我搭建的服务器有问题,确实,再我回头搞服务器的时候,它却根本不听我的话。三、就是电脑的防火墙,这个我只能是听网上的说这个东东。

解决办法是:上面我给的思路是没有问题的,按照那个思路,离成功不远,也许一次能成功,都是靠慢慢来的。而且,昨天,我在做这个测试的完毕,想上网的时候,给电脑插上网线,我的电脑不能上网了,郁闷,难道我还得考虑网卡的问题,而且,网卡灯是闪着的,却不能上……,当然,今天我是测速过ping的。wireshark也是做了哦。

服务器的配置,可以用C++进行配置,当然也可以用java来配置,这个比C++简单多了。

代码附上:

package ServerAndCustomer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10000);
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
System.out.println(line);
socket.close();
server.close();
}

}
当然了,一般是需要给客户端写上测试程序的:

package ServerAndCustomer;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class customer {
public static void main(String[] args) throws Exception{
Socket socket = new Socket(InetAddress.getLocalHost(), 10000);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("i am customer");

bw.close();
socket.close();
}
}
终于将代码与思路理清,lwip还是有很多的内容值得我们学习啊…

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top