确认字符ACK

ACK确认机制详解
部署运行你感兴趣的模型镜像
ACK (Acknowledgement:确认),即确认字符,在数据通讯过程中,接收方在收到发送方的请求后,给发送方发送一种传输类控制字符发,用以表示发来的数据已确认接收无误。

在TCP/IP协议中,如果接收方成功的接收到数据,就会回复发送方一个ACK数据。一般情况下ACK信号有自己固定的格式,长度,大小.由接收方回复给发送方。其格式取决于采取的网络协议。当发送方接收到ACK信号,即得到回复时,发送方就可以发送下一个数据。如果发送方没有收到AWK确认信号,那么发送方可能会重发当前的数据包,也可能停止传送数据。具体情况取决于所采用的网络协议。

1、TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段。[6个比特位: 紧急比特(URGent),确认比特(ACK),急迫比特(PSH),复位比特(ReSeT),同步比特(SYN),终止比特(FINal)]

2. 在USB传输中,ACK事务包用来向主机/设备报告包正确的传输。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

#include "SHT30.h" #define SHT30I2C_SCL GPIO_PIN_2 #define SHT30I2C_SDA GPIO_PIN_3 #define GPIO_I2C GPIOC #define I2C_SCL_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SCL) #define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SCL) #define I2C_SDA_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SDA) #define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SDA) #define SDA_IN GPIO_ReadInputDataBit(GPIO_I2C,SHT30I2C_SDA) #define write 0 //第8位是写命令 #define read 1 //第8位是读命令 //定义温湿度存储变量 u8 humiture_buff1[20]; float Temperature = 0.000000; float Humidity = 0.000000; //初始化IIC void SHT30_Init(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出 GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA; GPIO_InitStructure.Pin = SHT30I2C_SCL | SHT30I2C_SDA; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); I2C_SCL_H; I2C_SDA_H; } //设置为输出模式 static void I2C_SDA_OUT(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出 GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA; GPIO_InitStructure.Pin = SHT30I2C_SDA; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); } //设置为输入模式 static void I2C_SDA_IN(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStruct(&GPIO_InitStructure); GPIO_InitStructure.Pin = SHT30I2C_SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input; GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); } //主机发送确认字符ACK void IIC_ACK(void) { I2C_SDA_OUT(); I2C_SCL_L; Delayus(2); I2C_SDA_L; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(1); } //主机不发送确认字符ACK void IIC_NACK(void) { I2C_SDA_OUT();//输出模式 I2C_SCL_L; Delayus(2); I2C_SDA_H; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(1); } //主机等待从机的确认字符ACK u8 IIC_wait_ACK(void) { u8 t = 200; I2C_SDA_OUT(); I2C_SDA_H; Delayus(1); I2C_SCL_L; Delayus(1); I2C_SDA_IN(); Delayus(1); while(SDA_IN)//等待SHT30应答 { t--; Delayus(1); if(t == 0) { I2C_SCL_L; return 1; } Delayus(1); } Delayus(1); I2C_SCL_H; Delayus(1); I2C_SCL_L; Delayus(1); return 0; } //启动IIC通讯 void IIC_Start(void) { I2C_SDA_OUT(); I2C_SDA_H; I2C_SCL_H; Delayus(4); I2C_SDA_L; Delayus(4); I2C_SCL_L; } //结束IIC总线通讯 void IIC_Stop(void) { I2C_SDA_OUT(); I2C_SCL_L; I2C_SDA_L; Delayus(4); I2C_SCL_H; Delayus(4); I2C_SDA_H; Delayus(4); } //将byte数据发送出去 void IIC_SendByte(u8 byte) { u8 Count; I2C_SDA_OUT(); I2C_SCL_L; for(Count = 0; Count < 8; Count++) //要传送的数据长度为8位 { if(byte & 0x80) { I2C_SDA_H; } else { I2C_SDA_L; } byte <<= 1; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(2); } } //用来接收从器件传来的数据 u8 IIC_RcvByte(void) { u8 retc; u8 Count; retc = 0; I2C_SDA_IN();//配置数据线为输入方式 Delayus(1); for(Count = 0; Count < 8; Count++) { I2C_SCL_L; Delayus(2); I2C_SCL_H; retc = retc << 1; if(SDA_IN) retc |= 1; Delayus(1); } I2C_SCL_L; return(retc); } //读取系列号 u8 ReadHumitureSensorType(u8 addr) { u32 SerialNumber = 0; u8 type = TYPE_SHT40;//默认是TYPE_SHT30 // u8 type = TYPE_SHT30;//默认是TYPE_SHT30 #if 0 u8 buff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; IIC_Start(); IIC_SendByte(addr << 1 | write); IIC_wait_ACK(); IIC_SendByte(0x89); IIC_wait_ACK(); IIC_Stop(); Delayms(50); IIC_Start(); IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位 if(!IIC_wait_ACK()) { Delayus(1); buff[0] = IIC_RcvByte(); //返回系列号的高8位 IIC_ACK(); buff[1] = IIC_RcvByte(); //返回系列号的高8位 IIC_ACK(); buff[2] = IIC_RcvByte(); //温度crc校验位 IIC_ACK(); buff[3] = IIC_RcvByte(); //返回湿度高8位 IIC_ACK(); buff[4] = IIC_RcvByte(); //返回湿度低8位 IIC_ACK(); buff[5] = IIC_RcvByte(); //湿度crc校验位 IIC_NACK(); IIC_Stop(); } else { SerialNumber = 0; IIC_Stop(); Delayms(50); } SerialNumber = buff[0]; SerialNumber <<= 8; SerialNumber |= buff[1]; SerialNumber <<= 8; SerialNumber |= buff[3]; SerialNumber <<= 8; SerialNumber |= buff[4]; if(SerialNumber > 0) { type = TYPE_SHT40; } #endif return type; } //读出温湿度 void SHT30_read_result(u8 addr, u8 type) { int ret = 0; u16 tem, hum; u16 buff[6]; //发送指令为0x2C06(默认) IIC_Start(); IIC_SendByte(addr << 1 | write); //写7位I2C设备地址加0作为写取位,1为写取位 IIC_wait_ACK(); if(type == TYPE_SHT40) { //SHT40 IIC_SendByte(0xFD); IIC_wait_ACK(); } else { //SHT30 IIC_SendByte(0x2c); IIC_wait_ACK(); IIC_SendByte(0x06); IIC_wait_ACK(); } IIC_Stop(); Delayms(50); IIC_Start(); IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位 ret = IIC_wait_ACK(); if(!ret) { Delayus(1); buff[0] = IIC_RcvByte(); //返回温度高8位 IIC_ACK(); buff[1] = IIC_RcvByte(); //返回温度低8位 IIC_ACK(); buff[2] = IIC_RcvByte(); //温度crc校验位 IIC_ACK(); buff[3] = IIC_RcvByte(); //返回湿度高8位 IIC_ACK(); buff[4] = IIC_RcvByte(); //返回湿度低8位 IIC_ACK(); buff[5] = IIC_RcvByte(); //湿度crc校验位 IIC_NACK(); IIC_Stop(); } tem = ((buff[0] << 8) | buff[1]); hum = ((buff[3] << 8) | buff[4]); if(type == TYPE_SHT40) { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 125.0 * (float)hum / 65535.0 - 6; } else { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 100.0 * (float)hum / 65535.0; } hum = 0; tem = 0; } 使用这个温湿度传感器的数据
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值