Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino反转字节_Arduino_Bit Manipulation_Byte - Fatal编程技术网

Arduino反转字节

Arduino反转字节,arduino,bit-manipulation,byte,Arduino,Bit Manipulation,Byte,我使用I2C I/o扩展器读取多达8个输入 i/o扩展器提供8位输出。。。。1字节。 由于e/o扩展器具有内部上拉功能,当所有端口未连接到GND时,所有8位均为1 所以输出是255。。。B11111111 当所有端口都连接到GND时。。所有8位变为0 所以输出是0。。。B00000000 都很好,但我想反转信号,当所有端口都未连接到GND时,输出应为:0。。。b0000000 当所有端口都连接到GND时,输出应该是255。。。B11111111 按位NOT的用法并不是我真正想要的 从255到-1

我使用I2C I/o扩展器读取多达8个输入

i/o扩展器提供8位输出。。。。1字节。 由于e/o扩展器具有内部上拉功能,当所有端口未连接到GND时,所有8位均为1

所以输出是255。。。B11111111

当所有端口都连接到GND时。。所有8位变为0

所以输出是0。。。B00000000

都很好,但我想反转信号,当所有端口都未连接到GND时,输出应为:0。。。b0000000

当所有端口都连接到GND时,输出应该是255。。。B11111111

按位NOT的用法并不是我真正想要的

从255到-1

Wich是合乎逻辑的,因为该公司在其网站上提到:

我的代码实际上不起作用

byte OutputI2C;
byte OutputI2CInvert;
byte InputModbus;
void setup() {
    Serial.begin(9600);
}

void loop() {
    Wire.requestFrom(B0111000, 1); //connect to i/o expander
    OutputI2C = Wire.read(); // Read data
    OutputI2CInvert = OutputI2C; // make copie
    delay(250);
    Serial.print(~OutputI2CInvert); // invert
}

因此,我希望有人知道如何在没有负输出的情况下反转字节。

由于您的类型
byte
是无符号的,通常按位不应该工作… 在打印之前,您可以尝试将输出转换为这种类型吗

类似于
Serial.print((字节)~OutputI2CInvert)


<>这应该迫使ARDUINO不要把第一个比特当作一个符号位。

< P>谢谢,让它全部工作了,我把数据上传到Modbus。
#include <Mudbus.h>
#include <Wire.h>
#include <Ethernet.h>
#include <SPI.h>

Mudbus Mb;
byte OutputI2C;
byte InputModbus;

void setup() {
    Wire.begin(); // start I2C bus
    uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 }; // set MAC address 
    Ethernet.begin(mac); // start ethernet connection 
}

void loop() {
    Wire.requestFrom(B0111000, 1); //connect to i/o expander
    OutputI2C = Wire.read(); // Read data
    InputModbus = ((byte)~OutputI2C); // invert the data
    Mb.Run(); // start modbus connection
    Mb.R[0] = InputModbus; // insert inverted data from i/o expander
    delay(250); // small delay 
}
#包括
#包括
#包括
#包括
Mudbus Mb;
字节输出2c;
字节输入;
无效设置(){
Wire.begin();//启动I2C总线
uint8_t mac[]={0x90,0xA2,0xDA,0x00,0x51,0x06};//设置mac地址
Ethernet.begin(mac);//启动以太网连接
}
void循环(){
Wire.requestFrom(B0111000,1);//连接到i/o扩展器
OutputI2C=Wire.read();//读取数据
InputModbus=((字节)~OutputI2C);//反转数据
Mb.Run();//启动modbus连接
Mb.R[0]=InputModbus;//从i/o扩展器插入反向数据
延迟(250);//小延迟
}

我不太明白为什么这会带来不同。~byteValue的返回值不是字节吗?否则为什么需要强制转换呢?我认为
~字节值
的返回值是一个字节,但
串行打印将其第一位解释为符号位。因此,
~byteValue
的值是正确的,只是打印错误。但是如果
~byteValue
的返回值是一个字节,那么
Serial.print
怎么知道有对字节的转换呢。。。它只看到该转换的结果。
InputModbus=((字节)~OutputI2C)工作,但
inputmubs=(~OutputI2C)
也可以工作,可能是
Serial.print
对字节做了些什么@stefandekraker所以这对连载打印没有任何影响?