Arduino反相字节

时间:2019-04-03 07:49:32

标签: 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 ... B00000000。

当所有端口都连接到GND时,输出应为255 ... B11111111

使用Bitwise NOT不是我真正想要的。

从255到-1

之所以很合逻辑,是因为在他们的网站上提到了它:

Link

我拥有的代码无法真正起作用...

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
}

所以我希望有人知道如何在不输出负数的情况下反转字节。

2 个答案:

答案 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 
}