You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将字符串传入接收uint8_t参数的UART发送函数?

UART单字节发送函数发送字符串的解决方法

为什么你之前的方法失败

UART2_Write(uint8_t txData)是单字节发送函数,它只能接收一个uint8_t类型的单个数据。你之前的三种写法都是把字符串的指针(数组名本质是指针)传给函数,这会导致函数接收的是指针的内存地址值(而非字符串中的单个字符),自然无法正确发送目标字符串。

可行的解决方案

根据你的字符串类型,有以下几种实现方式:

1. 发送固定长度的8字符字符串

如果字符串长度固定为8,可以直接通过循环逐个发送每个字符:

// 数组方式
char UID[8] = "12345678";
for(int i = 0; i < 8; i++){
    UART2_Write((uint8_t)UID[i]); // 强制转换为uint8_t,char与uint8_t在多数系统下兼容
}

// 宏定义方式
#define UID "12345678"
for(int i = 0; i < 8; i++){
    UART2_Write((uint8_t)UID[i]);
}

2. 发送以'\0'结尾的C风格字符串

如果你的字符串是标准C风格(带结束符'\0'),可以通过循环检测结束符来发送:

const char *UID = "12345678"; // 字符串字面量默认带'\0'结束符
while(*UID != '\0'){
    UART2_Write((uint8_t)*UID++); // 发送当前字符后,指针移向下一个
}

注意:如果是char UID[8] = "12345678";这种定义,数组刚好被8个字符填满,没有多余空间存储'\0',不能用这种循环,必须改用固定长度循环。如果要支持这种方式,需定义为char UID[9] = "12345678";,预留结束符位置。

3. 封装成通用字符串发送函数

如果需要频繁发送字符串,可以封装一个专用函数,简化调用:

// 发送指定长度的字符串
void UART2_WriteString(const char *str, uint16_t len){
    for(uint16_t i = 0; i < len; i++){
        UART2_Write((uint8_t)str[i]);
    }
}

// 调用示例
char UID[8] = "12345678";
UART2_WriteString(UID, 8);

或者封装支持C风格字符串的版本:

// 发送以'\0'结尾的字符串
void UART2_WriteCString(const char *str){
    while(*str != '\0'){
        UART2_Write((uint8_t)*str++);
    }
}

// 调用示例
const char *UID = "12345678";
UART2_WriteCString(UID);

注意事项

  • char与uint8_t的兼容性:多数系统中char是8位,与uint8_t长度一致,强制转换安全。若char是有符号类型,只要发送的是ASCII字符(0-127),转换也不会出现问题。
  • 字符串边界:使用固定长度循环时,要确保循环次数与实际字符数一致;使用结束符循环时,必须保证字符串包含'\0',避免越界发送未知数据。

内容的提问来源于stack exchange,提问作者Rafay Shams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:30:55