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

