我正在使用android USB Host API构建android - arduino通信设置。一切都很顺利。 Arduino读取消息并更改某些LED并发回所接收的字节。 问题是读取arduino的回声。每秒答案读数为0.批量转移呼叫终止成功但仅收到零。下一次读取将返回上一次读取中预期的字符。例如:
发送|接收
a a
b 0
a b
x 0
我无法理解那里发生的事情。也许有人可以看到错误?另一个问题是关于所使用的控制传输(下面)我在不同线程上找到了不同的ubs /串行转换器。谁能告诉我在哪里获取有关这些代码的详细信息以及在数据表中找到它们的位置?
我的设置:
我正在使用Arduino Uno rev。 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位,以便测试更多接收。这并未改变行为。 send函数如下所示:
public void send_char(char b) {
data =(byte) b;
synchronized (sSendLock) {
sSendLock.notify();
}
我希望显示的代码摘录足够了。如果有任何问题我会很乐意提供更多信息:-) 我真的不知道如何解释这种行为。
编辑III:只是从评论中收集信息:
如果传输失败,则批量传输函数返回-1,如果成功,则返回传输的位数。在这种情况下,我收到"零,函数收到"零"位并没有覆盖缓冲区。我从缓冲区得到的零仍然是转移前缓冲区所包含的初始零。
我主要担心的是那些控制转移。我找到了几个"版本"对于不同的芯片组,但我不知道它们来自哪里。我无法在任何数据表中找到有关这些控制传输的任何要求或流程图。
问候
答案 0 :(得分:0)
@greenapps发现错误。由于它是异步数据传输并且Arduino设备的时序未知,因此有必要重复批量传输直到收到某些内容。我在一些迭代中使用了for循环。一旦批量转移的返回值与1不同,我就会退出循环并继续。
感谢您的帮助