如何使Arduino和Java通过单个字节进行通信
我正在通过UART从java向Arduino发送字节[]数组。但在java中,127以上的值在2的补码中表示,Arduino无法正确理解。如何解决这个问题?Java缺少无符号类型是一个难题。 字节的最简单解决方案是简单地使用较大的数据类型,如如何使Arduino和Java通过单个字节进行通信,java,arduino,byte,Java,Arduino,Byte,我正在通过UART从java向Arduino发送字节[]数组。但在java中,127以上的值在2的补码中表示,Arduino无法正确理解。如何解决这个问题?Java缺少无符号类型是一个难题。 字节的最简单解决方案是简单地使用较大的数据类型,如short或int,并适当地强制转换: byte b = (byte) 0x80; System.out.println(b); //prints "-128" int i = (int) b & 0xff; //casting is optiona
short
或int
,并适当地强制转换:
byte b = (byte) 0x80;
System.out.println(b); //prints "-128"
int i = (int) b & 0xff; //casting is optional since 0xff is an int
System.out.println(i); //prints "128"
uint8_t c = Serial.read();
哦,如果这有帮助的话,有一个处理无符号字节的方法
如果问题是发送字节而不是接收字节,那就更简单了。如果需要发送
0x80
,只需发送0x80
。Java将其视为-128并不重要。您仍将通过连线发送0x80
。Java缺少无符号类型是一个问题。
字节的最简单解决方案是简单地使用较大的数据类型,如short
或int
,并适当地强制转换:
byte b = (byte) 0x80;
System.out.println(b); //prints "-128"
int i = (int) b & 0xff; //casting is optional since 0xff is an int
System.out.println(i); //prints "128"
uint8_t c = Serial.read();
哦,如果这有帮助的话,有一个处理无符号字节的方法
如果问题是发送字节而不是接收字节,那就更简单了。如果需要发送
0x80
,只需发送0x80
。Java将其视为-128并不重要。您仍将通过线路发送0x80
。因为任何Java rs232库都不知道“签名”,所以您只需按原样发送字节即可
例如,JSSC库(以及iirc RXTX库)有一个方法SerialPort.writeBytes(byte[])
在Arduino中,对于接收到的数据,您可以选择使用uint8\u t
或int8\u t
适当地解释符号:
byte b = (byte) 0x80;
System.out.println(b); //prints "-128"
int i = (int) b & 0xff; //casting is optional since 0xff is an int
System.out.println(i); //prints "128"
uint8_t c = Serial.read();
由于任何JavaRS232库都对“签名”视而不见,所以只需按原样发送字节 例如,JSSC库(以及iirc RXTX库)有一个方法
SerialPort.writeBytes(byte[])
在Arduino中,对于接收到的数据,您可以选择使用uint8\u t
或int8\u t
适当地解释符号:
byte b = (byte) 0x80;
System.out.println(b); //prints "-128"
int i = (int) b & 0xff; //casting is optional since 0xff is an int
System.out.println(i); //prints "128"
uint8_t c = Serial.read();
@但我必须通过uart发送字节[]数组。我怎样才能做到这一点?你有什么问题?只需创建数组并发送它;现在,当我把它转换成字节,这就是2的补码。对于c8=-56,依此类推。当我向Arduino发送单字节数组时,数据被误解了。好的,您可以只发送数组
新字节[]{(字节)0xc8,(字节)0x80,(字节)0x90}
。Java将这些值视为负值这一事实不会改变任何事情。arduino仍将获得值C88090,因为0xff
为int,因此&
自动提升另一个操作数,并且您不必强制转换result@Matt但是我必须通过uart发送byte[]数组。我怎样才能做到这一点?你有什么问题?只需创建数组并发送它;现在,当我把它转换成字节,这就是2的补码。对于c8=-56,依此类推。当我向Arduino发送单字节数组时,数据被误解了。好的,您可以只发送数组新字节[]{(字节)0xc8,(字节)0x80,(字节)0x90}
。Java将这些值视为负值这一事实不会改变任何事情。arduino仍将获得值C88090,因为0xff
为int,因此&
自动提升另一个操作数,并且您不必强制转换结果,因为Java字节不能高于127!这个问题一点也不清楚,也许一些数据示例和代码将有助于Javabyte
不能超过127!这个问题一点也不清楚,也许一些数据示例和代码会有助于精确,Serial.read()
将返回范围为0的int
。。0xff,或-1表示EOF
/无需阅读,我建议使用while(Serial.available())
,因为在EOF之后新数据可以到达。值-1不是EOF。这是“没有可用的数据”。准确地说,与Java中相同,Serial.read()
将返回一个范围为0的int
。。0xff,或-1表示EOF
/无需阅读,我建议使用while(Serial.available())
,因为在EOF之后新数据可以到达。值-1不是EOF。这是“没有可用的数据”。与Java中相同