由于要做雙無線傳感器,之前已經搞定了雙路藍牙接收問題,但是一直都存在問題,主要是由于mega上的代碼不夠好導致數據經常丟失,想了很多辦法,終于搞定了。
首先主要是mega上的代碼的改進:
****************************************************************************
String comdata = "";
String shuju="#";
String shuju2="%";
int i;
char zhilin;
char sj1;
char sj2;
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
}
void loop()
{
//下面語句是來發送指令給無線傳感器端的,主要是接收電腦端的指令然后轉發給傳感器端
if (Serial.available() > 0)
zhilin=char(Serial.read());
if(zhilin=='b')
{
Serial1.print("b");
Serial2.print("b");
zhilin='c';
}
if(zhilin=='o')
{
Serial1.print("o");
Serial2.print("o");
zhilin='c';
}
//下面是串口1端上的藍牙接收到的數據處理
while (Serial1.available() > 0)
{
sj1= char(Serial1.read());
if(sj1!='\n')
shuju+=sj1;
if(sj1=='$')
{
Serial.println(shuju);
shuju="#";
}
}
//下面是串口2端上的藍牙接收到的數據處理
while (Serial2.available() > 0)
{
sj2= char(Serial2.read());
if(sj2!='\n')
shuju2+=sj2;
if(sj2=='$')
{
Serial.println(shuju2);
shuju2="%";
}
}
}
***********************************************************************
數據頭“#”或“%”來區別傳感器1和2的數據。
下面是Flash端的類文件:
***********************************************************************
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 shuanglanya extends MovieClip
{
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 static var msg:String;
public static var msg1:String;
public static var msgarray1:Array = new Array(); //新建一個名為msgarray的全局數組
public static var ari1:Number=0;
public static var msg2:String;
public static var msgarray2:Array = new Array(); //新建一個名為msgarray的全局數組
public static var ari2:Number=0;
public static var msg3:String;
var ri1:Number=0;
var ri2:Number=0;
var xsarduinotime1:TextField = new TextField();//新建一個名為xsarduinotime的文本框
var xsarduinotime2:TextField = new TextField();//新建一個名為xsarduinotime的文本框
var i:Number=0;
var index:int;
var index2:int;
//gettime主程序
public function shuanglanya()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); //偵聽類是否被添加到舞臺,每次添加時運行onAddedToStage
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); //移除偵聽
//下面的程序是與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 = "";//定義一個字符串緩存字符
private var buffer1:String = "";//定義一個字符串緩存字符
private var buffer2:String = "";//定義一個字符串緩存字符
private var buffer3:String = "";//定義一個字符串緩存字符
//下面程序師接受來自arduino的數據,一個字母一個字母接收的
private function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
buffer+=data;
while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
{
i=0;
msg = buffer.substring(i, i+1);
while(msg!="#"&&msg!="%")
{
i++;
msg = buffer.substring(i, i+1);
}
if(msg=="#")
{
msg1=buffer.substring(i+1,index);
trace(msg1);
xsarduinotime1.text=msg1;
}
if(msg=="%")
{
msg2=buffer.substring(i+1,index);
trace(msg2);
xsarduinotime2.text=msg2;
}
buffer=buffer.substring(index+1);
xsarduinotime1.width=400; //文本框的寬度200
xsarduinotime1.height=200;
xsarduinotime1.x=100; //文本框的位置
xsarduinotime1.y=10;
//顯示time from arduino
xsarduinotime2.width=400; //文本框的寬度200
xsarduinotime2.height=200;
xsarduinotime2.x=300; //文本框的位置
xsarduinotime2.y=10;
var format:TextFormat = new TextFormat(); //新建文字格式format
format.size=24; //文字大小24
xsarduinotime1.setTextFormat(format); //將文字格式賦予xsarduinotime文本框
addChild(xsarduinotime1);
xsarduinotime2.setTextFormat(format); //將文字格式賦予xsarduinotime文本框
addChild(xsarduinotime2);
}
}
//下面就是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);
}
}
}
**************************************************************
動畫界面上的兩個文本框實時顯示來自兩路藍牙的數據。