2015-04-16 4 views
1

Я работаю над простым проектом для школы. У меня 4-значный 12-контактный дисплей на моем макете, все подключены правильно, я могу установить значение по умолчанию в моей программе, и оно отображается просто отлично. (или получить случайное число, приращение, это все работает, поэтому мне не нужны какие-либо советы по этому поводу.AS3 Отправка долго в arduino?

Мне однако нужно получить длинное значение от вспышки до Arduino (ну, это 4 цифры в actionscript, это может быть int, но кажется, что arduino не читает это, так как это 8 бит).

Я не могу, однако, не узнать, как передать это моему ардуино, я пробовал разные вещи, и у меня всегда были смешанные результаты, может кто угодно отметить, что я делаю неправильно?

код из AS3 (который относится, насколько я думаю), и Arduino ниже

Arduino :

//used for reading the float 
//something I attempted unsuccessfully 
union u_tag { 
    byte b[4]; 
    float ival; 
} u; 

//segments 
int a = 6; 
int b = 7; 
int c = 8; 
int d = 9; 
int e = 10; 
int f = 11; 
int g = 12; 
int p = 13; 
//digits 
int d4 = 5; 
int d3 = 4; 
int d2 = 3; 
int d1 = 2; 
//other 
int n = 401;//display value, this value will be displayed, can be changed 
int x = 1;//use this if you want decimals e.g. 10 is 1 decimal 
int del = 45; 
char commandLetter; // the delineator/command chooser 
char numStr[4];  // the number characters and null 
String inString; 

void setup() 
{ 
    Serial.begin(9600);   // set up Serial library at 9600 bps 

    pinMode(d1, OUTPUT); 
    pinMode(d2, OUTPUT); 
    pinMode(d3, OUTPUT); 
    pinMode(d4, OUTPUT); 
    pinMode(a, OUTPUT); 
    pinMode(b, OUTPUT); 
    pinMode(c, OUTPUT); 
    pinMode(d, OUTPUT); 
    pinMode(e, OUTPUT); 
    pinMode(f, OUTPUT); 
    pinMode(g, OUTPUT); 
    pinMode(p, OUTPUT); 
} 

void loop() 
{ 
    //digit 1 Nxxx 
    clearLEDs(); 
    pickDigit(1); 
    pickNumber((n/x/1000)%10); 
    delayMicroseconds(del); 

    //digit 2 xNxx 
    clearLEDs(); 
    pickDigit(2); 
    pickNumber((n/x/100)%10); 
    delayMicroseconds(del); 

    //digit 3 xxNx 
    clearLEDs(); 
    pickDigit(3); 
    pickNumber((n/x/10)%10); 
    delayMicroseconds(del); 

    //digit 4 xxxN 
    clearLEDs(); 
    pickDigit(4); 
    pickNumber(n/x%10); 
    delayMicroseconds(del); 

    //read new data here 
    serialEvent(); 
} 

void pickDigit(int x) 
{ 
    digitalWrite(d1, HIGH); 
    digitalWrite(d2, HIGH); 
    digitalWrite(d3, HIGH); 
    digitalWrite(d4, HIGH); 

    switch(x) 
    { 
    case 1: digitalWrite(d1, LOW); break; 
    case 2: digitalWrite(d2, LOW); break; 
    case 3: digitalWrite(d3, LOW); break; 
    default: digitalWrite(d4, LOW); break; 
    } 
} 

void pickNumber(int x) 
{ 
    switch(x) 
    { 
    default: zero(); break; 
    case 1: one(); break; 
    case 2: two(); break; 
    case 3: three(); break; 
    case 4: four(); break; 
    case 5: five(); break; 
    case 6: six(); break; 
    case 7: seven(); break; 
    case 8: eight(); break; 
    case 9: nine(); break; 
    } 
} 

void dispDec(int x) 
{ 
    digitalWrite(p, LOW); 
} 

void clearLEDs() 
{ 
    digitalWrite(a, LOW); 
    digitalWrite(b, LOW); 
    digitalWrite(c, LOW); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW); 
    digitalWrite(f, LOW); 
    digitalWrite(g, LOW); 
    digitalWrite(p, LOW); 
} 

void zero() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, LOW); 
} 

void one() 
{ 
    digitalWrite(a, LOW); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW); 
    digitalWrite(f, LOW); 
    digitalWrite(g, LOW); 
} 

void two() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, LOW); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH); 
    digitalWrite(f, LOW); 
    digitalWrite(g, HIGH); 
} 

void three() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, LOW); 
    digitalWrite(f, LOW); 
    digitalWrite(g, HIGH); 
} 

void four() 
{ 
    digitalWrite(a, LOW); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, HIGH); 
} 

void five() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, LOW); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, LOW); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, HIGH); 
} 

void six() 
{ 
    digitalWrite(a, LOW); 
    digitalWrite(b, LOW); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, HIGH); 
} 

void seven() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW); 
    digitalWrite(f, LOW); 
    digitalWrite(g, LOW); 
} 

void eight() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, HIGH); 
} 

void nine() 
{ 
    digitalWrite(a, HIGH); 
    digitalWrite(b, HIGH); 
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW); 
    digitalWrite(f, HIGH); 
    digitalWrite(g, HIGH); 
} 

void serialEvent() { 
    while(Serial.available() > 0) { 
      int c = Serial.parseInt(); 
      if (c > 0) { 
      n = c; 
      } 
     } 
} 

Actionscript (в рамке)

import flash.net.Socket; 
import flash.events.Event; 

    //only allow numbers, period and minus sign 
    //numberInput.restrict = ".0-9\\-"; 

stage.addEventListener(MouseEvent.CLICK, onConnect); 

var socket:Socket = new Socket() 
    socket.addEventListener(Event.CONNECT, onConnect); 
    socket.addEventListener(Event.CLOSE, onClose); 
    socket.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); 
    socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); 

    //disable until we connect 
    this.enabled = false; 

    //this is important! If you dont set this to 
    //little endian, then Arduino wont understand 
    //the bytes 
    socket.endian = Endian.LITTLE_ENDIAN; 

    socket.connect("127.0.0.1", 5331); 

function onConnect(evt:Event):void 
{ 
    //get the number that the user input 
    var out:Number = Number("1200"); 

    //write it as a float to the server. 
    //this is important. 
    //socket.writeByte(1200); 
    socket.writeByte(109); 
    socket.flush(); 
    //if number is too big, then it will overflow on 
    //the Arduino, and probably come back as 0.00000 
} 

function onClose(evt:Event):void { 

} 

function onError(evt:Event):void { 


} 

function onSocketData(evt:ProgressEvent):void { 
var msg:String = ""; // create a buffer 
    while (socket.bytesAvailable) { // while there is byte to read 
     var byte:int = socket.readByte(); 

      msg += String.fromCharCode(byte); // else, we add the byte to our buffer 

    }   
    trace("data:" + msg); 
} 

Я использую serproxy, чтобы сделать эти 2 общаться.

Теперь я загрузил его снова (у меня есть эта проблема на некоторое время), и теперь я вижу, что значение по умолчанию (n) в arduino сохраняет сброс после отправки данных со вспышки. Данные всегда равны 1 прямо сейчас.

Хотелось бы узнать, почему и что я делаю неправильно.

+0

Вы можете писать долго, используя, например, [ 'BigInteger'] (https://code.google.com/p/as3crypto/source/browse/trunk/as3crypto/src/com/hurlant/crypto/rsa/BigInteger.as?r=3) из as3crypto или ['LongInt'] (https://code.google.com/p/lodgamebox/source/browse/trunk/com/lordofduct/util/LongInt.as) от lodgamebox – fsbmain

+0

Хм, хм, интересная тема! Я искал в трех старых проектах, и все, что я вижу, это следующее: '_socket.writeUTFBytes (data); _socket.flush(); ', где data ** String **. Честно говоря, я не помню, почему, но это всегда строковое представление, всегда UTF. Или вы не хотите бросать? Еще одна вещь, которую я могу поделиться, - это то, как мы привыкли читать данные - с разделителем, поскольку иногда может поступать только часть пакета (но это еще одна тема). –

+0

Я вижу, я знаю, как отправить строку и т. Д., Но есть ли шанс, что у вас есть хороший пример того, как 2 читал его на ардуине? –

ответ

2

Соответствует ли последовательная скорость в серпрокси и эскизе Arduino?

parseInt() не работает с двоичными данными, он ожидает, что цифры, как ASCII символов: «1», а не 1.

Try для передачи данных по одной из строк методов класса сокета, например:

socket.writeMultiByte("125" , "us-ascii") ; 
socket.flush(); 

, а также пытаться вводить данные вручную в последовательный монитор следующего эскиза, чтобы увидеть, как parseInt() работы:

int n = 401;//display value, this value will be displayed, can be changed 
boolean new_val = true ; 

void setup() { 

    Serial.begin(9600);   // set up Serial library at 9600 bps 
    // This check is only needed on the Leonardo: 
    while (!Serial) { 
     ; // Wait for serial port to connect. Needed for Leonardo only 
    } 
    delay(100) ; 
    Serial.println("Started") ; 
} 

void loop() { 
    serialEvent(); 

    if (new_val) { 
     Serial.print("n: "); Serial.println(n , DEC) ;  
     new_val = false ; 
    } 

    delay(200) ; 
} 

void serialEvent() { 
    while(Serial.available() > 0) { 
     int c = Serial.parseInt(); 
     if (c != 0) { 
      n = c; 
      new_val = true ; 
     } 
    } 
} 
+0

Я попробую, когда я буду дома! имеет смысл, я думаю. –

+0

Ну что, если он отправит 0 в виде цифры? : P –

+0

Хороший вопрос. Согласно исходному коду Stream :: parseInt: 'return 0; // ноль возвращается, если timeout'. Я не знаю, как отличить тайм-аут от нуля как ценности. Это районы - не трогайте !!! :). –

Смежные вопросы