VIDI Project X #56:
VIDI X serijska komunikacija s Windows računalom

Serijsku komunikaciju s Windows računalom trebat ćemo za projekt modifikacije PC kućišta u kojem ćemo iskoristiti VIDI X za pokazivanje trenutnog zauzeća procesora te količine slobodne RAM memorije PC računala

Proguglate li malo, zasigurno ćete naići na slične projekte koji za razmjenu podataka na relaciji PC–mikrokontroler koriste UART serijsku komunikaciju. Mnogi od njih navode vas na preuzimanje nekakve .exe datoteke s interneta i tvrde kako će stvar raditi postupite li prema uputama. Upravo biste taj dio preuzimanja raznih .exe datoteka s interneta trebali izbjegavati jer ne možete znati što se u .exe datotekama krije. Tako se osim opisanih funkcionalnosti u njima može skrivati i nekakav trojanac, keyloger ili druge maliciozne napasti.

 

 

U ovoj ćete radionici naučiti kako uz pomoć Microsoft PowerShella saznati zauzeće procesora i RAM-a te informacije proslijediti na COM port, a onda i kako VIDI X mikroračunalom pročitati te informacije.

 

Kod

Kompletan kod radionice pronađite na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/CPU_Status

 

Kod Arduino skice za VIDI X mikroračunalo preuzmite s linka: https://github.com/VidiLAB-com/Vidi-X/tree/master/CPU_Status

Glavna petlja koda izgleda ovako:

void loop()
{
  if (Serial.available())           // provjeri dolazi li promet sa seriskog (USB) porta PC-a
  {                                 // ukoliko ima podataka 
    TFT.print(char(Serial.read())); // pročitaj serijski promet i ispiši ga na ekran 
  } else {                          // ukoliko nema podataka 
    TFT.setCursor(0, 0);            // postavi kursor na počenu poziciju ekrana
  }
}

 

Zadatak glavne petlje je provjeriti dolazi li promet sa serijskog (USB) porta PC-a te ako dolazi ispisati ga, a ako ne dolazi postaviti kursor na početnu poziciju ekrana kako bi se ispisao novo dolazeći promet. Srž if uvjeta:

TFT.print(char(Serial.read()));

pročitati će informaciju serijskog porta naredbom Serial.read(). Informacija dolazi u integer obliku te predstavlja ASCII kod poslanog znaka. Zatim će taj broj uz pomoć funkcije char() pretvoriti u ASCII znak. Naposljetku funkcijom TFT.print(); ispisujemo znak na TFT objekt koji je u ovom slučaju naš ekran.
Nakon što je znak ispisan na ekran, kursor čeka narednu informaciju te ako ona dolazi, naredni se znak ispisuje odmah pored prethodnog. Kada nema više nadolazećih znakova u nizu prelazimo na else dio if uvjeta koji će postaviti kursor za ispisivanje na početak ekrana.

Kako smo u setup funkciji naredbom:

TFT.setTextColor(ILI9341_BLUE, ILI9341_BLACK);

zadali plavu boju teksta i crnu boju pozadine teksta, pri ispisivanju novoga teksta preko starog izbrisat će se prethodno napisani tekst.

Kada ste uploadali preuzetu skicu na vaš VIDI X, potrebno je poslati informacije na COM port VIDI X-a. To ćemo učiniti korištenjem PowerShella.

Kako biste to mogli učiniti bezbolnije, u Arduino IDE sučelju zapamtite broj COM porta na koji je spojen VIDI X.

 

U našem slučaju VIDI X mikroračunalo spojeno je na COM46 port

 

Microsoft PowerShell

PowerShell je poboljšani CLI za automatizaciju zadataka koji objedinjuje osnovni naredbeni redak (poznat kao CMD) i skriptni jezik, a može i pristupiti naredbama za upravljanje konfiguracijom Windows računala. Iako PowerShell postoji i na Windows i na Linux te MacOS sustavima, primarno je namijenjen Windows računalima te ga nikako ne biste trebali upotrebljavati na Linux ili MacOS sustavima jer jednostavno nije dobar na njima. Kod koji prilažemo radit će samo na Windows računalima.

 

Zauzeće procesora zgodno je imati na oku jer razne web stranice mogu rudariti kriptovalute vašim procesorom. Uz ovu radionicu lakše ćete moći primijetiti takav slučaj

 

PowerShell je potrebno pokrenuti s Administratorskim privilegijama, pa to i učinite tako da kliknete na „Run as Administrator”.

 

Pokrenite ga s Administratorskim privilegijama. To učinite tako da kliknete na “Run as Administrator”

 

Kako bite ispisali dostupne COM portove u naredbeni redak upišite:

[System.IO.Ports.SerialPort]::getportnames()

 

Vaš COM port sigurno će imati neki drugi broj, dok port (COM1) s brojem jedan treba zanemariti

 

Želite li saznati količinu slobodnog RAM-a, možete je dobiti upisivanjem naredbe:

Get-Counter '\Memory\Available MBytes'

 

Isto tako, ispisano zauzeće procesora dobit ćete naredbom:

Get-Counter '\Processor(_Total)\% Processor Time'

 

Kako bi objedinili ove informacije i poslali ih na COM port potrebno je formatirati ih te ih zatim tako formatirane poslati na njega.

Prvo moramo kreirati objekt serijskog porta COM46 jer u našem primjeru iz naredbe koja nam izlista dostupne portove saznajemo kako se radi o portu COM46. U vašem će se slučaju taj posljednji broj razlikovati i biti veći od jedan. Bitno je razumjeti kako samo jedna aplikacija može istovremeno koristiti spomenuti port, pa ako imate otvoren Serijski Monitor iz Arduino IDE razvojne okoline, morat ćete prije pokretanja komunikacije putem PowerShella zatvoriti Serijski monitor kako biste oslobodili port za druge aplikacije.

Objekt ćemo kreirati tako da varijabli dodijelimo serijski port, a nakon toga ga možemo i otvoriti:

$port= new-Object System.IO.Ports.SerialPort COM46,115200,None,8,one
$port.open()

 

Sada na VIDI X mikroračunalo podatke možete slati naredbom:

$port.Write([char]255)

ili

$port.Write("Bok")

 

Ako više ne želite slati ništa, potrebno je zatvoriti port naredbom:

$port.Close()

 

No naš je cilj konstanto slati podatak VIDI X mikroračunalu, pa ćemo u našem slučaju podatke slati u beskonačnoj petlji. Nakon što smo otvorili port, potrebne su nam neke varijable za pospremanje podataka kako bismo ih naknadno obradili, formatirali i ispisali naredbom $port.WriteLine:

$totalRam = (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).Sum
while($true) {
$date = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
$cpuTime = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
$availMem = (Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue
$port.WriteLine($date + ' CPU:' + $cpuTime.ToString("#,00.0") + '% Free Mem: ' + $availMem.ToString("F0") + ' MB ' + (104857600 * $availMem / $totalRam).ToString("F0") + '%')
#Start-Sleep -s 2
}

 

Za formatiranje stringova koristili smo nekoliko puta F0 format te formatiranje na jednu decimalu korištenjem maske “#,00.0”.
Za više informacija i primjera kako formatirati brojeve posjetite link: https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?redirectedfrom=MSDN&view=net-6.0#System_Double_ToString_System_String_

Na posljetku, želite li napraviti pauzu od dvije sekunde, maknite oznaku komentara (#) s linije Start-Sleep -s 2.

Tako skripta čeka dvije sekunde prije ponovnog slanja novog očitanja stanja procesora i RAM-a.

Kompletnu skriptu preuzmite s linka: https://github.com/VidiLAB-com/Vidi-X/tree/master/CPU_Status

Ne zaboravite promijeniti broj COM porta unutar skripte. Ako ste sami pisali skriptu morate joj dodati ekstenziju .ps1 kako bi je PowerShell htio pokrenuti.
Kliknete li desnom tipkom miša na vašu novo napravljenu skriptu, recimo, status.ps1, dobit ćete izbornik na kojem među ostalim stavkama imate i „Run with PowerShell”, pa izaberite tu opciju. Na zaslonu VIDI X mikroračunala pojavio se tekst sa zauzećem procesora, slobodnom količinom RAM-a, kao i s datumom i vremenom u kojem je očitan prikazani podatak.

 

KOD shell skripte možete jednostavno “copy-paste” u Power Shell ukoliko ga ne možete ili ne želite pokrenuti s Administratorskim ovlastima

 

Što biste još mogli poslati na serijski port?

Sada kad znate kako slati informacije na COM port i ako baš morate unatoč našim upozorenjima pokrenuti nekakvu .exe datoteku i njezin izlazni podatak poslati na serijski port, to možete učiniti ovako:

$port= new-Object System.IO.Ports.SerialPort COM46,115200,None,8,one
$port.open()
$ohm = D:\Users\User\Downloads\OpenHardwareMonitorReport\OpenHardwareMonitorReport.exe
$port.Write($ohm)

 

 

Vi ćete morati prilagoditi putanju do vaše datoteke, a ovu iz primjera možete pronaći na linku:
https://github.com/openhardwaremonitor/openhardwaremonitor/files/1130239/OpenHardwareMonitorReport.zip

Radi se o besplatnoj open source verziji softvera koji će pokazati stanje svih senzora dostupnih u vašem hardveru. Više o softveru pronađite na web stranici: https://openhardwaremonitor.org

Ovdje možete dobiti puno više informacija o vašem hardveru no što ga možete dobiti korištenjem isključivo PowerShell skripti. No kako izlazni podatak koji dobijete na COM port neće stati na ekran VIDI X mikroračunala, trebat ćete ga prilagoditi.

 

UART komunikacija koristi se od najranijih dana računalne komunikacije. Nekadašnji modemi su se u velikoj mjeri oslanjali na UART. Danas je nazastupljenija u robotici te drugim STEM projektima jer UART komunikaciju podržavaju gotovo svi mikrokontroleri