UPLOAD THIS SKETCH TO ARDUINO:
// Demonstrate 2-way communication between
// Mac [OSX 10.6.4] running REALStudio 2010r3 and Arduino
// Demo requires this sketch be uploaded to Arduino
// and program entitled "twoway" to be run on the Mac side
// Written by: Ken Jenkins - August 2010 [No rights reserved]
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
// initialize serial communication: Serial.begin(9600); // initialize the LED pin as an output: pinMode(ledPin, OUTPUT);
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H') {
digitalWrite(ledPin, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L') {
digitalWrite(ledPin, LOW);
}
}
// You can play with this delay, but without it as the
// program stands now you will get more sync errors on
// the Mac side
delay(100);
Serial.print("@:AA:BB:CC:DD:EE:FF:");
}
THIS IS THE REALSTUDIO CODE FOR THE MAC SIDE
I CAN'T FIGURE OUT HOW TO UPLOAD THE "PROJECT" AS A WHOLE SO IT CAN BE LOADED UNDER REALStudio HERE AND I CAN'T FIGURE OUT HOW TO LOAD THE SCREEN LAYOUT EITHER. SORRY.
Class TwoWaySerial
Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
End Class
Class Main Inherits Window
Main.Close:
Sub Close()
SerialCom.close
quit
End Sub
Main.Open:
Sub Open()
//Initialization
//Set globals for record and field separators and
//number of fields
GB_recordseparator="@"
GB_recordlength=20
GB_fieldseparator=":"
GB_fieldcount=6
//Open a serial port
If SerialCom.Open then
//MsgBox "The serial port is open."
Else
MsgBox "The serial port could not be opened."
quit
End if
End Sub
Main Control SerialCom:
Sub DataAvailable()
do
// Attempt to process some data
dim count as Integer = GB.process_packet( me.LookAhead )
// If we have a full packet,then count will be >0
if count > 0 then
// Remove the data from the RB internal buffer
call me.Read( count )
else
// We didn't process an entire packet, so we want to bail out
exit
end if
loop until me.BytesAvailable <= 0
End Sub
End Class
Module GB
GB.process_packet:
Function process_packet(data as string) As integer
//Process Packet
dim packet as string
dim ldata as integer
static sync_error_count as integer
static good_count as integer
dim hexstring as string
dim fieldarray() as string
dim i as integer
ldata=len(data)
//Wait until you have a complete packet
if ldata >=GB_recordlength then
packet=left(data,ldata)
//Check that the record separator is the first byte in the packet and that the //packet is the expected length .... else reject it
if left(packet,1)=GB_recordseparator and ldata=GB_recordlength then
//This is where you do stuff with good packets ****************************************
//Here's a easy way to split the fields into a string array
fieldarray() = split(mid(packet,1),GB_fieldseparator)
//Update display
for i = 1 to GB_fieldcount
Main.field(i).text = fieldarray(i)
next i
//Keep track of good packet count
good_count=good_count+1 Main.GoodPackets.AppendText " [ "+str(ldata)+" ]"+packet+chr(13)
Main.GoodCount.text=str(good_count)
//Just to demonstrate that while the Arduino is talking to me I can talk to it as well //Toggle status of LED on every good packet
//Send "H" or "L" back to Ardunio to change staus on PIN 13 LED
If GB_LED_status=TRUE then
Main.LED.fillcolor=&cFF0000 //Update display RED
Main.SerialCom.write ("H")
GB_LED_status=FALSE
else
Main.LED.fillcolor=&c00FF00 //Update display GREEN
Main.SerialCom.write ("L")
GB_LED_status=TRUE
end if
else
//This is where you reject packets which either do not begin with the record separator //or are not the expected length.
//Keep track of sync errors
sync_error_count=sync_error_count+1
Main.BadPackets.AppendText " [ "+str(ldata)+" ]"+packet+chr(13)
hexstring=EncodeHex(packet,TRUE)
Main.BadPackets.AppendText hexstring+chr(13)
Main.SyncErrorCount.text=str(sync_error_count)
end if
return ldata
else
return 0
end if
End Function
GB_fieldcount As Integer
GB_fieldseparator As string
GB_LED_status As Boolean
GB_recordlength As Integer
GB_recordseparator As string
End Module