桐桐 发表于 2012-5-18 09:13:00

arduino和flash的as3连接

本帖最后由 桐桐 于 2012-5-18 09:18 编辑

以前arduino和flash的链接flash端都是as2编的,但是现在大家都用as3了,所以前段时间学习了一下arduino和flash的as3连接。
下面程序实现的功能是点击flash上的按钮,arduino上就会开始闪灯,并接受arduino上发来的数据。再点击flash上的按钮,闪灯结束,并接受arduino上发来的数据。

——————————————————————————————————————————————
首先放上Arduino端代码:#define LED_PIN 13
#define TOGGLE_LED_STATE 't'   //定义一个来自Flash端的联系字符,随意定,与Flash端一样就可以
#define EOL_DELIMITER "$"      //定义一个发送字符结束标记,也随意定
int incoming = 0;            //定义一个变量,用于接收数据时用
boolean shouldBlinkLED = false;      //是否闪灯值,初始为不闪
void setup()
{
Serial.begin(9600);
      Serial.print("INITIALIZING");//连接上电脑时发送一个字符串
      Serial.print(EOL_DELIMITER);


pinMode(LED_PIN, OUTPUT);   


blinkLED(5);                     //arduino刚连上电脑时闪灯5下


      Serial.print("READY");             //发送“ready”到电脑端
    Serial.print(EOL_DELIMITER);
}
void loop()
{
if(shouldBlinkLED)         //如果闪灯,就闪灯一下
{
          blinkLED(1);               
}


if(Serial.available() > 0)          //如果arduino接受到电脑端来的字符
{
incoming = Serial.read();         //变量incoming就等于受到的字符


if(incoming == TOGGLE_LED_STATE)   //假如收到的字符与定义的字符相同
{
    shouldBlinkLED = !shouldBlinkLED;//转变闪灯值,如果闪灯就变不闪,不然相反


Serial.print("LED BLINK STATE: "); //同时发送字符串"led blink state:"
if(shouldBlinkLED)               //假如正在闪,发“on”
{
Serial.print("ON");
}
      else
      {
          Serial.print("OFF");                //否则发"off"
      }
Serial.print(EOL_DELIMITER);
   }
}
}
//下面是闪灯程序,这就不解释了
void blinkLED(int count)
{ for(int i = 0; i < count; i++)
{
    digitalWrite(LED_PIN, HIGH);
    delay(500);
   digitalWrite(LED_PIN, LOW);
   delay(500);
}
}
————————————————————————————————————————————————
下面是Flash端代码,建一个FlashBlink.as文件package
{
import flash.events.Event;
import flash.display.Sprite;
import flash.net.Socket;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.utils.Endian;
import flash.events.MouseEvent;


public class FlashBlink extends Sprite
{ private static const TOGGLE_LED_STATE:String = "t";//定义一个与arduino联系字符
private static const EOL_DELIMITER:String = "$";//定义一个结束字符,注意与arduino上一样


private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;
public function FlashBlink()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
               //下面代码是在画一个方块按钮,并且定义点击按钮时运行程序onclick
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
var s:Sprite = new Sprite();
s.graphics.beginFill(0x00FF00);
s.graphics.drawRect(0,0, 200,100);
s.graphics.endFill();
addChild(s);
s.x = 50;
s.y = 50;
s.addEventListener(MouseEvent.CLICK, onClick);//点击时运行onclick程序         //下面的程序是与arduino建立连接,如果连接上了怎么样,如果断了怎么样等等
                     _socket = new Socket();
       _socket.addEventListener( Event.CONNECT, onConnect );
_socket.addEventListener( Event.CLOSE, onClose );
_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
_socket.endian = Endian.LITTLE_ENDIAN;
_socket.connect(_proxyAddress, _proxyPort);
}
//连接上了执行
private function onConnect(event:Event):void
{
trace("Socket Connected");//连接上就发送一个消息
}
private var buffer:String = "";//定义一个字符串缓存字符
            //下面程序师接受来自arduino的数据,一个字母一个字母接收的
private function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
buffer += data;
var msg:String;
var index:int;
                     //下面是把接受到的字符拼起来
while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
{
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
trace("Message Received from Arduino : " + msg);
}
}
            //下面就是onclick程序,就是点击按钮时要做的
private function onClick(event:MouseEvent):void
{
trace("onClick");
            if(!_socket.connected)         //假如没有连接上,发送你要连什么的
{
trace("You must be connected to send a command to the Arduino.");
return;
}
_socket.writeUTFBytes(TOGGLE_LED_STATE);//如果没有不连接上,就发联系字符给arduino
_socket.flush();//发送
}
               //下面定义关掉arduino时,显示Socket Closed
private function onClose(event:Event):void
{
trace("Socket Closed");
}
                //下面是出错时显示的消息的
private function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent : " + event.text);
}
//下面也是出错时的
private function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent : " + event.text);
}
}

}

桐桐 发表于 2012-5-18 09:16:57

上次的程序是点击按钮时来触发arduino做一些动作以及接受数据的,这次测试一下让arduino连续的发送数据,让flash来接受,并通过在flash的文本框里实时显示。
——————————————————————————————
arduino端的程序上次的程序是点击按钮时来触发arduino做一些动作以及接受数据的,这次测试一下让arduino连续的发送数据,让flash来接受,并通过在flash的文本框里实时显示。
——————————————————————————————
arduino端的程序


#define LED_PIN 13
#define TOGGLE_LED_STATE 't'
#define msgstop 's'
#define EOL_DELIMITER "$"
int incoming = 0;
int i=0;
int in=0;


void setup()
{
    Serial.begin(9600);
    Serial.print("READY");
    Serial.print(EOL_DELIMITER);
}
void loop()
{
if(Serial.available() > 0)       //如果收到数据
{
incoming = Serial.read();
                if(incoming== TOGGLE_LED_STATE)   //如果收到的是开始代码
                in=1;                            //变量in=1;
                if(incoming==msgstop)            //如果收到的是结束代码
                in=0;                           //in=0;
      }
if(in==1)
{Serial.print(i);            //发送一个变化的值i
      Serial.print(EOL_DELIMITER);//发送结束字符
                   i++;                           //值i递增1
         }
    else
   {                  Serial.print("off ");         //如果受收到结束代码,发送off
      Serial.print(EOL_DELIMITER);
   }
   delay(100);                            //没100毫秒发一个                              
}
以下是flash 端,flash端分两部分,一部分是getshu.as类里面的程序,如下:package
{
import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;;
import flash.net.Socket;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.utils.Endian;
import flash.events.MouseEvent;
   
public class getshu extends MovieClip
{
            
         public static var ardmsg:String;


private static const TOGGLE_LED_STATE:String = "t";
      private static const msgstop:String = "s";
private static const EOL_DELIMITER:String = "$";


private var _socket:Socket;


private var _proxyAddress:String = "127.0.0.1";


private var _proxyPort:uint = 5333;


public function getshu()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}


private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);


var s:Sprite = new Sprite();


s.graphics.beginFill(0x00FF00);
s.graphics.drawRect(0,0, 200,100);
s.graphics.endFill();


addChild(s);


//position it
s.x = 50;
s.y = 50;


s.addEventListener(MouseEvent.CLICK, onClick);
            
_socket = new Socket();


_socket.addEventListener( Event.CONNECT, onConnect );


_socket.addEventListener( Event.CLOSE, onClose );


_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );


_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );


_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );


_socket.endian = Endian.LITTLE_ENDIAN;


_socket.connect(_proxyAddress, _proxyPort);
}


private function onConnect(event:Event):void
{
trace("Socket Connected");
}


private var buffer:String = "";


private function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );


buffer += data;


var msg:String;
var index:int;


while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
{
msg = buffer.substring(0, index);


buffer = buffer.substring(index + 1);


trace("Message Received from Arduino : " + msg);
}
ardmsg=msg;


}
          private var i:Number;
private function onClick(event:MouseEvent):void
{
trace("onClick");
            

if(!_socket.connected)
{
trace("You must be connected to send a command to the Arduino.");
return;
}


//下面是点击按钮时发送开始字符,再点击发送结束字符
if(i==0)
{
_socket.writeUTFBytes(TOGGLE_LED_STATE);
i=1;
}
else
{
_socket.writeUTFBytes(msgstop);
i=0;
}
_socket.flush();
}
private function onClose(event:Event):void
{
trace("Socket Closed");
}
private function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent : " + event.text);
}


private function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent : " + event.text);
}
}
}
下面是flash里的代码,建立一个动态文本框,命名为armsg,下面是帧代码addEventListener(Event.ENTER_FRAME,onEnterFrame);


function onEnterFrame(event:Event):void{
armsg.text="";
armsg.text=getshu.ardmsg;
}
结果,点击按钮,文本框里开始显示动态变化的数字,来自于arduino

幻生幻灭 发表于 2012-5-19 20:40:27

serproxy or others ?

桐桐 发表于 2012-12-21 10:45:13


电脑端用serproxy

qykings 发表于 2013-12-3 00:05:59

本帖最后由 qykings 于 2013-12-5 14:01 编辑

IOErrorEvent : Error #2031: Socket Error. URL: 127.0.0.1
flash 连接不上arduino

明了,,我没有加serproxy做代理


flash是连上serproxy了,
FlashBlink.swf - 解压缩后为 2,751 个字节
Socket Connected

我就没有收到arduino返回的任何数据


arduino代码

   
   int temp=Serial.read();
       Serial.println( temp );
   
      Serial.print("fromarduino");
      Serial.flush();

我用arduino自的工具可以看到有输出
是怎么回事啊
页: [1]
查看完整版本: arduino和flash的as3连接