Arduino中国 | Flamingo EDA

Sep/07

30

Arduino与Flash间的互动

在Arduino与Flash之间实现交互最重要的一点是如何为两者建立起有效的通信途径。出于安全性上的考虑,Flash本身不能直接操作硬件,但它能够通过XMLSocket,并按照一定的约定同与外界实现通信:

  • 通过全双工的TCP/IP流套按字(Socket)发送XML消息
  • 只能连接到端口号大于等于1024的TCP端口
  • 每个XML消息都是一个以零(0)结束的XML文档
  • 发送和接收XML消息的数量没有限制

虽然有如此多的限制,但它毕竟提供了一条与外界通信的途径,这也是我们能在Flash和Arduino之间实现交互的基石。具体的做法是运行一个串口代理(Serial Proxy)程序,这个程序一方面直接对串口硬件进行操作,另一方面又和Flash通过Socket进行通信。在Arduino网站上我们可以找到这一串口代理的Windows版本Mac版本

在运行串口代理之前我们需要对它进行相应的配置,也就是编辑serproxy.cfg文件:


newlines_to_nils=true
comm_ports=1
comm_baud=19200
comm_databits=8
comm_stopbits=1
comm_parity=none
timeout=300
net_port1=5331

按照上面的配置,我使用的是Windows下的COM1,波特率为19200bps,并且是在TCP端口5331上接受来自Flash的XMLSocket连接。

有了串口代理的帮助,对于Arduino来讲就是通过串口接受来自Flash的命令,然后执行相应的操作,或者通过串口向Flash发送命令。下面的Arduino工程一方面通过数字I/O端口13号管脚读取按键的状态,并在状态改变时通过串口向Flash发送按下(switchOn)或者是松开(switchOff)的状态信息;另一方面则接受Flash通过串口代理发送过来的命令,并相应点亮连接在数字I/O端口2、3、4或者5号引脚上的发光二极管。原理图如下所示:

arduino_flash_schematic.png

相应的Arduino工程代码为:


int activeLED ;
int switchState = 0;
int lastSwitchState = 0;
int switchPin = 13;

void setup()
{
  Serial.begin(19200);
  pinMode(switchPin, INPUT);
  for (int i = 2; i <= 9; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop ()
{
  switchState = digitalRead(switchPin);
  if (switchState != lastSwitchState) {
    if (switchState == 1){
      sendStringToFlash("switchOn");
    } else if (switchState == 0){
      sendStringToFlash("switchOff");
    }
  }
  lastSwitchState = switchState;

  if(Serial.available() > 0) {
    activeLED = Serial.read();
  }    

  if(activeLED >= 50 && activeLED <= 57) {
    int outputPort = activeLED - 48;

    Serial.print("LED port ");
    Serial.println(outputPort);

    if(outputPort >= 2 && outputPort <= 9) {
      for (int i = 2; i <= 10; i++) {
        digitalWrite(i,LOW);
      }
      digitalWrite(outputPort, HIGH);
    }
    activeLED = 0;
  } else if (activeLED) {
    Serial.print("Invalid LED port ");
    Serial.println(activeLED,BYTE);
  }

  delay(50);
}

void sendStringToFlash (char *s)
{
  while (*s) {
    printByte(*s ++);
  }
  printByte(0);
}

函数sendStringToFlash()被Arduino用来向Flash发送数据,其最后一个字节必须是0,这是由XMLSocket协议所决定的。

再来看一下对应的Flash代码,你可以从这里下载相应的Flash工程。该工程中包含的Arduino.as提供了对XMLSocket的封装,而FlashLED.fla正是通过调用其相应功能,来实现同Arduino的通信。


import Arduino;
var port:Number = 5331;
var a:Arduino = new Arduino(port);

上述的代码创建了相应的Arduino对象,并将其连接端口设置成了5331,这是与串口代理配置文件serproxy.cfg相一致的。

现在我们可以试着运行整个工程了。首先将Arduino工程下载到Arduino模块中并运行起来,然后启动串口代理serproxy.exe,最后再运行Flash动画。如果一切正常,在Flash中选中某个绿色圆形之后,Arduino会将相应的发光二极管点亮,此外按钮按下或者松开的状态也会在Flash动画中立即得到体现。

arduino_flash_player.png

No tags

4 comments

  • wang667 · 2007/09/30 at 1:50 AM

    好及时啊!强烈支持! 真是辛苦了

  • 鲸男与互动新媒体Whale’s Interactive » Blog Archive » Arduino与Flash通讯工具比较:Tinkerproxy VS Serial Server · 2008/01/15 at 2:08 PM

    [...] Arduino不能与Flash直接通讯,也许是语言不通吧。(专业的解释请点这里) 幸好还有可以沟通两者的程序能够帮助我们,我把那些程序叫做翻译器。我所知道的翻译器有4种: [...]

  • 香橙批 · 2008/11/02 at 3:43 PM

    刚刚调试时候,发现了一个问题:Arduino 0012版的软件不支持printByte()函数,请改用 Serial.print(data,BYTE)试试看;

  • 香橙批 · 2008/11/02 at 4:42 PM

    不知道为什么,我的机器用Arduino官方提供的Serial Proxy不能建立映射的端口。
    用Serial Server就容易就连上了(前提是你装了JRE)。而且开了DEBUG模式还能看到端口通讯的内容。

    查看自己机器的端口可以在命令模式下运行:
    NETSTAT -AN

Leave a Reply

<<

>>