Stap 3: Programming - PC kant
Het programma zal bouwen de nettolading van de opdracht volgens de opdrachtregelopties (Zie gebruik) en de opdracht verzenden met het apparaat dat is aangesloten op de USB-poort.
De poort kan worden opgegeven met de -u optie, anders het zal proberen/dev/ttyUSB0, / dev/ttyUSB0, / dev/ttyACM0, /dev/ttyACM1, zoals de arduinos kunnen worden toegewezen als (ten minste) deze bestanden, afhankelijk van het type van de arduino en de afsluitingen/opnieuw verbinden.
Zoals aangegeven in de inleiding die de Arduino heeft haar autoreset functie uitgeschakeld, anders zal het opnieuw instellen van telkens wanneer een verbinding wordt gemaakt. Dit is de manier waarop die de IDE de chip programmeren kunt, maar het is niet wenselijk in ons geval. Indien u wenst te testen van de code met een arduino autoreset ingeschakeld, moet u een sleep(2)-opdracht na de verbinding (na het openen van het bestand tty) naar laat de arduino opnieuw instellen en de mogelijkheid om de berichten te krijgen.
Zoals verwacht de code stuurt een 'I' karakter op het Arduino, dan stuurt de nettolading en lezen van het bestand om te wachten op de reactie van de Arduino. Deze stap is niet essentieel voor een eenvoudige opdracht verzenden, maar het zal zijn als het doel is om informatie te halen uit de Arduino zelf of een ander apparaat bestuurd door radio. Voor nu de Arduino gewoon "OK" reageert dus gewoon wordt de reactie betreft.
Wat betreft het deel van de Arduino is er een deel van de code waar het bericht wordt geconverteerd naar ASCII-weergave van het binaire bericht.
Message [0] = 'I';
draaien van binaire lading naar ASCII-tekens (HEX voorstelling)
voor (ik = 1, j = 0; ik < 39; ik += 2, j ++) {}
bericht [i] = (nuttige lading [j] & 0xF0) >> 4;
Als (bericht [i] < 10) {}
bericht [i] += '0'; ASCII
} else {}
bericht [i] += 'A' - 10;
}
Message [i + 1] = lading [j] & 0x0F;
Als (message [i + 1] < 10) {}
Message [i + 1] += '0'; ASCII
} else {}
Message [i + 1] += 'A' - 10;
}
printf ("0 x %c %c", bericht [i], message[i+1]);
}
Nogmaals bitsgewijze operatoren worden gebruikt om te selecteren en de eerste of de laatste 4 bits verschuiven en het omzetten in een cijfer of een teken (A tot en met F):
bericht [i] = (nuttige lading [j] & 0xF0) >> 4;
Hier nemen we de byte en toepassen van een masker 11110000, dus we alleen de voorste linker bits krijgen, en we deze bits naar rechts verschuiven
Message [i + 1] = lading [j] & 0x0F;
Zelfde hier maar geselecteerde bits zijn al aan de rechterkant van de byte, dus geen verschuiving nodig is.
Als (bericht [i] < 10) {}
bericht [i] += '0'; ASCII
} else {}
bericht [i] += 'A' - 10;
}
Hier wordt het cijfer < 10 de ASCII-waarde bestaat tussen 48 en 57 (decimaal), en we net hebben de vertegenwoordigde waarde toevoegen aan de waarde van het teken '1' (oftewel 48 maar '1' is bruikbaar zonder de ASCII-tabel door hart ;)). Hetzelfde geldt voor de tekens A tot F, maar A(Hex) is 10(Decimal) dus als we de vertegenwoordigde waarde toegevoegd aan de ASCII-waarde voor de 'A' zouden we 10 waarden op hoog. Zo voegen we de waarde -10 en eind omhoog met het juiste teken.
Nu, zou u kunnen benieuwd waarom wij converteren van Hex naar ASCII en van ASCII naar Hex aan de andere kant. Je zou gelijk aan ;)
Inderdaad, het is nutteloos in dat geval, en de eerste versie van de code werkte direct met binaire waarden. Eigenlijk het werkte door het sturen van alleen de 5 bytes die eigenlijk nuttig zijn en de Arduino maakte de update van de nettolading sjabloon. We sturen nu 40 bytes in plaats van 5. Om welke reden?
Nou, hoewel dit uit dit instructable name is heb ik aangegeven dat ik een tweede micro controller had in mijn kamer voor de tweede eenheid van de airconditioner. Deze chip is een Seeediuno Wifi Bee. Ik vond het moeilijk om het juiste gedrag dat chip met aansluitingen, zodat ik uiteindelijk met behulp van de ingesloten minimalistische webserver, dus ik stuur de volledige IR-commando in de URL in Hex-tekens.
Nu heb je de reden: ik wilde gebruiken dezelfde code waarmee beide units, de gegevens verzenden naar USB of via WiFi, maar dezelfde boodschap, in dezelfde indeling te manipuleren.