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

如何将字符数组传入接收void*指针的函数?(串口read场景)

串口读取函数封装的问题修复

核心错误分析

  • 错误1:read的buf参数传递错误
    在readSerial函数中,msg本身就是指向serial_rmsg数组的指针,你却传入了&msg——这会把指针变量自身的内存地址传给read,导致串口数据被写入指针变量的位置,而非目标数组。正确的做法是直接传递msg。

  • 错误2:printf调用参数顺序颠倒
    printf(serial_rmsg , "%s");的写法完全不符合函数规范,printf要求第一个参数是格式字符串,第二个才是要输出的变量,正确写法为printf("%s", serial_rmsg);。

  • 额外隐患:未处理字符串终止符与读取错误
    read函数不会自动在读取的字节后添加\0,直接用printf("%s")输出会导致读取到内存垃圾数据;同时未检查read的返回值,无法判断读取是否成功。

修正后的代码

#include <unistd.h>
#include <stdio.h>
#include <termios.h>

// 假设serial_port是已正确初始化的串口文件描述符
int serial_port;

void readSerial(char* msg) {
    ssize_t num_bytes;

    // 直接传递msg,指向目标数组的起始地址
    num_bytes = read(serial_port, msg, 255); // 预留1字节给字符串终止符

    if (num_bytes > 0) {
        // 添加字符串终止符,确保printf能正确识别字符串结尾
        msg[num_bytes] = '\0';
    } else if (num_bytes == -1) {
        // 打印读取错误信息,避免后续输出异常
        perror("read failed");
        msg[0] = '\0';
    }
}

int main(void) {
    char serial_rmsg[256] = {0};

    readSerial(serial_rmsg);
    // 修正printf参数顺序,添加换行符优化输出
    printf("%s\n", serial_rmsg);

    return 0;
}

关键修正说明

  1. 将&msg改为msg,让read直接写入目标数组的内存空间;
  2. 限制read的读取长度为255,预留一个字节存储\0,避免数组越界;
  3. 处理read的返回值:成功时添加字符串终止符,失败时打印错误并清空数组;
  4. 调整printf的参数顺序,符合函数调用规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:15:06