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

ESP32与游戏代码串口通信:特定字节无法读取问题排查

ESP32与游戏代码串口通信异常问题:特定字节无法读取

问题背景

我在搭建自制ESP32控制器与游戏代码的通信连接,当前方案是ESP32将uint16_t拆分为两个uint8_t字节按端序发送至串口,游戏代码通过read函数读取串口数据。此前通信正常,但发现0x04、0x0A、0x0D、0x15这四个字节无法被正确读取。

我原本以为是读取原始无符号整数值而非字符,对此感到困惑——0x01至0x0F中的其他字节(如换页符)均可正常读取,ACK(0x06)能正常读取但NAK(0x15)不行。

游戏端读取代码

__uint16_t recv(int controller){

  // if there's no response, just return FN_RET_NULL
    char *port = malloc(13);
    char *port_use = port;
    __uint8_t msb;
    __uint8_t lsb;
    __uint16_t output = -1;
    switch(controller)
    {
        case 0:
        case 1: 
        port_use = "/dev/ttyACM0";
        break;
        case 2: 
        port_use = "/dev/ttyACM1";
        break;
        case 3:
        port_use = "/dev/ttyACM2";
        break;
        case 4:
        port_use = "/dev/ttyACM3";
        break;
        default: port_use = "err";
    }
    if(port_use == "err")
    {
        printf("[RECV] Wrong Controller Input\n");
        free(port);
        return 0x4;
    }

    int serial_port = open(port_use, O_RDWR);
    // printf("%d\n", serial_port);
    if(serial_port < 0)
    {
        printf("[RECV] Error opening serial port. \n");
    }

    struct termios tty;
    memset(&tty, 0, sizeof(tty));

    if(tcgetattr(serial_port,&tty) != 0)
    {
        printf("[RECV] Error getting serial port attributes 3\n");
    }
    cfsetospeed(&tty,B1152000);
    cfsetispeed(&tty, B1152000);

    tty.c_cflag != (CLOCAL | CREAD);
    tty.c_cflag &= ~PARENB;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag != CS8;

    if (tcsetattr(serial_port,TCSANOW,&tty) != 0)
    {
        printf("[RECV] Error setting serial port attributes \n");
        free(port);
        return 0x4; 
    }
    char readbuff[256];
    memset(&readbuff, '\0',sizeof(readbuff));
    printf("[RECV] waiting... \n");

    int num_bytes = 0;
    while(num_bytes < 2)
    {
        num_bytes = read(serial_port, &readbuff, sizeof(readbuff));
        printf("numbytes = %d\n", num_bytes);

        if(num_bytes > 0)
        {
            printf("Some of the readbuf: %x %x %x %x %x %x (0-5)\n", readbuff[0], readbuff[1], readbuff[2], readbuff[3], readbuff[4], readbuff[5]);
        // printf("Recieved [%s]\n", readbuff);
        msb = (__uint16_t)readbuff[0]; // set MSB
        printf("msb: %x\n", msb);
        lsb = (__uint16_t)readbuff[1]; // set LSB
        printf("lsb: %x\n", lsb);
        memset(&readbuff, '\0', sizeof(readbuff)); // DELETE BUFFER
    }
}

free(port);
output = (msb << 8) + lsb; // set output
return output;

ESP32端发送代码

void send_signal(int itf, uint16_t message){
    uint8_t mess_as_list[2];
    mess_as_list[0] = (uint8_t)(message >> 8); // MSB of 'message'
    mess_as_list[1] = (uint8_t)(message & 0xFF); // LSB of 'message'
    tinyusb_cdcacm_write_queue(itf, mess_as_list, sizeof(mess_as_list)); // write to queue
    tinyusb_cdcacm_flush_queue(itf, 0); //flush queue
}

疑问

是否可以直接读取串口的原始整数值?还是必须确保发送的信号不包含这些特定字节?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:21:06