如何在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
相关产品推荐
相关产品推荐

