专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

基于Arduino和Flash的DisLab课件制作教程—3

作者:未知   来源:不详   点击数:  更新时间:2014年07月31日   【字体:

                 第三节  Arduino和Flash的连接——Arduino接受来自Flash的数据

    上一节我们讲到让Flash接受来自Arduino的数据,不过有时候我们还需要在Flash端来控制一下Arduino,例如在Flash端单击一个按钮来告诉Arduino开始发送或者停止发送数据。当然也可以在Flash端单击一个按钮来控制Arduino端的一个电磁铁,让它开始断电从而让小铁球开始运动。当然所有这些都依赖于让Arduino接受来自Flash端的数据,下面我们就来完成一个简单的控制实验,在Flash端放一个按钮,单击按钮时改变Arduino端的一个Led等的暗亮,为了简单起见,Arduino端的Led等就用D13端口也就是用板载的Led等。
**********************************以下是Arduino端的程序******************************
//此段程序由“桐桐老爸”编写,如要引用请说明出处
#define LED_PIN 13     
#define lianxi '@'   //定义一个来自Flash端的联系字符,随意定,与Flash端一样就可以
#define dataover "$"      //定义一个发送字符结束标记,也随意定
char incoming ;            //定义一个变量,用于接收数据时用
int i=0;                   //定义一个变量i,用于记录灯的状态
void setup()
{
pinMode(LED_PIN, OUTPUT);           //定义LED_PIN端口为输出端口
for(int i = 0; i < 3; i++)          //接通电源后闪3下
{    digitalWrite(LED_PIN, HIGH);
    delay(500);
     digitalWrite(LED_PIN, LOW);
     delay(500);}
Serial.begin(9600);                    //串口开始,波特率9600
Serial.print("Arduino to flash ready!");  //连接上电脑时发送一个字符串
Serial.print(dataover);                   //发送结束字符
}
void loop()
{  if(Serial.available() > 0)      //如果arduino接受到电脑端来的字符
{incoming = Serial.read();         //变量incoming就等于受到的字符
if(incoming == lianxi)   //假如收到的字符与定义的字符相同
 {if(i==0)               //如果灯是灭的
   {digitalWrite(LED_PIN, HIGH);   //就点亮
   i=1;   }            //灯的状态量变为1
   else                //否则即灯是亮的          
   {digitalWrite(LED_PIN, LOW);  //就灭灯
   i=0;                 //灯的状态量变为0
   }   
}  }  }
**********************************************************************************
  下面我们再来编写Flash端的程序,只在动画中放一个按钮,单击按钮来发送数据。
  同样用Flash cs来新建一个Actionscript 3.0类文件(flashtoarduino),程序内容如下,注意.as文件名也要取名为flashtoarduino.as。
*******************************以下为Actionscript 3.0类文件*********************
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;
import flash.text.*; 
import flash.text.TextFieldAutoSize;
public class flashtoarduino extends Sprite
private static const lianxi:String = "@";//定义一个与arduino联系字符
private static const dataover:String = "$";//定义一个结束字符,注意与arduino上一样
private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;
var xsarduinotime:TextField = new TextField();//新建一个名为xsarduinotime的文本框 
//gettime主程序
public function flashtoarduino()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //侦听类是否被添加到舞台,每次添加时运行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, 50,25);
s.graphics.endFill();
addChild(s);
s.x = 200;
s.y = 200;
 //下面的程序是与arduino建立连接,如果连接上了怎么样,如果断了怎么样等等
 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 = "";//定义一个字符串缓存字符
 //下面程序师接受来自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(dataover)) > -1)
{
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
trace("Message Received from Arduino : " + msg);
  xsarduinotime.width=400;   //文本框的宽度200
  xsarduinotime.x=100;       //文本框的位置
  xsarduinotime.y=10;
  xsarduinotime.text=msg;     //显示time from arduino
  var format:TextFormat = new TextFormat();    //新建文字格式format
        format.size=24;                        //文字大小24
    xsarduinotime.setTextFormat(format);       //将文字格式赋予xsarduinotime文本框    
addChild(xsarduinotime);
}
}
      //下面就是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(lianxi);//如果连接上,就发联系字符给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);
}
}
}
************************************************************************************
好了,下面在用Flash cs新建一个actionscript3.0文件,然后保存在和上面的flashtoarduino类文件flashtoarduino.as同一个文件夹内,在属性——类中填入flashtoarduino。这样就大功告成了。
先连上Arduino,打开serproxy.exe,然后点击Ctrl+Enter,可以看到桌面中间有一个绿色方块,单击它,就可以控制arduino上的灯了,试试看!
 
关闭窗口

相关文章