新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用stm32的lwip TCP/IP協議棧的通信的思路

        利用stm32的lwip TCP/IP協議棧的通信的思路

        作者: 時間:2016-12-03 來源:網絡 收藏
        利用stm32f103vet6作為平臺,enc28j60網卡,lwip tcp/ip作為協議棧進行相應的程序編寫。

        Stm32作為服務器與stm32作為客戶端程序編寫的基本步驟,思路清理:

        本文引用地址:http://www.104case.com/article/201612/325181.htm

        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還是有很多的內容值得我們學習啊…



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 牙克石市| 庆安县| 绵竹市| 黑山县| 库尔勒市| 临高县| 长兴县| 云安县| 澎湖县| 克拉玛依市| 东城区| 太谷县| 滕州市| 禹城市| 汨罗市| 南召县| 双辽市| 宜兰县| 永胜县| 略阳县| 通江县| 神农架林区| 嘉祥县| 襄城县| 海兴县| 定结县| 宁明县| 青川县| 卓资县| 镇康县| 大田县| 靖州| 长岭县| 砚山县| 沿河| 隆化县| 庆云县| 大渡口区| 闻喜县| 三河市| 屯门区|