TCP客戶端
W5500的TCP客戶端百度到處都有,而且都是一個模子
簡而言之:就是這么寫,這么用
上菜
/** * @brief TCP客戶端 * @param None * @retval None * @warning None * @example **/ void do_tcpc(void) { switch(getSn_SR(SOCK_TCPC)) /*獲取socket的狀態*/ { case SOCK_CLOSED: /*socket處於關閉狀態*/ socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND); break; case SOCK_INIT: /*socket處於初始化狀態*/ connect(SOCK_TCPC,IP,Port); /*socket連接服務器*/ break; case SOCK_ESTABLISHED: /*socket處於連接建立狀態*/ if(getSn_IR(SOCK_TCPC) & Sn_IR_CON){ setSn_IR(SOCK_TCPC, Sn_IR_CON); /*清除接收中斷標志位*/ } MainLen=getSn_RX_RSR(SOCK_TCPC); /*獲取接收的數據長度*/ if(MainLen>0){//接收到數據 recv(SOCK_TCPC,MainBuffer,MainLen); /*接收來自Server的數據*/ MainBuffer[MainLen]=0x00; /*添加字符串結束符*/ printf("\r\n接收到消息:\r\n"); UsartOutStrIT(USART1,MainBuffer,MainLen); BufferManageWrite(&send_manage_struct3,MainBuffer,MainLen,&MainLen);//把數據寫入發送緩存 } break; case SOCK_CLOSE_WAIT: /*socket處於等待關閉狀態*/ close(SOCK_TCPC); break; } }
采用的socket1作為了TCP客戶端
測試准備工作(需要連接路由器)
保證電腦/手機和W5500在同一個局域網內
1.查看自己電腦的IP地址
2.開啟TCP服務器:監聽 8080
3.修改程序中連接的IP地址:根據自己的TCP服務器IP地址修改
4.下載測試
單片機串口1 -- 連接CH340 作為日志輸出口
單片機串口3 -- 連接485
485連接如下:
測試
1.單片機程序為自動連接TCP服務器,首先保證有客戶端連接
2.服務器發消息給客戶端
3.485發送消息給TCP服務器
程序說明
1.執行DHCP以后執行TCP客戶端程序
2.接收數據以后,使用串口1打印輸出
把數據存入緩存
3.讀取緩存里面的數據,並使用串口3輸出(485)
4.如果串口3(485),緩存里面有數據,則轉發給TCP 服務器
細節說明
1.從網口接收的數據,為啥要存入緩存
然后再從緩存里面取出來以后再使用串口3發送出去?
答:你想想如何解決下面的問題
1.1.如果服務器突然過來的幾條數據間隔很短,你使用串口3發送的時候你還沒發送完就接着來新的數據了!
1.2.如果服務器過來的數據非常多,你處理數據的時候又可能有延時,你該怎么做?
1.3.有些時候需要每條數據有時間間隔,然后發送給485
1.4.如果你需要發送完一條以后,需要等待485回復呢?
2.為啥所有的串口都使用了緩存接收數據?
答:最簡單的例子
485接收的數據轉發給TCP
你想想如何解決下面的問題:
2.1 假設數據需要處理一下再發送給TCP,如果處理的時候又來了新數據怎么辦?
2.2 如果TCP服務器故障,但是我還希望最近的一條數據在服務器恢復以后接着發出去?