一 项目背景
? ? ? ? 项目名称是模拟盘,其中主控使用的是STM32F407ZGT6,使用W5300网卡,两种通信方式:tcp_modbus(ip协议) 和 CAN通信。
? ? ? ? 从机,就是主控的下属设备。使用的芯片相同,主要就是引脚的输入输出,和CAN实现与主控之间的通信。
二 问题分析
? ? ? ? 第一次负责一个项目的,有紧张,更多的还是欣喜。来公司半年,终于要单独负责一个项目的开发了,这应该是我成长的一个体现。之前干的是某个系统中的某一块功能。从接手这个项目到今天,已经快一个月了,主控的各个模块的功能已经实现,整个项目哦,包括驱动开发,应用开发还差最后的联通调试。
? ? ? ? 昨天下午,坐在电脑前冷静分析近段时间所遇到的问题,发现了许多不足之处。
? ? ? ? 1.在给整个系统做框架时,我虽然分析好了整体流程的大概框架,我以为框架的设计,只要主体流程的正确,就可以了,但是在后续的开发过程中发现,错了。
? ? ? ? 反思:我应该分析的更详细一些,把系统中具体的每一个功能模块的流程图也分析出来。
? ? ? ? 2.程序开发过程,没有顺序性,只是想到了哪一个模块,就完善哪一个模块的功能。没有系统性,会造成程序的重复开发,对开发进度不明确,浪费时间。
? ? ? ? 反思:程序开发之前,把整个系统的逻辑框图滤清,明确的分割出不同的功能模块,进行模块化开发,当某一模块的功能完成时,进行检验,测试后,完成闭环,就是模块功能,编程实现完毕。
三 系统开发
? ? ? ? 1.主控的逻辑框图。类似于流程图,相当于流程图的上位:
?2.下面是tcp/ip协议实现的逻辑框图,使用网卡W5300.
服务器端和客户端的区别
?
?四 程序概要
? ? ? ? 1.服务器端的程序实现,它是实现与CAN和与上位机的通信
/* ----------------------- System includes ----------------------------------*/
#include <stdio.h>
#include <string.h>
#include "port.h"
#include "wizsocket.h"
/* ----------------------- lwIP includes ------------------------------------*/
#include "lwip/api.h"
#include "lwip/tcp.h"
/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"
/* ----------------------- MBAP Header --------------------------------------*/
#define MB_TCP_UID 6
#define MB_TCP_LEN 4
#define MB_TCP_FUNC 7
/* ----------------------- Defines -----------------------------------------*/
#define MB_TCP_DEFAULT_PORT 502 /* TCP listening port. */
#define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */
/* ----------------------- Prototypes ---------------------------------------*/
int W5300_TCPServer_Recv(void);
BOOL XMB_W5300_TCPServer_Send( const UCHAR * pucMBTCPFrame, USHORT usTCPLength );
volatile int sock;
/* ----------------------- Static variables ---------------------------------*/
static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE];
static USHORT usTCPBufPos;
/* ----------------------- Static functions ---------------------------------*/
/* ----------------------- Begin implementation -----------------------------*/
/*******************************************************************************
* @brief 函数名:W5300s_TCPServer_Init
*功能: W5300网卡通信流程初始化
*
*param 参数:无
*
*return 初始化是否成功
*******************************************************************************/
BOOL W5300s_TCPServer_Init(USHORT usTCPPort) // TCP Server
{
int ret;
/*创建套接字*/
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/*绑定本地IP*/
struct sockaddr_in LocalAddr;
memset(&LocalAddr, 0, sizeof(LocalAddr)); //每个字节都用0填充
LocalAddr.sin_family = PF_INET;
LocalAddr.sin_addr = inet_addr("192.168.1.6");
LocalAddr.sin_port = usTCPPort;
ret = bind(sock,(struct sockaddr *)&LocalAddr, sizeof(LocalAddr)); //绑定
if(ret < 0)
return FALSE;
/*进入监听状态*/
ret = listen(sock, 20);
if(ret < 0)
return FALSE;
return TRUE;
}
/****************************************************************************************************************************************************/
/*
* @brief tcp_sendto_can 接收tcp数据中的modbus
*
* @param None
*
* @return int型数据
*/
/****************************************************************************************************************************************************/
int W5300_TCPServer_Recv(void)
{
int ret = 0; //数据长度
int reflag = FALSE;
/*接收客户端请求*/
int clntSock;
struct sockaddr_in clntAddr;
int nSize = sizeof(clntAddr);
/*等待客户端链接,阻塞 */
//vDebug("Waiting for client connection...\n");
while(1)
{
clntSock = accept(sock, (struct sockaddr*)&clntAddr, &nSize);
if(clntSock != -1)
break;
}
/*接收客户端数据*/
//vDebug("Waiting for client to send data...\n");
while(1)
{
ret = recv(clntSock,aucTCPBuf,sizeof(aucTCPBuf), NULL);
if(ret != -1)
{
reflag = TRUE;
break;
}
}
usTCPBufPos = (USHORT)ret; //供modbus使用
return reflag;
}
BOOL
xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength )
{
*ppucMBTCPFrame = &aucTCPBuf[0];
*usTCPLength = usTCPBufPos;
/* Reset the buffer. */
usTCPBufPos = 0;
return TRUE;
}
/*******************************************************************************
* XMBTCP_Can_Sendto_Tcp
* 接收虚拟寄存器中的数据,然后使用W5300发送出去
*
*******************************************************************************/
BOOL XMB_W5300_TCPServer_Send( const UCHAR * pucMBTCPFrame, USHORT usTCPLength )
{
/*接收客户端请求*/
int clntSock;
struct sockaddr_in clntAddr;
int nSize = sizeof(clntAddr);
/*等待客户端链接*/
//vDebug("Waiting for client connection...\n");
while(1)
{
//应该增加连接超时处理机制
clntSock = accept(sock, (struct sockaddr*)&clntAddr, &nSize);
if(clntSock != -1)
break;
}
/*向客户端发送数据*/;
send(clntSock, pucMBTCPFrame, usTCPLength, 0);
return TRUE;
}
|