<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 利用stm32的lwip TCP/IP協(xié)議棧的通信的思路

          利用stm32的lwip TCP/IP協(xié)議棧的通信的思路

          作者: 時(shí)間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          利用stm32f103vet6作為平臺(tái),enc28j60網(wǎng)卡,lwip tcp/ip作為協(xié)議棧進(jìn)行相應(yīng)的程序編寫。

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

          本文引用地址:http://www.ex-cimer.com/article/201612/325181.htm

          1、stm32作為服務(wù)器端

          當(dāng)stm32作為服務(wù)器端的時(shí)候,首先有一點(diǎn)要明確的是端口與ip的確定性,當(dāng)然,后期需要改變的是,如果服務(wù)器地址的變動(dòng),就需要相應(yīng)的做些程序的改變。

          程序的步驟如下所示:

          1、利用lwip對(duì)網(wǎng)卡做相應(yīng)的初始化工作,例如ip地址,網(wǎng)絡(luò)掩碼,以及網(wǎng)關(guān)的操作。

          2、對(duì)服務(wù)器端的相應(yīng)操作。(包括pcb控制塊的獲取,結(jié)構(gòu)體的初始化工作。)

          3、綁定相應(yīng)的遠(yuǎn)程計(jì)算機(jī),設(shè)置相應(yīng)的ip地址和端口。

          4、監(jiān)聽相應(yīng)的信息

          注意:監(jiān)聽的時(shí)候,需要重新設(shè)置的是pcb結(jié)構(gòu)體的內(nèi)存布局,節(jié)省內(nèi)存空間。監(jiān)聽其實(shí)也是一個(gè)獲取信息的過程,控制塊在進(jìn)行回調(diào)的時(shí)候,是有主機(jī)相關(guān)的參與,控制塊也會(huì)相應(yīng)的改變。

          5、連接

          在監(jiān)聽相應(yīng)的端口的操作完畢之后,數(shù)據(jù)的接收和發(fā)送的工作就在這個(gè)時(shí)刻完成,在接收數(shù)據(jù)的程序當(dāng)中,相應(yīng)的可以通過一個(gè)tcp_write的操作將數(shù)據(jù)顯示在瀏覽器當(dāng)中。需要明確的是,一個(gè)send的數(shù)據(jù),和一個(gè)write的功能是有差別的。

          最后注意一點(diǎn):

          由于stm32是一個(gè)服務(wù)器端,因此不可避免的是,服務(wù)器端的tcp連接是不用手動(dòng)進(jìn)行斷開的,那么有兩個(gè)操作是附帶的。一個(gè)是pcb控制塊的內(nèi)存空間是不用進(jìn)行釋放的,另外一個(gè)就是tcp的連接是不用斷開的。

          2、stm32作為客戶端

          Stm32作為客戶端,所需要的操作和stm32作為服務(wù)器端的思想有一個(gè)轉(zhuǎn)變的過程,思路如下:

          1、初始化網(wǎng)卡的相關(guān)信息。客戶端的相關(guān)操作有,ip地址,掩碼,網(wǎng)關(guān)的操作。

          2、pcb塊的獲取。進(jìn)行相關(guān)的結(jié)構(gòu)體的初始化,分配內(nèi)存空間。

          3、進(jìn)行連接。前提是有Ip地址和相應(yīng)的端口可以給出,這里API給出了相關(guān)的回調(diào)方法(函數(shù))。

          4、釋放掉pcb塊的內(nèi)存。

          5、斷開tcp的連接。

          2013年7月11日晚上:

          今天一天都在調(diào)試tcp_connect()函數(shù),唉,現(xiàn)在分析一下原因:一、網(wǎng)上的資料,弄來弄去,都是一個(gè)將stm32當(dāng)作服務(wù)器,很少是將stm32當(dāng)作客戶端的,也許,配置pc服務(wù)器對(duì)它們來說是一件費(fèi)力的事情。二、沒有資料,只好自己一下下花時(shí)間的去調(diào)試,可悲的是,晚上才明白原來自己把網(wǎng)絡(luò)的遠(yuǎn)程地址的賦值方法設(shè)置的是有一定問題的,我是按照給的方案塞地址的,這種方法不對(duì)。三、我懷疑的是我搭建的服務(wù)器有問題,確實(shí),再我回頭搞服務(wù)器的時(shí)候,它卻根本不聽我的話。三、就是電腦的防火墻,這個(gè)我只能是聽網(wǎng)上的說這個(gè)東東。

          解決辦法是:上面我給的思路是沒有問題的,按照那個(gè)思路,離成功不遠(yuǎn),也許一次能成功,都是靠慢慢來的。而且,昨天,我在做這個(gè)測(cè)試的完畢,想上網(wǎng)的時(shí)候,給電腦插上網(wǎng)線,我的電腦不能上網(wǎng)了,郁悶,難道我還得考慮網(wǎng)卡的問題,而且,網(wǎng)卡燈是閃著的,卻不能上……,當(dāng)然,今天我是測(cè)速過ping的。wireshark也是做了哦。

          服務(wù)器的配置,可以用C++進(jìn)行配置,當(dāng)然也可以用java來配置,這個(gè)比C++簡(jiǎn)單多了。

          代碼附上:

          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();
          }

          }
          當(dāng)然了,一般是需要給客戶端寫上測(cè)試程序的:

          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還是有很多的內(nèi)容值得我們學(xué)習(xí)啊…



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();