Я хочу отправить массив целых чисел из приложения as3, которое я пишу во Flash Pro, на Arduino Uno, который будет использовать их для непрерывного позиционирования и изменения положения 5 сервоприводов. Таким образом, отправка 15 целых чисел позиционирует 5 сервоприводов, затем их переставляет, затем снова перемещает, затем возвращается в первую позицию и так далее. Затем я отправлял новый массив, заменяя старый, когда хотел.
Итак, мой tinkerproxy настроен между ними нормально (спасибо Майку Чемберсу и другим), и я написал обе стороны, чтобы они работали нормально при взаимодействии со своими последовательными мониторами. Но я не могу заставить их разговаривать друг с другом должным образом.
Моя проблема проста ... Я думаю ... Это как заставить as3 отправлять сигнал новой строки или какой-либо другой сигнал конца с массивом или после него, чтобы эскиз Arduino (с использованием serialEvent и parseInt для получения целых чисел, когда они отправляются), получив его, может пропустить parseInt и сделать что-то еще - в этом случае перейти к циклу и управлять этими надоедливыми сервоприводами.
Возможно, приложено слишком много кода, и я надеюсь, что кто-нибудь сможет помочь. Я довольно неопытен, как вы уже догадались ...
АРДУИНО
/*
this sketch developed from arduino Tutorials ReadASCIIString + SerialEvent
serialEvent can receive an array - 'buff' - of values from serial monitor
loop can get those values and print some of them to prove it
but I can't get Flash Pro (as3) to send the array: something to do with end of message character?
*/
#include <Servo.h>
int buff[100];//an array to hold integers from serial(arbitrary larger than ever needed size)
int j; //used to increment serial integer receipt in serialEvent
int patternLength;//=# of integers delivered over serial port, if followed by E or newline
void setup()
{
Serial.begin(9600);
Serial.setTimeout(2147483647);//25 days! so parseInt doesn't default to sending zeros every second
Serial.println("ready to go");//prints ok
}
void loop()
{
for(int i=0; i<patternLength-4; i=i+5)//feed sets of 5 integers into 5 servos then repeats
Serial.println(buff[i]);//prints 1st, 5th, 10th etc integer then repeats
delay(1000);//so I can see it happening slowly enough
}//loops indefinitely until serialEvent interrupts to send new buff array values
void serialEvent()
{
while(Serial.available()>0)
{
buff[j] = Serial.parseInt();
Serial.println(buff[j]);//prints all integers sent if eg ','sent after last one
j++;
//if (Serial.read() == '\n')//works if serial monitor is set to 'newline' on sending
if (Serial.read() == 'E')//works if no 'newline' + sending eg 1,2,3,4,5,6,7,8,9,10E
//BUT how to send the equivalent of one of the above two 'endings' from Flash???
//so that this part of the code executes
{
patternLength = j;
Serial.println("go to loop");
j=0;//reset the index so next array sent replaces this one in 'buff'
}
}
}
FLASH PRO ACTIONSCRIPT as3
/*
Simple Example that connects to an Arduino (via TinkerProxy) and sends
an array of integers for it to use. That doesn't work......
adapted from FlashBlink Created by Mike Chambers:
http://www.mikechambers.com/blog/2010/08/04/getting-started-with-flash-and-arduino/
*/
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;
//my example of an array of integers I want to send to the arduino
var pattern:Array = [10,11,12,13,14,15,16,17,18,19,20];
//socket we will use to connect to TinkerProxy
var _socket:Socket;
//Address where TinkerProxy is located. Will usually be
//localhost / 127.0.0.1
var _proxyAddress:String = "127.0.0.1";
//port TinkerProxy is listening on
var _proxyPort:uint = 5331;
function onAddedToStage():void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
//create a Sprite to add to the stage.
//This will be a simple button
var s:Sprite = new Sprite();
//draw a green square in the Sprite
s.graphics.beginFill(0x00FF00);
s.graphics.drawRect(0,0, 200,100);
s.graphics.endFill();
//Add Sprite to the display list
addChild(s);
//position it
s.x = 50;
s.y = 50;
//listen for when the user clicks the Sprite
s.addEventListener(MouseEvent.CLICK, onClick);
_socket = new Socket();
//Register for socket events
//socket connected
_socket.addEventListener( Event.CONNECT, onConnect );
//socket closed
_socket.addEventListener( Event.CLOSE, onClose );
_socket.endian = Endian.LITTLE_ENDIAN;
//connect
_socket.connect(_proxyAddress, _proxyPort);
}
//called when we connect to the proxy server
function onConnect(event:Event):void
{
trace("Socket Connected");
}
//called when the user clicks the button on stage
function onClick(event:MouseEvent):void
{
trace("onClick");
//make sure we are connected to the socket
if(!_socket.connected)
{
//if not, don't do anything
trace("You must be connected to send a command to the Arduino.");
return;
}
var ENDOF:String = "E";
for(var j:int = 0; j < pattern.length; j++)
{
_socket.writeUTFBytes(pattern[j]); //send pattern array to Arduino
trace(pattern[j]);//trace what I think I've just sent
}
//then send something as a last character - not an integer.
_socket.writeUTFBytes(ENDOF);//send this string value to arduino
trace("should have just sent an E, and sends an: " + ENDOF);
//but how do I send this E conjoined to the last integer of the pattern array
//so that Arduino responds by jumping out of serialEvent back to the loop?
//flush the socket. Not really necessary, but here for forward compatibility.
_socket.flush();
}
//called when the socket is closed
function onClose(event:Event):void
{
trace("Socket Closed");
}
onAddedToStage();