封装USART6收发函数时出现expression must have pointer-to-object type报错求助
USART6_TxRx函数编译错误问题分析与修复
错误根源
编译报错“expression must have pointer-to-object type”的核心原因是函数参数类型不匹配,连带引发后续语法和逻辑错误,具体问题分三点:
1. 函数参数定义错误
原代码中发送的是uint8_t类型数组,而封装后的函数参数定义为uint8_t input——这是单个字节变量,并非指针或数组类型。input[usart6_tx_counter++]这种下标访问语法仅适用于指针/数组,对单个uint8_t变量使用会直接触发编译错误。
2. strlen函数参数非法
strlen()要求传入字符串指针(char*或兼容的uint8_t*),但当前传入的是单个uint8_t变量,编译器会把字节值当作内存地址处理,不仅编译不通过,还会导致运行时未定义行为。
3. 函数调用语法错误
调用时写USART6_TxRx(*usart6_tx_buffer[]);是完全错误的语法:
usart6_tx_buffer本身就是数组名,会隐式转换为指向首元素的指针,无需加[]- 前面的
*解引用操作也是多余的,正确调用只需传入数组名即可。
修正后的代码
1. 正确的函数定义
void USART6_TxRx(uint8_t *input) // 参数改为指针类型,接收数组地址 { while (usart6_tx_counter < strlen((char*)input)) // 强制转换为char*适配strlen(若编译器要求) { while (usart_flag_get(USART6, USART_TDBE_FLAG) == RESET); usart_data_transmit(USART6, input[usart6_tx_counter++]); } delay_sec(1); usart6_tx_counter = 0x00; printf("string: %s\r\n", (char*)usart6_rx_buffer); // 若rx_buffer是uint8_t,需转char* for (usart6_rx_counter = 0; usart6_rx_counter < sizeof(usart6_rx_buffer); usart6_rx_counter++) { usart6_rx_buffer[usart6_rx_counter] = 0; } usart6_rx_counter = 0; }
2. 正确的函数调用
uint8_t usart6_tx_buffer[] = "AT+CPSI?\r\n"; USART6_TxRx(usart6_tx_buffer); // 直接传入数组名(隐式转为指针)
补充说明
如果你的项目中uint8_t和char是等价的(多数嵌入式编译器中是这样),也可以把函数参数直接定义为char* input,这样无需强制转换,代码更简洁。
内容的提问来源于stack exchange,提问作者Popsicle
相关产品推荐
相关产品推荐

