使用淘晶驰等串口屏通讯单片机时,使用ASCII编码格式输出到单片机后需要转换为无符号数字,制作了个函数用于实现。
int32_t parse_usart_w_data(const uint8_t *data_buf, uint16_t data_len, uint32_t *num)
{
// 参数说明:
// data_buf: 指向ASCII数字字符数组的指针
// data_len: 数组的长度
// num: 输出转换后的32位整数
uint64_t temp_num = 0; // 临时存储(防止32位溢出)
// 检查输入参数的有效性
if (data_buf == NULL || num == NULL || data_len == 0) {
return -1;
}
// 遍历数字ASCII字符,转换为数值
for (uint16_t i = 0; i < data_len; i++) {
// 检查是否为数字ASCII(0-9)
if (data_buf[i] < '0' || data_buf[i] > '9') {
return -1; // 包含非数字字符,解析失败
}
// 转换:当前值*10 + 新数字(ASCII转数字)
temp_num = temp_num * 10 + (data_buf[i] - '0');
// 检查是否超出32位无符号整数范围(0~0xFFFFFFFF)
if (temp_num > 0xFFFFFFFFUL) {
return -1;
}
}
// 转换完成,赋值给输出参数
*num = (uint32_t)temp_num;
return 0;
}
parse_usart_w_data(const uint8_t *data_buf, uint16_t data_len, uint32_t *num),data_buf为串口收到的数据存储到数组中,data_len数据长度,num为转换后得到的结果。
使用示例,ascii_data1为模拟收到的串口数据,result转换后的结果输出:12345
// 示例1:直接使用ASCII字符数组
int main() {
uint32_t result;
const uint8_t ascii_data1[] = {'1', '2', '3', '4', '5'};
if (parse_usart_w_data(ascii_data1, sizeof(ascii_data1), &result) == 0) {
printf("转换结果: %u\n", result); // 输出: 12345
}
return 0;
}
1430

被折叠的 条评论
为什么被折叠?



