极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21008|回复: 4

arduino和flash的as3连接

[复制链接]
发表于 2012-5-18 09:13:00 | 显示全部楼层 |阅读模式
本帖最后由 桐桐 于 2012-5-18 09:18 编辑

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

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


  11. pinMode(LED_PIN, OUTPUT);   


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


  13.       Serial.print("READY");             //发送“ready”到电脑端
  14.     Serial.print(EOL_DELIMITER);
  15. }
  16. void loop()
  17. {
  18. if(shouldBlinkLED)           //如果闪灯,就闪灯一下
  19. {
  20.           blinkLED(1);               
  21. }


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


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


  28. Serial.print("LED BLINK STATE: "); //同时发送字符串"led blink state:"
  29. if(shouldBlinkLED)                 //假如正在闪,发“on”
  30. {
  31. Serial.print("ON");
  32. }
  33.         else
  34.         {
  35.           Serial.print("OFF");                //否则发"off"
  36.         }
  37. Serial.print(EOL_DELIMITER);
  38.    }
  39. }
  40. }
  41. //下面是闪灯程序,这就不解释了
  42. void blinkLED(int count)
  43. { for(int i = 0; i < count; i++)
  44. {
  45.     digitalWrite(LED_PIN, HIGH);
  46.     delay(500);
  47.      digitalWrite(LED_PIN, LOW);
  48.      delay(500);
  49. }
  50. }
复制代码
————————————————————————————————————————————————
下面是Flash端代码,建一个FlashBlink.as文件
  1. package
  2. {
  3. import flash.events.Event;
  4. import flash.display.Sprite;
  5. import flash.net.Socket;
  6. import flash.events.IOErrorEvent;
  7. import flash.events.ProgressEvent;
  8. import flash.events.SecurityErrorEvent;
  9. import flash.utils.Endian;
  10. import flash.events.MouseEvent;


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


  14. private var _socket:Socket;
  15. private var _proxyAddress:String = "127.0.0.1";
  16. private var _proxyPort:uint = 5333;
  17. public function FlashBlink()
  18. {
  19. addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  20. }
  21.                //下面代码是在画一个方块按钮,并且定义点击按钮时运行程序onclick
  22. private function onAddedToStage(event:Event):void
  23. {
  24. removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  25. var s:Sprite = new Sprite();
  26. s.graphics.beginFill(0x00FF00);
  27. s.graphics.drawRect(0,0, 200,100);
  28. s.graphics.endFill();
  29. addChild(s);
  30. s.x = 50;
  31. s.y = 50;
  32. s.addEventListener(MouseEvent.CLICK, onClick);//点击时运行onclick程序           //下面的程序是与arduino建立连接,如果连接上了怎么样,如果断了怎么样等等
  33.                        _socket = new Socket();
  34.        _socket.addEventListener( Event.CONNECT, onConnect );
  35. _socket.addEventListener( Event.CLOSE, onClose );
  36. _socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
  37. _socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
  38. _socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
  39. _socket.endian = Endian.LITTLE_ENDIAN;
  40. _socket.connect(_proxyAddress, _proxyPort);
  41. }
  42. //连接上了执行
  43. private function onConnect(event:Event):void
  44. {
  45. trace("Socket Connected");//连接上就发送一个消息
  46. }
  47. private var buffer:String = "";//定义一个字符串缓存字符
  48.               //下面程序师接受来自arduino的数据,一个字母一个字母接收的
  49. private function onSocketData(event:ProgressEvent):void
  50. {
  51. var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
  52. buffer += data;
  53. var msg:String;
  54. var index:int;
  55.                        //下面是把接受到的字符拼起来
  56. while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
  57. {
  58. msg = buffer.substring(0, index);
  59. buffer = buffer.substring(index + 1);
  60. trace("Message Received from Arduino : " + msg);
  61. }
  62. }
  63.             //下面就是onclick程序,就是点击按钮时要做的
  64. private function onClick(event:MouseEvent):void
  65. {
  66. trace("onClick");
  67.               if(!_socket.connected)         //假如没有连接上,发送你要连什么的
  68. {
  69. trace("You must be connected to send a command to the Arduino.");
  70. return;
  71. }
  72. _socket.writeUTFBytes(TOGGLE_LED_STATE);//如果没有不连接上,就发联系字符给arduino
  73. _socket.flush();//发送
  74. }
  75.                //下面定义关掉arduino时,显示Socket Closed
  76. private function onClose(event:Event):void
  77. {
  78. trace("Socket Closed");
  79. }
  80.                 //下面是出错时显示的消息的
  81. private function onIOError(event:IOErrorEvent):void
  82. {
  83. trace("IOErrorEvent : " + event.text);
  84. }
  85. //下面也是出错时的
  86. private function onSecurityError(event:SecurityErrorEvent):void
  87. {
  88. trace("SecurityErrorEvent : " + event.text);
  89. }
  90. }

  91. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-5-18 09:16:57 | 显示全部楼层
上次的程序是点击按钮时来触发arduino做一些动作以及接受数据的,这次测试一下让arduino连续的发送数据,让flash来接受,并通过在flash的文本框里实时显示。
——————————————————————————————
arduino端的程序
  1. 上次的程序是点击按钮时来触发arduino做一些动作以及接受数据的,这次测试一下让arduino连续的发送数据,让flash来接受,并通过在flash的文本框里实时显示。
  2. ——————————————————————————————
  3. arduino端的程序


  4. #define LED_PIN 13
  5. #define TOGGLE_LED_STATE 't'
  6. #define msgstop 's'
  7. #define EOL_DELIMITER "$"
  8. int incoming = 0;
  9. int i=0;
  10. int in=0;


  11. void setup()
  12. {
  13.     Serial.begin(9600);
  14.     Serial.print("READY");
  15.     Serial.print(EOL_DELIMITER);
  16. }
  17. void loop()
  18. {
  19. if(Serial.available() > 0)       //如果收到数据
  20. {
  21. incoming = Serial.read();
  22.                 if(incoming== TOGGLE_LED_STATE)   //如果收到的是开始代码
  23.                 in=1;                            //变量in=1;
  24.                 if(incoming==msgstop)            //如果收到的是结束代码
  25.                 in=0;                           //in=0;
  26.         }
  27. if(in==1)
  28. {  Serial.print(i);            //发送一个变化的值i
  29.         Serial.print(EOL_DELIMITER);  //发送结束字符
  30.                    i++;                             //值i递增1
  31.            }
  32.     else
  33.      {                  Serial.print("off ");         //如果受收到结束代码,发送off
  34.         Serial.print(EOL_DELIMITER);
  35.      }
  36.    delay(100);                            //没100毫秒发一个                                
  37. }
复制代码
以下是flash 端,flash端分两部分,一部分是getshu.as类里面的程序,如下:
  1. package
  2. {
  3. import flash.events.Event;
  4. import flash.display.Sprite;
  5. import flash.display.MovieClip;;
  6. import flash.net.Socket;
  7. import flash.events.IOErrorEvent;
  8. import flash.events.ProgressEvent;
  9. import flash.events.SecurityErrorEvent;
  10. import flash.utils.Endian;
  11. import flash.events.MouseEvent;
  12.    
  13. public class getshu extends MovieClip
  14. {
  15.             
  16.          public static var ardmsg:String;


  17. private static const TOGGLE_LED_STATE:String = "t";
  18.         private static const msgstop:String = "s";
  19. private static const EOL_DELIMITER:String = "$";


  20. private var _socket:Socket;


  21. private var _proxyAddress:String = "127.0.0.1";


  22. private var _proxyPort:uint = 5333;


  23. public function getshu()
  24. {
  25. addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  26. }


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


  30. var s:Sprite = new Sprite();


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


  34. addChild(s);


  35. //position it
  36. s.x = 50;
  37. s.y = 50;


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


  41. _socket.addEventListener( Event.CONNECT, onConnect );


  42. _socket.addEventListener( Event.CLOSE, onClose );


  43. _socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );


  44. _socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );


  45. _socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );


  46. _socket.endian = Endian.LITTLE_ENDIAN;


  47. _socket.connect(_proxyAddress, _proxyPort);
  48. }


  49. private function onConnect(event:Event):void
  50. {
  51. trace("Socket Connected");
  52. }


  53. private var buffer:String = "";


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


  57. buffer += data;


  58. var msg:String;
  59. var index:int;


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


  63. buffer = buffer.substring(index + 1);


  64. trace("Message Received from Arduino : " + msg);
  65. }
  66. ardmsg=msg;


  67. }
  68.           private var i:Number;
  69. private function onClick(event:MouseEvent):void
  70. {
  71. trace("onClick");
  72.             

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


  78. //下面是点击按钮时发送开始字符,再点击发送结束字符
  79. if(i==0)
  80. {
  81. _socket.writeUTFBytes(TOGGLE_LED_STATE);
  82. i=1;
  83. }
  84. else
  85. {
  86. _socket.writeUTFBytes(msgstop);
  87. i=0;
  88. }
  89. _socket.flush();
  90. }
  91. private function onClose(event:Event):void
  92. {
  93. trace("Socket Closed");
  94. }
  95. private function onIOError(event:IOErrorEvent):void
  96. {
  97. trace("IOErrorEvent : " + event.text);
  98. }


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


  2. function onEnterFrame(event:Event):void{
  3. armsg.text="";
  4. armsg.text=getshu.ardmsg;
  5. }
复制代码
结果,点击按钮,文本框里开始显示动态变化的数字,来自于arduino
回复 支持 反对

使用道具 举报

发表于 2012-5-19 20:40:27 | 显示全部楼层
serproxy or others ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-21 10:45:13 | 显示全部楼层

电脑端用serproxy
回复 支持 反对

使用道具 举报

发表于 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了,
[SWF] FlashBlink.swf - 解压缩后为 2,751 个字节
Socket Connected

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


arduino代码

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

我用arduino自的工具可以看到有输出
是怎么回事啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 07:36 , Processed in 0.057780 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表