Permalänk

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

Visa signatur

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. 

Permalänk
Medlem

Lite svårt att hänga med i programmet när inte allt är med men varför gör du "serialPort.Open()"/"serialPort.Close()" hela tiden på C# sidan? Det är inte det som gör att det blir fel och data försvinner?

Permalänk
Skrivet av jensa86:

Lite svårt att hänga med i programmet när inte allt är med men varför gör du "serialPort.Open()"/"serialPort.Close()" hela tiden på C# sidan? Det är inte det som gör att det blir fel och data försvinner?

Nu när du säger det kan det mycket väl ha med det att göra. När Jag gör "serialPort.Open()"/"serialPort.Close()" om vartannat vet ju inte C# vart i loopen Arduino är eller dess ström av strängar

,Körde med det för att trode det skulle fixa ett annat problem, något jag nu har glömt vad det var

Efter ett snabbt test så löste det sig, tog bort: "serialPort.Open()"/"serialPort.Close()"

Visa signatur

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. 

Permalänk

Nu med det problemet löst som inte var så värst svårt

Vill också kunna detektera en förändring omedelbart när jag switchar på kortet dvs. den ska kunna läsa av en pins läge high eller low direkt oh skicka iväg en sträng till c# programmet. Det utan att behöva loopa igenom alla. Går det?

Något liknande som State Detection...

Visa signatur

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. 

Permalänk
Medlem

Den du länkade till verkar dock göra precis det du gör dvs läsa alla manuellt i en loop. Det du är ute efter är nog "interrupt" och ska vad jag har för mig finnas i alla fall lite stöd för på Arduino beroende på hårdvaran man kör. Se här: https://www.arduino.cc/reference/en/language/functions/extern... tex.

Permalänk
Skrivet av jensa86:

Den du länkade till verkar dock göra precis det du gör dvs läsa alla manuellt i en loop. Det du är ute efter är nog "interrupt" och ska vad jag har för mig finnas i alla fall lite stöd för på Arduino beroende på hårdvaran man kör. Se här: https://www.arduino.cc/reference/en/language/functions/extern... tex.

Stämmer fint men tittar man för mega 2560 är det långt ifrån alla som kan köra det. Jag har kanske 30 switchar på några kort. Finns det elektronikkort som har denna funktion på samtliga av sin pinar med samma abtal digitala portar som Mega, Arduino eller annat fabrikat?

Raspberry PI verkar ha stör för switchar men kan dem läsa av alla med interrupt?

Visa signatur

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. 

Permalänk
Medlem

Det kanske är svårt att hitta liknande "hobbykort" likt arduino och raspberry pi som stödjer det från interrupt. Raspberry Pi gör det dock nästan garanterat men på nivån man brukar skriva sina program för den så är det ju inte så stor skillnad då det är många steg mellan ett hårdvaru gpio interrupt på den och när userspace kod märker av det. Frågan är dock om det spelar någon roll för dig?

Vad exakt är det du vill göra och vad för prestanda/responstid kräver du från edge change till att det går ut på serieporten till PCn? Oavsett om du pollar eller det drivs av interrupt så är det nog annat som är det som begränsar i detta fallet.

I ditt fall med arduino så borde det inte ta någon tid alls att läsa några gpios i en loop heller. Försökte hitta om man kunde ha serieporten på interrupt istället och bara ligga och polla alla gpios konstant istället men det enda jag hittade var: https://www.arduino.cc/en/Tutorial/SerialEvent men den verkar inte vara något interrupt heller utan bara något som körs i loop tillsammans med just "loop()".