Hey guys! So, I have not programmed arduinos in a while, and now that I'm getting back into it I hit a roadblock. I am trying to send data from my C# program to my arduino, and then the arduino will execute something depending on the data sent. My C# program seems to work, but I get weir errors with the arduino. Here's my code:
#include <Servo.h>
byte myVersion = 1;
byte testPin = 13; //A reference to the led pin
byte jawPin = 9;
byte neckPin = 10;
//PLC pins
byte plcPin1 = 40;
byte plcPin2 = 41;
byte plcPin3 = 42;
byte plcPin4 = 43;
byte data[64]; //holds data to be written to the serial port
byte tempBuffer[64]; //A temporary buffer to hold data being read from the serial
boolean digitals[50]; //Holds the data for all digital pins
byte analogs[20]; //Holds all the analog pin states
byte PLC[5]; //holds the PLC pin values
int lum = 0; //Value of pin 13's fade
byte jawID=0;
byte neckID=1;
Servo servos[10];
boolean inc = true;
//writes the buffer dat[] to the serial
void writeBuffer(byte dat[], int bufferSize)
{
int i;
for(i = 0; i < bufferSize; i++)
{
Serial.write(data[i]);
}
}
//sets pin pinID to dat
void setPin(boolean analog, byte pinID, byte dat)
{
//handle analog pins
if (analog == true)
{
analogWrite(pinID,dat);
analogs[pinID] = dat;
}
//handle digital pins
else
{
if (dat>=128)
{
digitalWrite(pinID,HIGH);
digitals[pinID] = true;
}
else
{
digitalWrite(pinID,LOW);
digitals[pinID] = false;
}
}
}
//assigns a servo to a pin
void assignServo(byte servoID, byte pinID)
{
servos[servoID].attach(pinID);
}
//returns the state of analog pin pinID
byte getAnalogPin(byte pinID)
{
return analogs[pinID];
}
//returns 255 if digital pin pinID is HIGH
byte getDigitalPin(byte pinID)
{
if (digitals[pinID] == true)
{
return 255;
}
else
{
return 0;
}
}
//sets a servo to the setting
void setServo(Servo servo, int pos)
{
servo.write(pos);
}
//gets a servo's rotation
byte getServo(Servo servo)
{
return servo.read();
}
void setup()
{
pinMode(testPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int dataLength = Serial.available();
char buffer[dataLength];
while(dataLength>0)
{
Serial.readBytes(buffer,Serial.available());
switch (buffer[0])
{
//writes a ping back
case 0:
{
Serial.write(255);
}
break;
//sets an analog pin
case 1:
{
analogWrite(buffer[1],buffer[2]);
}
break;
//sets a digital pin
case 2:
{
pinMode(buffer[1],OUTPUT);
if (buffer[2]>=128)
{
digitalWrite(buffer[1],HIGH);
}
else
{
digitalWrite(buffer[1], LOW);
}
}
break;
//request for an analog pin's value
case 3:
{
Serial.write(3);
Serial.write(getAnalogPin(buffer[1]));
}
break;
//request for an digital pin's value
case 4:
{
Serial.write(4);
Serial.write(getDigitalPin(buffer[1]));
}
break;
//sets a servo
case 5:
{
setServo(servos[buffer[1]],buffer[2]);
}
break;
case 6:
{
assignServo(buffer[1],buffer[2]);
}
default:
byte buff[2];
buff[0]=255;
buff[1]=0;
Serial.write(buff,2);
break;
}
}
}
Here's my C# class for communicating:
static SerialPort _serialPort;
String[] messages = new String[100];
int messagecount = 0;
static byte[] serialData;
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);
byte[] pwmPins = new byte[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46 };
public byte[] analogPins = new byte[46];
public bool[] digitalPins = new bool[54];
public byte[] servoStates = new byte[8];
//command 0
public void getPing()
{
byte[] buffer = new byte[] { 0 };
Write(buffer);
byte[] retunValues = ReadSerial();
}
//command 1
public void setPinAnalog(byte pinID, byte newState)
{
if (pwmPins.Contains(pinID))
{
byte[] buffer = new byte[] { 1, pinID, newState };
Write(buffer);
analogPins[pinID - 1] = newState;
}
}
//command 2
public void setPinDigtal(byte pinID, bool newState)
{
byte[] buffer;
if (newState)
{
digitalPins[pinID] = true;
buffer = new byte[] { 2, pinID, 255};
}
else
{
digitalPins[pinID] = false;
buffer = new byte[] { 2, pinID, 0};
}
Write(buffer);
}
//command 3
public byte getPinAnalog(byte pinID)
{
byte[] buffer = new byte[] {3,pinID};
Write(buffer);
byte[] returnArray = ReadSerial();
analogPins[pinID-1] = returnArray[1];
return returnArray[1];
}
//command 4
public byte getPinDigital(byte pinID)
{
byte[] buffer = new byte[] { 4, pinID };
Write(buffer);
byte[] returnArray = ReadSerial();
if (returnArray[1] == 255)
digitalPins[pinID] = true;
else
digitalPins[pinID] = false;
return returnArray[1];
}
//command 5
public void setServo(byte servoID, byte dir)
{
byte[] buffer = new byte[] { 5, servoID, dir };
Write(buffer);
}
//Serial Commands
public bool Init()
{
foreach (string mess in SerialPort.GetPortNames())
{
Debug.WriteLine(mess);
}
if (SerialPort.GetPortNames().Length > 0)
{
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
// Allow the user to set the appropriate properties.
_serialPort.PortName = SerialPort.GetPortNames()[0];
Debug.WriteLine(_serialPort.PortName.ToString());
_serialPort.BaudRate = 9600;
_serialPort.DataBits = 8;
// Set the read/write timeouts
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
try
{
_serialPort.Open();
}
catch (UnauthorizedAccessException)
{
Debug.WriteLine("Failed to open port!");
}
readThread.Start();
Console.Write("Name: ");
//name = Console.ReadLine();
Console.WriteLine("Type QUIT to exit");
return true;
}
return false;
}
public void Close()
{
readThread.Join();
_serialPort.Close();
}
public byte[] ReadSerial()
{
Read();
if (serialData.Length > 0)
handleErrors(serialData);
return serialData;
}
public static void Read()
{
try
{
serialData = new byte[_serialPort.BytesToRead];
_serialPort.Read(serialData, 0, _serialPort.BytesToRead);
}
catch (TimeoutException)
{
Console.WriteLine("Serial read timed out.");
}
}
public void Write(byte[] packet)
{
try
{
if (_serialPort != null)
_serialPort.Write(packet, 0, packet.Length);
}
catch (TimeoutException) { Console.WriteLine("Serial write timed out."); }
}
Any big mistakes that I missed?
Thanks.