, tak to prawda , ale są przejściówki na układach FTDI czy Microchipa i innych , które to udostępniają virtualny port COM poprzez USB. Ponadto
połączenie RS232 przez port COM to nadal podstawa wymiany informacji między wieloma urządzeniami z komputerem.
Obiektem naszego zainteresowania będzie sterowanie diodą z komputera podłączoną do płytki Arduino , czy też innego klona tej platformy.
Nasz pierwszy program popełnimy w konsoli dla ułatwienia. To co zaczynamy ??
Przejdź do FILE-NEW-Project i wybierz nowy projekt CLR CONSOLE APP jak widać na obrazku niżej. Nadaj nazwę projektowi np.
"ArduinoComm" i kliknij OK.

Wybierz Plik ArduinoComm.cpp i otwórz go dwuklikiem :

Uff.... teraz musimy sobie ustalić co właściwie ma robić nasz program

> Poprosi użytkownika o wprowadzenie portu szeregowego który chcemy używać i przechowa jego nazwę w zmiennej PortName
> Następnie Spyta czy chcemy włączyć światło czy nie
-- jeśli tak zostanie wysłane 1 włączenia portu
-- jeśli nie zostanie wysłane 0 wyłączenie portu
-->> Program będzie pracował w pętli czekając na zadanie od użytkownika lub jego zakończenie
-->> Musimy tez ustalić szybkość transmisji użytej do komunikacji z naszą płytką
W tym celu dodamy do naszego programu parę linijek kodu z podstawowymi funkcjami:
- String^ answer;
- String^ portName;
- int baudRate=9600;
- Console::WriteLine("Podaj nazwę portu COM i wcisnij ENTER");
- portName=Console::ReadLine();
I w ten prosty sposób już działa nasz port COM:) ale .... warto nadmienić, że ...
.NET Framework zawiera gotowe klasy zdefiniowane dla portu szeregowego. Nazywa sie ona SerialPort i jest dostępna w przestrzeni nazw
"SYSTEM:: IO:: Ports " Będziemy używać również innych metod w przestrzeni nazw SYSTEM dlatego na początek użyjemy tej:
dopisując do naszego kodu linijki:
- using namespace System;
- using namespace System::IO::Ports;
W naszym przypadku Obiekt Serial PORT będzie się nazywał "ARDUINO".
- SerialPort^ arduino;
- arduino = gcnew SerialPort(portName, baudRate);
podobnie jak w przypadku plików tekstowych pierwszą rzeczą jaką musimy zrobić jest ich otwarcie.
Open jest metodą klasy portu szeregowego, która jest częścią stworzonego obiektu ARDUINO. Dopiszemy teraz więc metodę otwarcia:
- arduino->Open();
PĘTLA:
W naszym Programiku użyjemy pętli "do while" W pętli tej zmiennej string przypiszemy przechowywanie odpowiedzi na 2 pytania :
>Czy chcesz kontynuować?
>Włączyć lub Wyłączyć diodę ?
- do
- {}
- while(String::Compare(answer,"yes")==0);
Ciało pętli:
Wysyłanie danych ze zmiennej String do tablicy obiektu ARDUINO odbędzie się za pomocą metody WriteLine.
Dodamy następne linijki kodu, myślę że ich znaczenie jest oczywiste:
- // on lub off
- Console::WriteLine("Wpisz \"on\" by włączyć lub \"off\" by wyłączyć");
- // uzyskana odpowiedź
- answer=Console::ReadLine();
- //sprawdzenie czy wpisano jedną z opcji
- if(String::Compare(answer,"on")==0)
- arduino->WriteLine("1"); // wysyła 1 do sunduino
- else if(String::Compare(answer,"off")==0)
- arduino->WriteLine("0"); // wysyła 0 do Sunduino
- else
- Console::WriteLine(answer+" nie wybrano żadnej opcji");
- // Pytanie czy kontynuować
- Console::WriteLine("Jeszcze RAZ? yes/no");
- answer=Console::ReadLine();
- // czyszczenie ekranu
- Console::Clear(); // czyszczenie ekranu konsoli
NASZ pełny program w C++ :
powinien wyglądać następująco:
- #include "stdafx.h"
- using namespace System;
- using namespace System::IO::Ports;
- int main(array<System::String ^> ^args)
- {
- String^ answer;
- String^ portName;
- int baudRate=9600;
- Console::WriteLine("Wpisz nazwę portu i wcisnij ENTER");
- portName=Console::ReadLine();
- //
- SerialPort^ arduino;
- arduino = gcnew SerialPort(portName, baudRate);
- // otwarcie portu
- try
- {
- arduino->Open();
- do
- {
- Console::WriteLine("Wpisz \"on\" by właczć lub \"off\" by wyłączyć");
- answer=Console::ReadLine();
- if(String::Compare(answer,"on")==0)
- arduino->WriteLine("1");
- else if(String::Compare(answer,"off")==0)
- arduino->WriteLine("0");
- else
- Console::WriteLine(answer+" nie wybrano żadnej opcji");
- Console::WriteLine("Jeszcze raz? yes/no");
- answer=Console::ReadLine();
- Console::Clear();
- }while(String::Compare(answer,"yes")==0);
- arduino->Close();
- }
- catch (IO::IOException^ e )
- {
- Console::WriteLine(e->GetType()->Name+": Port nie gotowy!");
- }
- catch (ArgumentException^ e)
- {
- Console::WriteLine(e->GetType()->Name+": nie prawidłowa nazwa portu musi sie zaczynac od COM");
- }
- Console::Write("Wciśnij ENTER by skończyć program");
- Console::Read();
- return 0;
- }
I to wszystko możemy projekt zapisać i skompilować , program od strony PC jest gotowy. teraz jednak musimy napisać program dla
naszej płytki żeby sprawdzić czy wszystko działa tak jak chcieliśmy:

Otwieramy zatem Arduino IDE lub VSC czy VS z wtyczkami i piszemy :
- int ledPin = 13;
- int state=0;
- void setup() {
- pinMode(ledPin, OUTPUT);
- Serial.begin(9600);
- }
- void loop() {
- if (Serial.available() > 0)
- {
- state = Serial.read();
- switch(state)
- {
- case '1':
- digitalWrite(ledPin,HIGH);
- break;
- case '0':
- digitalWrite(ledPin,LOW);
- break;
- default:
- break;
- }
- }
- }
z szybkością 9600bps. Teraz możemy skompilować nasz program i wgrać do mikrokontrolera.
I to na tyle , najprostsza metoda sterowania z poziomu komputera diodą led na naszej płytce ładnie działa.
Pobawcie się trochę

oczywiście w Visual Studio C++ Express lub Community , możemy stworzyć coś poważniejszego i ładniejszego ...
dlatego teraz zajmiemy się trochę bardziej zaawansowaną obsługą połączenia RS232 z naszą płytką, gdyż nie tylko będziemy
wysyłać komendę do płytki , ale też i odbierać i prezentować wyniki pomiaru na komputerze w okienkowej aplikacji ....
Zaczynamy:
Po uruchomieniu VC++ wybieramy typ projektu tym razem zamiast jak wcześniej projekcie CLR Console Application wybieramy :
Windows Form Application . Dzięki temu nasz program będzie prawdziwie Winzgrozowy i przyprawiał niektórych o mdłości ...
Nadajemy też naszemu projektowi nazwę co widać na screenie poniżej np: Woltomierz i klikamy ok.

Teraz po dłuższej chwili system wygeneruje całe stado na pozór zbędnych plików.

Wszystko ładnie widać po lewej stronie. Dla nas szczególnie interesujący jest Header Files i zawarty tam plik Form1.h,
który otwarty widać pośrodku ekranu. Jak widać jest to puste okienko windowsowe. Możemy tu dowolnie modyfikować jego rozmiar,
oraz inne parametry jak nazwa co czynimy w okienku Properities po prawej stronie ekranu -- na fotce schowany za toolbox,
jak też dodawać nowe elementy, które są dostępne w widocznym właśnie po prawej Toolbox-ie.
Przystępujemy do budowy/rysowania aplikacji:
W naszym okienku musimy pododawać potrzebne nam klawisze i pola oraz opisy zatem do dzieła:
Jako że będziemy używać portu serial -- wyszukujemy na toolboxie w sekcji Components kontrolki serialPort i przeciągamy na nasze okienko
jak widać kontrolka układa się u dołu ekranu, podobnie postępujemy z kontrolka Timer. Teraz poumieszczamy przyciski checkboxy i labele
wszystkie znajdziemy w toolboxie w sekcji Common Controls - wybieramy nam potrzebne i przeciągamy na nasze okienko gdzie teraz
możemy modyfikować ich parametry jak rozmiar i opisy w properities, a nasza aplikacja może wyglądać np tak:

Właściwie już na tym etapie możemy skompilować nasz program i będzie on działał , ale nie tak jak chcemy bo przecież mamy tylko okienko z przyciskami i nic więcej. Teraz więc musimy pokazać elementom do czego mają służyć.
Zatem do dzieła :
na pierwszy ogień weźmiemy nasz przycisk połącz klikamy go prawym klawiszem myszki i wybieramy View Code gdzie w pustej sekcji:
- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
- }
- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
- {
- if (!port_open) {
- this->serialPort1->PortName=this->comboBox1->Text;
- serialPort1->Open();
- this->button1->Text="Zamknij";
- port_open=true;
- } else { serialPort1->Close();
- this->button1->Text="Połącz";
- port_open=false;}
- }
oraz czy port otwarty czy tez nie. No ładnie , ale nie wiemy jaki port ma być otwarty wiec zajmijmy się naszym drugim obiektem --- czyli naszą kontrolka serialPort podobnie prawym klawiszem myszki - view Code i w jego sekcji dopisujemy:
- private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
- unsigned char data0, data1;
- if (serialPort1->ReadByte()==0xAB) {
- data0=serialPort1->ReadByte();
- data1=serialPort1->ReadByte();
- volty=Math::Round((float(data0*256+data1)/1024*5.00),2);
- data_count++;
- }
- serialPort1->ReadByte();
- }
która odczytane dane z ADC przeliczy na napięcie i w tej postaci będzie wyświetlane w sekcji label1. Oczywiście szybkość portu określamy
w properities dla controlki na identyczną jak w programie dla płytki xxxduino.
Tak , ale mamy kilka portów serial i chcemy mieć możliwość wybierania no to do dzieła.
Pod przyciskiem połącz (button1) umieściliśmy combobox i w procedurce przycisku dodaliśmy zależność i wszystkie porty jakie
mamy pojawią się w naszym combo odpowiada za to ta linijka kodu umieszczona w sekcji button1:
- this->serialPort1->PortName=this->comboBox1->Text;
naszego timera umieszczamy kod:
- his->label1->Text=Convert::ToString(volty)+ " V";
- this->label3->Text=Convert::ToString(data_count*10)+ " reads/s";
- data_count=0;
- array<unsigned char>^start ={0xAC,(0x10+channel)};
- array<unsigned char>^stop ={0xAC,0x00};
- if (!adc_on) {
- serialPort1->Write(start,0,2);
- this->button2->Text="Stop";
- adc_on=true;
- } else {
- serialPort1->Write(stop,0,2);
- this->button2->Text="Start";
- adc_on=false;}
I to w zasadzie wszystko , ciężko cokolwiek opisać w przypadku VisualStudio i tworzenia aplikacji na windows gdyż wszechobecne kreatory skutecznie generują 98% kodu samym nam zostawiając niewiele roboty, czego nie opisałem znajdziecie w kompletnym źródle programu który po
wypakowaniu folderu otwieramy plikiem Voltage_Meter.sln
(Jak się znajdzie dodam)
A tak się prezentuje nasz programik po uruchomieniu :

Tymczasem czas na drugą połowę czyli program dla naszej płytki xxxDuino, który prezentuje się następująco:
- int voltage =0;
- int channel =0;
- int voltage1 =0;
- int chanel1 =1;
- unsigned char incomingByte = 0;
- boolean measure=false;
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- if (measure) {
- voltage=analogRead(channel);
- voltage=analogRead(chanel1);
- Serial.print(0xAB,BYTE);
- Serial.print(voltage>>8,BYTE);
- Serial.print(voltage%256,BYTE);
- Serial.print(voltage1>>8,BYTE);
- Serial.print(voltage1%256,BYTE);
- delay(50);
- }
- if (Serial.available() > 0) {
- delay(10);
- if(Serial.read()==0xAC) {
- incomingByte =Serial.read();
- switch (incomingByte) {
- case 0x10:
- measure=true;
- channel=0;
- chanel1=0;
- break;
- case 0x11:
- measure=true;
- channel=1;
- chanel1=1;
- break;
- case 0x12:
- measure=true;
- channel=2;
- chanel1=2;
- break;
- case 0x00:
- measure=false;
- break;
- }
- }
- }
- };
Tymczasem po wgraniu naszego programu do płytki możemy się cieszyć naszym woltomierzem na PC
Żeby nie było ostrzegałem

Powodzenia