Arduino - C# = USB
Hej
Har Arduino sketchern nedan:
// Arduino FS Panel - Digital 1 (Left 1 - Level 1)
// -----------------------------------------------------------------------------------------
// Pin number initilation and its container
int digitalPinsArr[] = { 0, 0, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
String outputsControlStr[] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
bool firstRun = true;
int pinAmount = 54;
int loopIndex = 0;
int state;
void setup()
{
Serial.begin(9600);
// Set pinMode for the board pins ===========================================
pinMode(digitalPinsArr[2], INPUT_PULLUP);
pinMode(digitalPinsArr[3], INPUT_PULLUP);
pinMode(digitalPinsArr[4], INPUT_PULLUP);
pinMode(digitalPinsArr[5], INPUT_PULLUP);
pinMode(digitalPinsArr[6], INPUT_PULLUP);
pinMode(digitalPinsArr[7], INPUT_PULLUP);
pinMode(digitalPinsArr[8], INPUT_PULLUP);
pinMode(digitalPinsArr[9], INPUT_PULLUP);
pinMode(digitalPinsArr[10], OUTPUT);
pinMode(digitalPinsArr[11], OUTPUT);
pinMode(digitalPinsArr[12], INPUT_PULLUP);
pinMode(digitalPinsArr[13], INPUT_PULLUP);
pinMode(digitalPinsArr[14], INPUT_PULLUP);
pinMode(digitalPinsArr[15], INPUT_PULLUP);
pinMode(digitalPinsArr[16], INPUT_PULLUP);
pinMode(digitalPinsArr[17], INPUT_PULLUP);
pinMode(digitalPinsArr[18], INPUT_PULLUP);
pinMode(digitalPinsArr[19], INPUT_PULLUP);
pinMode(digitalPinsArr[20], INPUT_PULLUP);
pinMode(digitalPinsArr[21], INPUT_PULLUP);
pinMode(digitalPinsArr[22], INPUT_PULLUP);
pinMode(digitalPinsArr[23], INPUT_PULLUP);
pinMode(digitalPinsArr[24], INPUT_PULLUP);
pinMode(digitalPinsArr[25], INPUT_PULLUP);
pinMode(digitalPinsArr[26], INPUT_PULLUP);
pinMode(digitalPinsArr[27], INPUT_PULLUP);
pinMode(digitalPinsArr[28], INPUT_PULLUP);
pinMode(digitalPinsArr[29], INPUT_PULLUP);
pinMode(digitalPinsArr[30], INPUT_PULLUP);
pinMode(digitalPinsArr[31], INPUT_PULLUP);
pinMode(digitalPinsArr[32], INPUT_PULLUP);
pinMode(digitalPinsArr[33], INPUT_PULLUP);
pinMode(digitalPinsArr[34], INPUT_PULLUP);
pinMode(digitalPinsArr[35], INPUT_PULLUP);
pinMode(digitalPinsArr[36], INPUT_PULLUP);
pinMode(digitalPinsArr[37], INPUT_PULLUP);
pinMode(digitalPinsArr[38], INPUT_PULLUP);
pinMode(digitalPinsArr[39], INPUT_PULLUP);
pinMode(digitalPinsArr[40], INPUT_PULLUP);
pinMode(digitalPinsArr[41], INPUT_PULLUP);
pinMode(digitalPinsArr[42], INPUT_PULLUP);
pinMode(digitalPinsArr[43], INPUT_PULLUP);
pinMode(digitalPinsArr[44], INPUT_PULLUP);
pinMode(digitalPinsArr[45], INPUT_PULLUP);
pinMode(digitalPinsArr[46], INPUT_PULLUP);
pinMode(digitalPinsArr[47], INPUT_PULLUP);
pinMode(digitalPinsArr[48], INPUT_PULLUP);
pinMode(digitalPinsArr[49], INPUT_PULLUP);
pinMode(digitalPinsArr[50], INPUT_PULLUP);
pinMode(digitalPinsArr[51], INPUT_PULLUP);
pinMode(digitalPinsArr[52], INPUT_PULLUP);
pinMode(digitalPinsArr[53], INPUT_PULLUP);
// ==========================================================================
}
void loop()
{
// Declaration of containers
String controlStr, controlStrType, controlStrPinType, controlStrPin, controlStrBool, readString;
// ======================== Save the (input / input_pullupp ) pinstates in an array of lenght = 54 ===============================
int pinStatesArr[54];
for (int i = 0; i < pinAmount; i = i + 1){
if(i == 0 || i == 1 || i == 10 || i == 11) pinStatesArr[0] = -1;
else pinStatesArr[i] = digitalRead(digitalPinsArr[i]);
}
//switch3Poss(pinStatesArr);
// ======================== Write state of the changing pin ======================================================================
if(pinStatesArr[loopIndex] == 0) Serial.println(String('D')+loopIndex+String("=Open")); // Pin = Opened = INPUT_PULLUP = 0
if(pinStatesArr[loopIndex] == 1) Serial.println(String('D')+loopIndex+String("=Close")); // Pin = Closed = INPUT_PULLUP = 1
while(Serial.available()){
delay(1);
if(Serial.available()>0){
char incommingString = Serial.read();
if(isControl(incommingString)){
break;
}
// Save the string and add the new one
readString += incommingString;
// Save the string in more of a global container reacheable further
controlStr = readString;
}
}
loopIndex++;
if (loopIndex == pinAmount) loopIndex = 0;
}
Ger följande resultat i Arduinos Serial monitor:
[/code]
.....
D40=Close
D41=Close
D42=Close
D43=Close
D44=Close
D45=Close
D46=Close
D47=Close
D48=Close
D49=Close
D50=Close
D51=Close
D52=Close
D53=Close
D2=Close
D3=Close
D4=Close
D5=Close
D6=Close
D7=Open
D8=Close
D9=Close
D12=Close
D13=Close
D14=Close
D15=Close
D16=Close
D17=Close
D18=Close
D19=Close
D20=Close
D21=Close
D22=Close
D23=Close
D24=Close
D25=Close
D26=Close
D27=Close
D28=Close
D29=Close
D30=Close
D31=Close
D32=Close
D33=Close
D34=Close
D35=Close
D36=Close
....
[/code]
Detta fungerar fint:)
Har ett C# program som tar emot strängarna men dessa ser väldigt lustiga ut, se kod nedan med Consolen
................
public static void Read()
{
while (connect)
{
try
{
if (firstRunOpen != true) serialPort.Open();
var message = serialPort.ReadLine();
Console.WriteLine(message);
if (message == "D2=Open\r") boardsPinstates[2] = "Open";
if (message == "D2=Close\r") boardsPinstates[2] = "Close";
if (message == "D7=Open\r") boardsPinstates[7] = "Open";
if (message == "D7=Close\r") boardsPinstates[7] = "Close";
serialPort.Close();
/*Control string for Arduinos component commands. There are different typ according the components. It starts = inp/out
inp:
Switch - 2 / 3 poss (Middle poss =
out:
_a/d_01-53_1/0
*/
if (boardsPinstates[2] == "Open" && boardsPinstates[7] == "Close")
{
serialPort.Open();
//serialPort.WriteLine("out_d_10_1");
serialPort.Close();
}
if(boardsPinstates[2] == "Close" && boardsPinstates[7] == "Close")
{
serialPort.Open();
serialPort.WriteLine("out_d_11_1");
firstRunOpen = false;
serialPort.Close();
}
if(boardsPinstates[2] == "Close" && boardsPinstates[7] == "Open")
{
serialPort.Open();
serialPort.WriteLine("out_d_10_0");
serialPort.WriteLine("out_d_11_0");
serialPort.Close();
}
}
catch (TimeoutException) { }
firstRunOpen = false;
//serialPort.WriteLine("");
}
}
private static void OpenSerialPort()
{
serialPort.PortName = "Com4";
serialPort.BaudRate = 9600;
serialPort.ReadTimeout = 5000;
serialPort.WriteTimeout = 5000;
serialPort.Open();
connect = true;
Console.WriteLine($"Connected to port {serialPort.PortName} at {serialPort.BaudRate} baud.");
}
............
Konsoler ger;
----------
D5
D53=Close
D2=Close
penClose
D8=Close
D9=Close
D12=CloD19=Close
D20=Close
=Closeose
D27=Close
D28=Close
D2
D36=Close
D37=Close
D38=ClosD45=Close
D46=Close
D52=Close
D53=Close
D2=Close
D12=Close
D13=Close
D19=Close
D20=Close
26=Closee
D27=Close
-----
Nu inser jag att looparna kanske inte är synkade mellan kortet och programmet men ett problem i taget
Problemet är raderna dom t.ex. "D12=CloD19=Close, D12=CloD19=Close eller penClose .... Min hypotes är att det läser in strängarna för snabbt?
När jag loggar vad som kommer in så kommer allt tur och ordning, nästan!
Hur fixar jag till det?
Mvh Fredrik
Computer: Windows 10, 64-bit, Intel i9 - 10850K, Asus Rog MAXIMUS XII HERO (WI-FI), 32GB RAM, Asus RTX3070
Game control: Home Cockpit, Keyboard, Saitek Pro Flight X-56 Rhino H.O.T.A.S.