模组没上电它的uart串口tx和rx为什么会有电压
时间: 2023-08-04 20:09:40 浏览: 73
当模组没有上电时,它的UART串口TX和RX引脚上仍然可以测量到电压,这是由于串口通信线路上可能存在干扰信号,例如外界的噪声、电磁干扰等。
在这种情况下,TX和RX引脚上的电压是浮动的,可能会随着环境和电路的变化而变化。因此,如果需要进行准确的串口通信,必须确保模组已经上电并且已经正确初始化了串口通信协议,以避免干扰信号对通信的影响。
相关问题
基于STM32HAL库读取出的温度通过广和通通讯模组L610运用串口打印AT指令上传腾讯云的代码
以下是基于STM32HAL库读取出的温度通过广和通通讯模组L610运用串口打印AT指令上传腾讯云的代码:
```c
#include "stm32xxxx.h" // 根据你所使用的STM32型号进行修改
// 定义串口配置参数
#define BAUDRATE 9600
#define UART_TX GPIO_PIN_9
#define UART_RX GPIO_PIN_10
#define UART_PORT GPIOA
#define UART USART1
// 定义广和通模组相关的配置参数
#define GPRS_TX GPIO_PIN_2
#define GPRS_RX GPIO_PIN_3
#define GPRS_PORT GPIOA
#define GPRS_USART USART2
// 定义腾讯云相关的配置参数
#define PRODUCT_ID "YOUR_PRODUCT_ID"
#define DEVICE_NAME "YOUR_DEVICE_NAME"
#define DEVICE_KEY "YOUR_DEVICE_KEY"
#define TOPIC "/YOUR_PRODUCT_ID/YOUR_DEVICE_NAME/data"
// 定义温度传感器相关的配置参数
#define TEMP_SENSOR_ADC ADC1
#define TEMP_SENSOR_CHANNEL ADC_CHANNEL_16
// 定义缓存区大小
#define BUFFER_SIZE 1024
// 定义全局变量
char buffer[BUFFER_SIZE];
// 初始化函数
void init(void)
{
// 初始化时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 使能USART1时钟
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // 使能USART2时钟
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 使能ADC1时钟
// 配置GPIOA
GPIO_InitTypeDef gpio_init_struct = {0};
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Pull = GPIO_NOPULL;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init_struct.Alternate = GPIO_AF7_USART1;
gpio_init_struct.Pin = UART_TX;
HAL_GPIO_Init(UART_PORT, &gpio_init_struct);
gpio_init_struct.Pin = UART_RX;
HAL_GPIO_Init(UART_PORT, &gpio_init_struct);
gpio_init_struct.Alternate = GPIO_AF7_USART2;
gpio_init_struct.Pin = GPRS_TX;
HAL_GPIO_Init(GPRS_PORT, &gpio_init_struct);
gpio_init_struct.Pin = GPRS_RX;
HAL_GPIO_Init(GPRS_PORT, &gpio_init_struct);
// 配置USART1
UART->CR1 = USART_CR1_TE | USART_CR1_RE;
UART->CR2 = 0;
UART->CR3 = 0;
UART->BRR = SystemCoreClock / BAUDRATE;
// 配置USART2
GPRS_USART->CR1 = USART_CR1_TE | USART_CR1_RE;
GPRS_USART->CR2 = 0;
GPRS_USART->CR3 = 0;
GPRS_USART->BRR = SystemCoreClock / BAUDRATE;
// 配置ADC1
ADC_InitTypeDef adc_init_struct = {0};
adc_init_struct.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
adc_init_struct.Resolution = ADC_RESOLUTION_12B;
adc_init_struct.DataAlign = ADC_DATAALIGN_RIGHT;
adc_init_struct.ScanConvMode = DISABLE;
adc_init_struct.ContinuousConvMode = DISABLE;
adc_init_struct.DiscontinuousConvMode = DISABLE;
adc_init_struct.NbrOfDiscConversion = 0;
adc_init_struct.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
adc_init_struct.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
HAL_ADC_Init(&adc_init_struct);
// 配置ADC1通道16
ADC_ChannelConfTypeDef adc_channel_struct = {0};
adc_channel_struct.Channel = TEMP_SENSOR_CHANNEL;
adc_channel_struct.Rank = 1;
adc_channel_struct.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
adc_channel_struct.Offset = 0;
HAL_ADC_ConfigChannel(&TEMP_SENSOR_ADC, &adc_channel_struct);
// 启动ADC1
HAL_ADC_Start(&TEMP_SENSOR_ADC);
}
// 读取温度函数
float read_temperature(void)
{
uint16_t adc_value = 0;
float temperature = 0;
// 读取温度传感器的值
HAL_ADC_Start(&TEMP_SENSOR_ADC);
if (HAL_ADC_PollForConversion(&TEMP_SENSOR_ADC, 1000) == HAL_OK) {
adc_value = HAL_ADC_GetValue(&TEMP_SENSOR_ADC);
}
// 将ADC值转换为温度
temperature = ((float)adc_value / 4095.0f) * 3.3f;
temperature = (temperature - 0.76f) / 0.0025f;
return temperature;
}
// 发送AT指令函数
void send_at_command(char* command)
{
// 发送AT指令
sprintf(buffer, "%s\r\n", command);
HAL_UART_Transmit(&GPRS_USART, (uint8_t*)buffer, strlen(buffer), 1000);
// 等待回复
HAL_UART_Receive(&GPRS_USART, (uint8_t*)buffer, BUFFER_SIZE, 10000);
}
// 上传数据到腾讯云函数
void upload_to_tencent_cloud(float temperature)
{
// 组织JSON数据
sprintf(buffer, "{\"temperature\":%f}", temperature);
// 发送MQTT消息
send_at_command("AT+CMQTTSTART");
send_at_command("AT+CMQTTACCQ:0,\"" PRODUCT_ID "\",\"" DEVICE_NAME "\",\"" DEVICE_KEY "\"");
send_at_command("AT+CMQTTPUB:0,1,0,0,\"" TOPIC "\",\"" buffer "\"");
send_at_command("AT+CMQTTSTOP");
}
int main(void)
{
// 初始化
init();
// 循环读取温度并上传到腾讯云
while (1) {
float temperature = read_temperature();
upload_to_tencent_cloud(temperature);
HAL_Delay(10000);
}
}
```
请注意,以上代码仅提供了一个简单的示例,实际应用时还需要根据具体的需求进行修改和优化。
基于STM32HAL库不用ADC转换直接读取出的温度通过广和通通讯模组L610运用串口打印AT指令上传腾讯云的代码
以下是基于STM32HAL库,通过L610通讯模组上传腾讯云的代码:
```c
#include "stdio.h"
#include "string.h"
#include "stm32f1xx_hal.h"
#define UART_TX_BUF_SIZE 1024
#define UART_RX_BUF_SIZE 1024
#define WIFI_TX_BUF_SIZE 1024
#define WIFI_RX_BUF_SIZE 1024
UART_HandleTypeDef huart2;
uint8_t uart_tx_buf[UART_TX_BUF_SIZE];
uint8_t uart_rx_buf[UART_RX_BUF_SIZE];
uint8_t wifi_tx_buf[WIFI_TX_BUF_SIZE];
uint8_t wifi_rx_buf[WIFI_RX_BUF_SIZE];
uint8_t temperature[5] = {0}; // 保存温度值
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
void uart_send_string(const char *str)
{
HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), 0xFFFF);
}
void wifi_send_string(const char *str)
{
HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), 0xFFFF);
}
void wifi_send_command(const char *command, const char *response, uint32_t timeout)
{
memset(wifi_rx_buf, 0, WIFI_RX_BUF_SIZE);
wifi_send_string(command);
HAL_Delay(timeout);
HAL_UART_Receive(&huart2, wifi_rx_buf, WIFI_RX_BUF_SIZE, timeout);
if (strstr((const char*)wifi_rx_buf, response) == NULL)
{
// 未收到期望的响应
uart_send_string("ERROR\r\n");
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
while (1)
{
// 读取温度值
uint16_t adc_value = HAL_ADC_GetValue(&hadc1);
float voltage = adc_value * 3.3 / 4096; // 计算电压值
float temperature_value = (voltage - 0.76) / 0.0025 + 25; // 计算温度值
sprintf((char*)temperature, "%.2f", temperature_value); // 转换为字符串
// 连接WiFi网络
wifi_send_command("AT+RST\r\n", "ready", 2000);
wifi_send_command("AT+CWJAP=\"your_ssid\",\"your_password\"\r\n", "OK", 5000);
// 连接腾讯云
wifi_send_command("AT+CIPSTART=\"TCP\",\"your_server_ip\",your_server_port\r\n", "OK", 5000);
wifi_send_command("AT+CIPSEND\r\n", ">", 1000);
sprintf((char*)wifi_tx_buf, "{\r\n\"temperature\": %s\r\n}\r\n", temperature);
wifi_send_string((const char*)wifi_tx_buf);
HAL_Delay(1000);
wifi_send_command("AT+CIPCLOSE\r\n", "OK", 5000);
HAL_Delay(5000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
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_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
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};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_ADC_Start(&hadc1);
}
```
需要注意的是,此代码中的以下几个参数需要根据实际情况进行修改:
- `your_ssid`: WiFi SSID
- `your_password`: WiFi 密码
- `your_server_ip`: 上传数据服务器 IP 地址
- `your_server_port`: 上传数据服务器端口号
此外,还需要在腾讯云上创建一个设备,并将该设备的证书信息配置到 L610 模组中。