Android - Arduino 通信 - USB 主机
Android - Arduino Communication - USB Host
我正在构建一个 android - 与 android USB 主机 API 的 arduino 通信设置。一切都运作良好。 Arduino 读取消息并更改一些 LED 并发回接收到的字节。
问题是从arduino读取回声。每个第二个答案都是 0。批量传输调用成功终止,但只收到一个零。接下来阅读 returns 之前阅读中预期的字符。例如:
发送|接收
一个
b 0
b
x 0
我不知道那里发生了什么。也许有人可以看到错误?另一个问题是关于所使用的控制传输(如下),我在不同的 ubs/serial 转换器的各种线程上找到了那些。谁能告诉我在哪里可以获得有关这些代码的详细信息以及在数据表中的哪里可以找到它们?
我的设置:
我正在使用 Arduino Uno 版本。 3 和 android 5.xx
基本 Arduino 代码:LED 对每个发送的字符做出反应。
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
char incomingByte = Serial.read();
Serial.print(incomingByte);
if( incomingByte == 'a' )
digitalWrite( ledPin, HIGH );
else if( incomingByte == 'b' )
digitalWrite( ledPin, LOW );
}
}
Android 代码:我删除了 try/catch 和调试内容以及所有无关的内容。代码在单独的线程中执行。 "synchronized (sSendLock)" 部分锁定进程,直到 UI 线程给出 "notify"。使用的处理程序只是告诉 UI 线程,该值已准备就绪。
一开始的控制权转移是从一篇博文中取出来的,似乎是为UNO工作的。
usb_connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
usb_connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80,
0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0);
usb_connection.controlTransfer(0x40, 0x03, 0x4138, 0, null, 0, 0);
for (;;) {
(...) synchronized (sSendLock) {
SendLock.wait(); // Thread waits, until notified
(...)
byte_buffer = new byte[1];// initialize buffer
byte_buffer[0]=(byte) data; //get data to send
usb_connection.bulkTransfer(endpOUT,byte_buffer,byte_buffer.length, 200); //send
usb_connection.bulkTransfer(endpIN,byte_buffer,byte_buffer.lenght,200);//receive
usb_connection_handler.sendMessage(Message.obtain(usb_connection_handler, 0));//notify UI Thread
}
有什么想法吗?
谢谢:-)
编辑:
我更改了代码,以便只读取一位。它之前读取 5 位以测试是否有更多接收。这并没有改变行为。发送函数如下所示:
public void send_char(char b) {
data =(byte) b;
synchronized (sSendLock) {
sSendLock.notify();
}
我希望显示的代码摘录足够了。如果有任何问题,我很乐意提供更多信息:-)
我真的不知道如何解释这种行为。
编辑 III:只是为了从评论中收集信息:
批量传输函数returns -1,如果传输失败,如果成功,传输的位数。在我 "received" 为零的情况下,函数接收到 "zero" 位并且没有覆盖缓冲区。我从缓冲区得到的零仍然是传输前缓冲区包含的初始零。
我主要关心的问题之一是那些控制转移。我为不同的芯片组找到了几个 "versions",但我不知道这些是从哪里来的。我在任何数据表中都找不到关于这些控制传输的任何要求或流程图。
问候
@greenapps 发现错误。由于它是异步数据传输并且 Arduino 设备的时序未知,因此有必要重复批量传输直到接收到某些内容。我使用了带有一些迭代的 for 循环。一旦批量传输的 return 值与一个不同,我就会跳出循环并继续。
感谢帮助
我正在构建一个 android - 与 android USB 主机 API 的 arduino 通信设置。一切都运作良好。 Arduino 读取消息并更改一些 LED 并发回接收到的字节。 问题是从arduino读取回声。每个第二个答案都是 0。批量传输调用成功终止,但只收到一个零。接下来阅读 returns 之前阅读中预期的字符。例如:
发送|接收
一个
b 0
b
x 0
我不知道那里发生了什么。也许有人可以看到错误?另一个问题是关于所使用的控制传输(如下),我在不同的 ubs/serial 转换器的各种线程上找到了那些。谁能告诉我在哪里可以获得有关这些代码的详细信息以及在数据表中的哪里可以找到它们?
我的设置:
我正在使用 Arduino Uno 版本。 3 和 android 5.xx
基本 Arduino 代码:LED 对每个发送的字符做出反应。
void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { if (Serial.available() > 0) { char incomingByte = Serial.read(); Serial.print(incomingByte); if( incomingByte == 'a' ) digitalWrite( ledPin, HIGH ); else if( incomingByte == 'b' ) digitalWrite( ledPin, LOW ); } }
Android 代码:我删除了 try/catch 和调试内容以及所有无关的内容。代码在单独的线程中执行。 "synchronized (sSendLock)" 部分锁定进程,直到 UI 线程给出 "notify"。使用的处理程序只是告诉 UI 线程,该值已准备就绪。
一开始的控制权转移是从一篇博文中取出来的,似乎是为UNO工作的。
usb_connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
usb_connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80,
0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0);
usb_connection.controlTransfer(0x40, 0x03, 0x4138, 0, null, 0, 0);
for (;;) {
(...) synchronized (sSendLock) {
SendLock.wait(); // Thread waits, until notified
(...)
byte_buffer = new byte[1];// initialize buffer
byte_buffer[0]=(byte) data; //get data to send
usb_connection.bulkTransfer(endpOUT,byte_buffer,byte_buffer.length, 200); //send
usb_connection.bulkTransfer(endpIN,byte_buffer,byte_buffer.lenght,200);//receive
usb_connection_handler.sendMessage(Message.obtain(usb_connection_handler, 0));//notify UI Thread
}
有什么想法吗? 谢谢:-)
编辑: 我更改了代码,以便只读取一位。它之前读取 5 位以测试是否有更多接收。这并没有改变行为。发送函数如下所示:
public void send_char(char b) {
data =(byte) b;
synchronized (sSendLock) {
sSendLock.notify();
}
我希望显示的代码摘录足够了。如果有任何问题,我很乐意提供更多信息:-) 我真的不知道如何解释这种行为。
编辑 III:只是为了从评论中收集信息:
批量传输函数returns -1,如果传输失败,如果成功,传输的位数。在我 "received" 为零的情况下,函数接收到 "zero" 位并且没有覆盖缓冲区。我从缓冲区得到的零仍然是传输前缓冲区包含的初始零。
我主要关心的问题之一是那些控制转移。我为不同的芯片组找到了几个 "versions",但我不知道这些是从哪里来的。我在任何数据表中都找不到关于这些控制传输的任何要求或流程图。
问候
@greenapps 发现错误。由于它是异步数据传输并且 Arduino 设备的时序未知,因此有必要重复批量传输直到接收到某些内容。我使用了带有一些迭代的 for 循环。一旦批量传输的 return 值与一个不同,我就会跳出循环并继续。
感谢帮助