首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android - Arduino通信- USB主机

Android - Arduino通信- USB主机
EN

Stack Overflow用户
提问于 2016-04-12 15:43:03
回答 1查看 371关注 0票数 0

我正在使用android主机API构建一个android通信设置。一切都很顺利。Arduino读取一条消息并更改一些LED并将接收到的字节发回。问题是从arduino中读出回声。每一秒的答案是0。大容量传输调用终止成功,但只接收到零。下一次读取返回上一次读取中预期的字符。例如:

发送接收

代码语言:javascript
运行
复制
a       a
代码语言:javascript
运行
复制
b       0
代码语言:javascript
运行
复制
a       b
代码语言:javascript
运行
复制
x       0

我不能对那里发生的事情指手画脚。也许有人能看到一个错误?另一个问题是关于在不同的ubs/串行转换器的不同线程上使用的控制传输(如下)。有人能告诉我在哪里获得这些代码的详细信息以及在数据表中找到它们的位置吗?

我的设置:

  • 我用的是Arduino Uno Rev.3和android 5.xx
  • 基本的Arduino代码:对每个发送的字符进行引导反应。 { Serial.begin(9600);pinMode(ledPin,输出);} void循环(){ if ( Serial.available() > 0) { char incomingByte = Serial.read();Serial.print( incomingByte );if (incomingByte == 'a‘) digitalWrite( ledPin,HIGH );如果( incomingByte == 'b‘) digitalWrite( ledPin,LOW );}
  • Android代码:我删除了“尝试/捕捉”、“调试”和所有无关的内容。代码在一个单独的线程中执行。“同步(sSendLock)”部分锁定进程,直到UI线程给出“通知”为止。所使用的处理程序只告诉UI线程,该值已准备好。 最初的控制权转移是从博客中拿出来的,似乎是为联合国办事处工作的。
代码语言:javascript
运行
复制
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函数如下所示:

代码语言:javascript
运行
复制
  public void send_char(char b) {
      data =(byte) b;
      synchronized (sSendLock) {
          sSendLock.notify();
      }

我希望所显示的代码摘录足够了。如果有任何问题,我很乐意提供更多的信息:-)我真的不知道如何解释这种行为。

编辑三:只是为了从评论中收集信息:

如果传输失败,则大容量传输函数返回-1,如果成功,则返回传输的位数。在这种情况下,我“接收”了一个零,函数接收了“零”位,并且没有覆盖缓冲区。从缓冲区中得到的零仍然是传输之前包含的缓冲区的初始零。

我最关心的问题之一就是控制权的转移。我为不同的芯片组找到了几个“版本”,但我不知道它们是从哪里来的。我无法在任何数据表中找到有关这些控制传输的任何要求或流程图。

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-13 13:20:10

@greenapps发现了这个错误。由于它是一种异步数据传输,并且不知道Arduino设备的时间,所以有必要重复大容量传输,直到接收到一些东西。我使用了一个for循环和一些迭代。一旦批量传输的返回值与原来的返回值不同,我就跳出循环并继续。

谢谢你的帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36578085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档