0

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

これを修正する方法はありますか?ありがとう!

4

2 に答える 2

1

問題は端末設定ではなく、文字が16ビット値に符号拡張される方法です。コードスニペットには、2バイトを記述します。1バイトだけを書き込みたい場合は、バイト数を次のように変更します1

write (fd, &command[6], 1);
于 2012-07-04T18:42:30.380 に答える
0

これは単純でばかげたエラーでした。unsignedcharではなくcharとして読み取っていたことがわかりました。

于 2012-07-04T20:21:28.617 に答える