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

封装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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:40:56