Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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和Java通过单个字节进行通信_Java_Arduino_Byte - Fatal编程技术网

如何使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

我正在通过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 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!这个问题一点也不清楚,也许一些数据示例和代码将有助于Java
byte
不能超过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中相同