gpt4 book ai didi

c++ - 使用 termios 和 uint8_t 对串行通信进行符号扩展

转载 作者:行者123 更新时间:2023-11-28 08:01:35 26 4
gpt4 key购买 nike

我正在尝试使用 write() Unix 系统调用写入字节,但我发送的任何以 1 开头的 8 位值都变成了 32 位值。我试着查看是否有任何 termios 标志来解决这个问题,但我似乎找不到任何东西。

struct termios config;

if(!isatty(fd)) { std::cout << "Not a TTY" << std::endl; }
if(tcgetattr(fd, &config) < 0) {std::cout << "Termios structure is broken" << std::endl;}

config.c_iflag = 0;//&= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON);
config.c_oflag = 0; //&= ~(OCRNL | ONLCR | ONLRET | ONOCR | CSTOPB | ONOEOT| OFILL | OPOST);
config.c_cflag &= ~(CSIZE | PARENB | CSTOPB); // 8bits, no parity, 1 stop
config.c_cflag |= CS8 | CREAD | HUPCL;
config.c_cc[VMIN] = 0;
config.c_cc[VTIME] = 1;

// Communication speed (simple version, using the predefined constants)
if(cfsetispeed(&config, B9600) < 0 || cfsetospeed(&config, B9600) < 0) {
std::cout << "Speed is messed up" << std::endl;
}

// Finally, apply the configuration
if(tcsetattr(fd, TCSAFLUSH, &config) < 0) { std::cout << "Applied Configuration is broken" << std::endl;}

// uint8_t c[2] = {'D','A'};
// write(fd,&c,2);
write(fd,&command[6],2);

输入示例:

BIN6: 10111110 -------- HEX6:be -------- DEC6: 190 -------- ASCII6: ?

BIN7: 11101100 -------- HEX7: ec -------- DEC7: 236 -------- ASCII7: ?

输出示例:

BIN6: 000000011111111111111111111111110111110 -------- HEX: FFFFFFBE -------- DEC: -66 -------- ASCII: ¾

BIN7: 000000011111111111111111111111111101100 -------- HEX: FFFFFFEC -------- DEC: -20

知道如何解决这个问题吗?谢谢!

最佳答案

问题不在于终端设置,而在于如何将字符符号扩展为 16 位值。在你的代码片段中,你写了两个字节。如果只想写入一个字节,请将字节数更改为 1:

write (fd, &command[6], 1);

关于c++ - 使用 termios 和 uint8_t 对串行通信进行符号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com