我正在使用I2C I / O扩展器读取多达8个输入。
I / O扩展器提供8位输出。...1字节。 由于e / o扩展器具有内部上拉,因此当所有端口未连接到GND时,所有8位均为1。
因此输出为255 ... B11111111
当所有端口都连接到GND ..时,所有8位都变为0。
所以输出为0 ... B00000000
一切都很好,但是我想反转信号,当所有端口都未连接到GND时,输出应为:0 ... B00000000。
当所有端口都连接到GND时,输出应为255 ... B11111111
使用Bitwise 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
}
所以我希望有人知道如何在不输出负数的情况下反转字节。
答案 0 :(得分:0)
由于您的类型byte
是无符号的,通常按位运算不起作用…
您可以在打印之前尝试将输出转换为这种类型吗?
类似Serial.print((byte) ~OutputI2CInvert);
这应该迫使Arduino不要将第一位视为符号位。
答案 1 :(得分:0)
谢谢您的全部工作,我做了一点点调整,就是将所有数据上传到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
}