引发了异常: 读取访问权限冲突。 **str** 是 0x7FF762185000。
时间: 2023-11-21 21:04:26 浏览: 113
这个错误是由于在使用scanf_s函数时,没有指定输入字符串的长度,导致访问越界,从而引发了读取访问权限冲突的异常。正确的做法是在scanf_s函数中指定输入字符串的长度,例如:scanf_s("%s", str, 128)。这样就可以避免访问越界的问题了。
至于**str** 是 0x7FF762185000,这是字符串str在内存中的地址,它是一个十六进制数。在C/C++中,字符串是以字符数组的形式存储的,而字符数组在内存中是以连续的方式存储的,所以可以通过指向字符数组的指针来访问字符串。
相关问题
使用stm32读取两个传感器的数据。传感器1:首先通过UART1发送FF 01 03 02 00 00 00 00 FB关闭主动上报,发送:FF 01 03 03 02 00 00 00 F8,向传感器问询,传感器返回:XXX+%(ASCII码,数值+单位%),把返回的数值以float类型,保留四位小数保存。传感器2:通过UART2发送:11 01 01 ED读取O2 测量结果,返回结果为:16 09 01 DF1 DF2 DF3 DF4 DF5 DF6 DF7 DF8 [CS],数据处理方法为:O2 浓度值= (DF1*256 + DF2)/10 (Vol %),O2 流量值= (DF3*256 + DF4)/10 (L/min),O2 温度值= (DF5*256 + DF6)/10 (℃)。帮我写—段使用标准库函数读取这2个传感器数值的代码,请使用标准库函数
以下是使用标准库函数读取两个传感器数据的代码:
```c
#include "stm32f1xx_hal.h"
#include <stdio.h>
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{
float sensor1_value = 0.0;
float sensor2_o2_concentration = 0.0;
float sensor2_o2_flow_rate = 0.0;
float sensor2_o2_temperature = 0.0;
uint8_t sensor1_rx_buffer[20]; // 接收缓冲区
uint8_t sensor2_rx_buffer[20]; // 接收缓冲区
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
while (1)
{
// 读取传感器1的数据
// 发送关闭主动上报指令
uint8_t sensor1_cmd1[] = {0xFF, 0x01, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0xFB};
HAL_UART_Transmit(&huart1, sensor1_cmd1, sizeof(sensor1_cmd1), 100);
HAL_Delay(10);
// 发送询问指令
uint8_t sensor1_cmd2[] = {0xFF, 0x01, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0xF8};
HAL_UART_Transmit(&huart1, sensor1_cmd2, sizeof(sensor1_cmd2), 100);
// 接收传感器1的返回值
HAL_UART_Receive(&huart1, sensor1_rx_buffer, sizeof(sensor1_rx_buffer), 1000);
// 解析传感器1的返回值
char* sensor1_value_str = strstr((const char*)sensor1_rx_buffer, "%");
if (sensor1_value_str != NULL)
{
sscanf(sensor1_value_str - 7, "%f", &sensor1_value);
}
// 读取传感器2的数据
uint8_t sensor2_cmd[] = {0x11, 0x01, 0x01, 0xED};
HAL_UART_Transmit(&huart2, sensor2_cmd, sizeof(sensor2_cmd), 100);
// 接收传感器2的返回值
HAL_UART_Receive(&huart2, sensor2_rx_buffer, sizeof(sensor2_rx_buffer), 1000);
// 解析传感器2的返回值
if (sensor2_rx_buffer[0] == 0x16 && sensor2_rx_buffer[1] == 0x09 && sensor2_rx_buffer[2] == 0x01)
{
uint16_t o2_concentration_raw = (sensor2_rx_buffer[3] << 8) | sensor2_rx_buffer[4];
uint16_t o2_flow_rate_raw = (sensor2_rx_buffer[5] << 8) | sensor2_rx_buffer[6];
uint16_t o2_temperature_raw = (sensor2_rx_buffer[7] << 8) | sensor2_rx_buffer[8];
sensor2_o2_concentration = o2_concentration_raw / 10.0f;
sensor2_o2_flow_rate = o2_flow_rate_raw / 10.0f;
sensor2_o2_temperature = o2_temperature_raw / 10.0f;
}
// 打印传感器数据
printf("Sensor1 value: %f\n", sensor1_value);
printf("Sensor2 O2 concentration: %f Vol %%\n", sensor2_o2_concentration);
printf("Sensor2 O2 flow rate: %f L/min\n", sensor2_o2_flow_rate);
printf("Sensor2 O2 temperature: %f C\n", sensor2_o2_temperature);
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pin : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
需要注意的是,这段代码中的串口配置和引脚配置是针对 STM32F103C8T6 开发板的,如果你使用的是其他型号的 STM32 开发板,需要进行相应的修改。
import zlib import struct import argparse import itertools parser = argparse.ArgumentParser() parser.add_argument("-f", type=str, default=None, required=True, help="MeowMeow.png") args = parser.parse_args() bin_data = open(args.f, 'rb').read() crc32key = zlib.crc32(bin_data[12:29]) # 计算crc original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc if crc32key == original_crc32: # 计算crc对比原始crc print('宽高没有问题!') else: input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):") if input_ not in ["Y", "y", ""]: exit() else: for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度 data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29] crc32 = zlib.crc32(data) if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定 print(f"\nCRC32: {hex(original_crc32)}") print(f"宽度: {i}, hex: {hex(i)}") print(f"高度: {j}, hex: {hex(j)}") exit(0)
这是一段 Python 代码,用于对 PNG 图片进行 CRC 校验,检测图片的宽度和高度是否被修改过。程序通过打开指定的 PNG 文件,读取其中的二进制数据,计算出 CRC 校验值与原始的 CRC 校验值进行比较,如果相同则说明图片的宽度和高度没有被修改过,否则进行 CRC 爆破,通过枚举不同的宽度和高度组合来计算 CRC 校验值,直到找到与原始 CRC 校验值相同的组合为止,从而确定图片的宽度和高度。
如果你需要使用这段代码,需要先安装 Python 3 环境,并通过 pip 安装 argparse 和 itertools 两个库。然后将代码保存为 CRC.py 文件,通过命令行参数指定要进行 CRC 校验的 PNG 文件,例如:
```
python CRC.py -f MeowMeow.png
```
其中 MeowMeow.png 是你要进行 CRC 校验的 PNG 文件路径。执行程序后,如果图片的宽度和高度没有被修改过,则程序会输出宽高没有问题!否则会提示你是否进行 CRC 爆破,如果选择进行 CRC 爆破,则程序会枚举不同的宽度和高度组合,计算出 CRC 校验值,并与原始 CRC 校验值进行比较,直到找到与原始 CRC 校验值相同的组合为止,从而确定图片的宽度和高度。
阅读全文