Arduino反转字节
我使用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是合乎逻辑的,因为该公司在其网站上提到: 我的代码实际上不起作用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
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所以这对连载打印没有任何影响?