文章目录
前言
调试
一、UDP、套接字(Socket)和CH392T
1.以太网和Socket通信基础了解
以太网通信
- 以太网是一种局域网(LAN)技术,基于IEEE 802.3标准,用于在物理层和数据链路层传输数据帧。
- 核心功能:
- 物理介质传输(如双绞线、光纤);
- MAC地址寻址;
- 冲突检测与避免(CSMA/CD)。
- 协议层次:OSI模型的物理层和数据链路层。
Socket通信:
-
Socket是网络通信的编程接口,基于IP地址和端口号标识通信端点,支持TCP/UDP协议。
-
核心功能:
- 建立/管理网络连接。
- 数据的分片、传输与重组。
- 提供面向连接(TCP)或无连接(UDP)的通信模式。
-
协议层次:OSI模型的传输层与应用层之间的接口。
特性 | 以太网通信 | Socket通信 |
---|---|---|
协议层次 | 物理层 + 数据链路层 | 传输层 + 应用层接口 |
寻址方式 | MAC地址 (如00:1A:2B:3C:4D) | IP地址 + 端口号 (如192.168.0.1:8080) |
传输可靠性 | 无可靠性保证(依赖上层协议) | TCP可靠(确认重传),UDP不可靠 |
数据单元 | 数据帧(Frame) | 数据包(Packet)或数据报(Datagram) |
数据单元 | 数据帧(Frame) | 数据包(Packet)或数据报(Datagram) |
2.两者交互方式
Socket依赖以太网:Socket通信通过TCP/IP协议栈运行,底层依赖以太网传输数据帧
数据封装流程:应用数据 → TCP/UDP报文 → IP包 → 以太网帧 → 物理信号
以太网通信:
- 物理连接:通过交换机、路由器等设备建立物理链路。
- 数据帧传输:
- 发送方:将数据封装为以太网帧(含源/目的MAC地址)。
- 接收方:通过MAC地址匹配接收帧,进行校验和解析。
- 冲突处理:使用CSMA/CD机制检测冲突并重传。
- 广播/单播:支持广播(如ARP请求)和单播通信。
Socket通信:
-
连接建立(以TCP为例):
- 服务器:创建Socket → 绑定IP/端口 → 监听(listen())。
- 客户端:创建Socket → 发起连接(connect())。
- 三次握手:SYN → SYN-ACK → ACK。
-
数据传输:
- 发送:调用send()将数据通过TCP/UDP封装为报文。
- 接收:调用recv()解析报文并提取应用层数据。
-
连接终止(TCP):
- 四次挥手:FIN → ACK → FIN → ACK。
-
交互模式:
- TCP:流式传输,保证顺序和可靠性。
- UDP:报文传输,低延迟但可能丢包。
3.TCP和UDP的认识
1.基本概念
TCP(Transmission Control Protocol,传输控制协议)
-
定义:一种面向连接的、可靠的传输层协议,确保数据按序、完整地传输。
-
核心特点:
通过三次握手建立连接,四次挥手断开连接。
支持数据确认、重传、流量控制和拥塞控制。
UDP(User Datagram Protocol,用户数据报协议)
- 定义:一种无连接的、不可靠的传输层协议,提供尽力而为的数据传输。
- 核心特点:
无需建立连接,直接发送数据报。
不保证数据顺序、完整性或可达性。
2. 首部结构与开销
-
TCP首部(20字节 + 可选字段):
包含序列号、确认号、窗口大小、校验和等字段。
示例字段:源端口、目的端口、序列号、ACK号、标志位(SYN/ACK/FIN)。 -
UDP首部(8字节):
仅包含源端口、目的端口、长度和校验和。
示例字段:源端口、目的端口、长度、校验和。
4.CH392
CH392 支持两种通讯接口:SPI 接口或者异步串口,这里选取异步串口通讯接口控制 CH392 芯片进行以太网通讯
二、驱动代码
1.main函数
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/*测试 发送buf*/
uint8_t temp_buf[256];
uint16_t j;
for(j = 0; j<256;j++)
{
temp_buf[j] = j;
}
uint8_t i;
BSP_Init(); //外设初始化
CH392SetUartBaudRate(921600); //设置CH392SetUart波特率921600
xWriteCH392Cmd(CMD00_RESET_ALL); //执行硬件复位,等待50ms
delay_ms(200);
i = CH392CMDGetVer(); //获取芯片和固件版本号
InitCH392InfParam(); //初始化CH392Inf参数
i = CH392Init(); //初始化CH392
mStopIfError(i); //检查是否成功
while (1)
{
if (CH392CMDGetPHYStatus() == PHY_DISCONN) /* 获取 PHY 的连接状态 */
{
delay_ms(200); /* If no, wait for 200MS and query again */
}
else
{
// printf("CH392 Connect Ethernet\r\n"); /*When the CH392 is connected to the Ethernet, an interruption occurs */
break;
}
}
InitSocketParam(); /* 初始化套接字相关变量 */
CH392SocketInitOpen();/*配置CH392的socket参数,初始化并打开CH392的socket*/
while (1)
{
if (Query392Interrupt() == GPIO_PIN_RESET) //INT
{
CH392GlobalInterrupt();
}
/*发送数据*/
CH392CMDSendData(0, temp_buf, 256);
}
}
2.发送命令函数
为了区分命令码和数据,CH392 要求单片机先通过串口发送两个同步码字节(57H 和 ABH),然后再发送命令码,接着是发送数据或者接收数据
/********************************************************************************
* Function Name : xWriteCH392Cmd
* Description : 发送命令
* Input : cmd
* Output : None
* Return : None
*******************************************************************************/
void xWriteCH392Cmd(uint8_t cmd)
{
CMD_START_HANDEL;
USART3_SendByte(SER_SYNC_CODE1);
USART3_SendByte(SER_SYNC_CODE2);
USART3_SendByte(cmd);
}
/* Command header */
#define SER_SYNC_CODE1 0x57 /* Serial port command synchronization code 1 */
#define SER_SYNC_CODE2 0xAB /* Serial port command synchronization code 2 */
三、参数配置和数据抓取
1.设置波特率
该命令用于设置 CH392 的串口通讯波特率。在 CH392 工作于串口通讯方式时,复位后默认的通讯波特率默认是 9600bps。如果单片机支持较高的通讯速度,可以通过该命令动态调整串口通讯波特率。该命令需要输入三个数据,分别是波特率系数 0、波特率系数 1、波特率系数 2,下表是与波特率的对应关系, 计算公式:
BaudRate = (波特率系数 2 <<16) + (波特率系数 1 << 8) + 波特率系数 0。
/*******************************************************************************
* Function Name : CH392SetUartBaudRate
* Description : Set 392 Uart BaudRate
* Input : BaudRate
* Output : None
* Return : s
*******************************************************************************/
uint8_t CH392SetUartBaudRate(uint32_t baudrate)
{
uint8_t s = CH392_ERR_UNKNOW;
#if (CH392_OP_INTERFACE_MODE == CH392_UART_MODE)
CH392CMDSetUartBaudRate(baudrate); /* Set BaudRate */
MX_UART3_Init(baudrate); //设置MCU波特率
s = xReadCH392Data(); /* If the setting is successful CH392 return CMD_ERR_SUCCES */
// if (s == CMD_ERR_SUCCESS)
// printf("Set Success\r\n");
#endif
return s;
}
返回的 1 个字节数据是, 输出操作状态
2.执行硬件复位
采用硬件电路复位,需要写0x05,该命令使 CH392 执行硬件复位。通常情况下,硬件复位在 50mS 时间之内完成。
3.读取版本号
/********************************************************************************
* Function Name : CH392CMDGetVer
* Description : Obtain the chip and firmware version number
* Input : None
* Output : None
* Return : Version number
*******************************************************************************/
uint8_t CH392CMDGetVer(void)
{
uint8_t i;
xWriteCH392Cmd(CMD01_GET_IC_VER); //获取芯片和固件版本号
i = xReadCH392Data(); //返回0x18
xEndCH392Cmd();
return i;
}
返回的 1 个字节数据是版本号,得到的版本号为0x18。
4.写入、读取(0x43)IP、网关等信息
代码如下(示例):
/* CH392 Related definition */
const uint8_t CH392IPAddr[4] = {192, 168, 0, 101}; /* CH392 IP */
const uint8_t CH392GWIPAddr[4] = {192, 168, 0, 1}; /* CH392 gateway */
const uint8_t CH392IPMask[4] = {255, 255, 255, 0}; /* CH392 mask */
/* Socket Related definition*/
const uint8_t Socket0DesIP[4] = {192, 168, 0, 122}; /* Socket 0 des IP */
const uint16_t Socket0SourPort = 1000; /* Socket 0 sour port 本地端口*/
const uint16_t Socket0DesPort = 1000; /* Socket 0 des port 目的端口*/
配置CH392的IP、网关 子网掩码
xWriteCH392Cmd(CMD014_GET_IP_INF); 读取
GET_IP_INF(0x43)该命令 用于获取 IP、GatewayIP、MASK、DNS 等信息
收到此命令后,CH392 会依次输出 20 个字节的数据,分别为:4 字节 IP 地址、4 字节网关 IP、4 字节子网掩码、4 字节 DNS1(主 DNS)、4 字节 DNS2(次 DNS)。
与写入的数据一直
5.获取 PHY 的连接状态
连接状态代码为 01H 时表示 PHY 连接断开;
连接状态代码为 02H 时表示 PHY 连接为 10M 全双工;
连接状态代码为 04H 时表示 PHY 连接为 10M 半双工;
6.轮询中断状态
返回数据为0x00, 说明没有产生任务中断
7.插拔网线查询
拔插网线,查0x19命令会返回0x04
8. 写数据
9. CMD查看端口
#查看端口是否被占用
netstat -aon|findstr “1000”
10.以太网的状态
电脑适配器所显示的ip是电脑网卡自身的ip,点击属性
查看自己主机的IP,修改IP
11.CH392与电脑进行连接
这里测试192, 168, 0, 101存在,IP后面改为了192, 168, 0, 254
当ping程序中所写的IP,即const uint8_t CH392IPAddr[4] = {192, 168, 0, 254}; /* CH392 IP */
验证,插上ping通,拔下ping不通
总结
关于使用网络助手使用见下一篇笔记