stm32串口16进制转10进制
时间: 2025-02-25 22:44:39 浏览: 105
### STM32 串口接收16进制数据并转换为十进制
为了实现STM32通过串口接收到的16进制数据转换为十进制数值,可以遵循如下方法:
#### 初始化USART接口
确保已初始化USART,并配置好相应的参数以便能够正常收发数据。这通常涉及到设置波特率、字长、停止位以及校验方式等。
```c
void USART_Init(void){
// 配置GPIO端口模式, 上拉输入/推挽输出...
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART_InitStructure.USART_BaudRate = 115200;
// USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// USART_InitStructure.USART_StopBits = USART_StopBits_1;
// USART_InitStructure.USART_Parity = USART_Parity_No ;
// USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
// USART_Init(USART1, &USART_InitStructure);
}
```
#### 编写转换函数
创建一个专门用来把十六进制数组里的单个元素转化为十进制整型值的辅助函数。此过程可能涉及到了解ASCII编码表来区分字符'0'- '9', 'a'-'f','A'-'F'[^(2)].
```c
int HexCharToInt(char ch) {
if (ch >= '0' && ch <= '9') return ch - '0';
if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10;
if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10;
return -1; // 错误情况处理
}
```
对于多字节的数据包,则需逐一对各字节执行上述操作再组合起来形成最终的结果:
```c
uint32_t HexStringToDecimal(const char *hexStr,uint8_t length){
uint32_t result=0;
while(length--){
int value = HexCharToInt(*hexStr++);
if(value<0 || value>15)return 0xFFFFFFFF;//非法输入返回错误码
result=(result<<4)|value;
}
return result;
}
```
#### 数据接收与处理逻辑
当有新数据到达时触发中断服务程序ISR,在其中调用之前定义好的转换功能完成由Hex至Dec的变化;之后利用`printf()`或其他形式向终端反馈计算后的结果[^3].
```c
void USART_IRQHandler(void){
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
static char buffer[BUF_SIZE];
static uint8_t index = 0;
buffer[index++] = USART_ReceiveData(USART1);
if(index>=4){// 假定每次接收四个字符作为一个完整的16进制数表示
uint32_t decimalValue = HexStringToDecimal(buffer,index);
sprintf((char*)buffer,"%lu\r\n",decimalValue);// 将其转成字符串准备发送出去
for(uint8_t i=0;i<strlen((const char *)buffer);i++)
USART_SendData(USART1,buffer[i]);
index=0; // 清除索引等待下次读取新的四位序列
}
}
}
```
以上代码片段展示了如何在STM32上实现从串口接收到的一组连续的16进制字符流被解释成为对应的十进制数字的过程[^1]。
阅读全文
相关推荐


















