SerialPort Communication

SerialPort Communication

Wątek przeniesiony 2018-11-08 11:55 z C/C++ przez Marooned.

XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Witem Serdecznie wszystkich użytkowników.
Jestem nowym użytkownikiem tego forum jak i początkującym programistą. Stanąłem przed pewnym problemem, którego nie mogę rozwiązać. Mam napisany program w C++ , który analizuje obraz i podaje współrzędne środka piłeczki względem środka platformy. Moją zwrotną informacją jest współrzędna x i y. Są to liczby typu integer i obie przyjmują wartości od -500 do 500(zależy od rozdzielczości obrazu). W tym momencie pojawia się mój problem. Chciałbym, aby te dwie współrzędne zostały wysłane przez USB do Arduino w którym mam napisany program (regulator PID). Te współrzędne będą przetwarzane na ruch serwomechanizmów. Czy byłby ktoś w stanie napisać mi fragment programu na taką komunikacje i przesył danych ? Eksperymentowałem z klasą nazw "System","System::IO::Ports" lecz nie mogę sobie z tym poradzić. Próbowałem również używać bibliotek dostępnych na Github. Walczę z tematem od kilku tygodni i na prawdę już jestem bezradny.
Z góry bardzo dziękuje za pomoc.
Serdecznie pozdrawiam :)

edytowany 1x, ostatnio: xszalonyx
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
1

Próbowałeś WinUSB?

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:2 dni
1

Jeżeli mówisz o System::IO::Ports to znaczy, że mówisz o C++/CLI.

Nie znam się na C++/CLI, ale w C# (który korzysta z tych samych bibliotek) to jest proste:

Kopiuj
SerialPort sp = new SerialPort("COM6", 115200); // połączenie będzie z portem COM6 z prędkością 115200 bps
sp.Open(); // otwórz port
sp.WriteLine(new byte[] { 12, 22, 0 }, 0, 3); // wyślij ciąg bajtów: 12,22 oraz 0
sp.Close(); // zamknij port

Po stronie Arduino najłatwiej wykorzystać Serial.readBytesUntil() i wczytywać do bufora aż do napotkania 0. Potem możesz wykorzystywać swoje dane z bufora (u mnie: 12 i 22) do zrobienia czegoś dalej. Jak się nie mieszczą w jednym bajcie to trzeba będzie kombinować i wysyłać inaczej.

Klasa SerialPort umie wysyłać "gołe" ciągi znaków, ciągi bajtów i stringi.

RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 6 godzin
0

jeśli ten port usb arduino jest widziano nie jako USB a jako COM to możesz użyć QT. W qt od 5 jest serialPort. Przykłady użycia w dokumentacji a z arduino na necie.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0
0x666 napisał(a):

Próbowałeś WinUSB?

Nie próbowałem tą metodą. Z tego co czytam na ten temat ten sposób wymaga utworzenia pewnego szkieletu. Czy narzucony szkielet przyjmie mój kod do obsługi kamery ?

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

Nie bardzo wiem, o jakim szkielecie piszesz. Otwierasz port funkcją CreateFile(), wywołujesz WinUsb_Initialize(), robisz to, co tam chcesz, a na koniec wywołujesz WinUSB_Free() i CloseHandle(). Pewnie będziesz musiał użyć funkcji SetupDiEnumDeviceInterfaces(), żeby pobrać nazwę "urządzenia" USB.

edytowany 1x, ostatnio: _0x666_
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0
0x666 napisał(a):

Nie bardzo wiem, o jakim szkielecie piszesz. Otwierasz port funkcją CreateFile(), wywołujesz WinUsb_Initialize(), robisz to, co tam chcesz, a na koniec wywołujesz WinUSB_Free() i CloseHandle(). Pewnie będziesz musiał użyć funkcji SetupDiEnumDeviceInterfaces(), żeby pobrać nazwę "urządzenia" USB.

Mógłbyś zaprezentować jak by miało to dokładnie wyglądało ?

06
Szukałeś w internetach? Jak podłączasz arduino do komputera, to system jakoś reaguje?
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0
revcorey napisał(a):

jeśli ten port usb arduino jest widziano nie jako USB a jako COM to możesz użyć QT. W qt od 5 jest serialPort. Przykłady użycia w dokumentacji a z arduino na necie.

Myślę, ze interfejs graficzny jest zbędny wiec chyba ta metoda nie będzie dobra

RE
ehh? Co ma sam framework qt do gui? SerialPort ma zainicjować komunikację po com i to tyle a co zrobisz z danymi twoja sprawa.
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

Przejrzałem internety na temat komunikacji Arduino z PC via USB. Wszystkie przykładowe kody realizują komunikację przez port COM (być może oprogramowanie od mikrokontrolera tworzy wirtualny port COM). Wygląda na to, że nie ma potrzeby używania WinUSB, wystarczy zwykłe CreateFile/WriteFile/ReadFile, ewentualnie jakaś klasa do obsługi portu szeregowego.

edytowany 1x, ostatnio: _0x666_
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0
0x666 napisał(a):

Przejrzałem internety na temat komunikacji Arduino z PC via USB. Wszystkie przykładowe kody realizują komunikację przez port COM (być może oprogramowanie od mikrokontrolera tworzy wirtualny port COM). Wygląda na to, że nie ma potrzeby używania WinUSB, wystarczy zwykłe CreateFile/WriteFile/ReadFile, ewentualnie jakaś klasa do obsługi portu szeregowego.

Napisałem program który współrzędne x i y wpisuje do pliku, a na końcu wstawia 0. Jak teraz odczytać te dane w Arduino ? Dalej stoję przed problemem wysłania tych danych przez USB.

Kopiuj
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int x = -2;
int y = 3;

int main()
{
	ofstream outFile;
	outFile.open("asd.txt");
	if (outFile.good())
	{
		outFile << x << endl;
		outFile << y << endl;
		outFile << 0 << endl;
		outFile.close();
		
	}
	else cout << "Nie można otworzyć pliku!" << endl;

	return 0;
}
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

Sprawdź w menedżerze urządzeń, czy nie masz w portach (LPT i COM) czegoś na wzór USB to COM adapter/bridge/whatever. Jeśli jest, to tam będziesz miał podane na jakim porcie COM to śmiga.

https://playground.arduino.cc/Interfacing/CPPWindows <--- tu masz przykładowy kod.

XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Czy jest ktoś w stanie wytłumaczyć mi ten kod ? Jak przerobić go, aby pasował do moich potrzeb ?

Kopiuj
char incomingData[256] = "";			// don't forget to pre-allocate memory
	//printf("%s\n",incomingData);
	int dataLength = 255;
	int readResult = 0;

	while(SP->IsConnected())
	{
		readResult = SP->ReadData(incomingData,dataLength);
		// printf("Bytes read: (0 means no data available) %i\n",readResult);
                incomingData[readResult] = 0;

        	printf("%s",incomingData);

		Sleep(500);
	}
	return 0;
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 6 godzin
0

ehh wygląda że nie wiesz ogólnie za co się bierzesz. Z dwóch stron musisz mieć oprogramowane odpowiedzialne za odbieranie/wysyłanie danych. tzn. Na procku wysyłasz dane do odpowiednich rejestrów żeby coś wysłać do PC a także masz odbiór danych z kompa.
Na PC biblioteką/frameworkiem otwierasz port com i przyjmujesz\wysyłasz dane. Jak podałem wcześniej SerialPort z qt http://doc.qt.io/qt-5/qtserialport-index.html
Na początek najpierw sprawdź sobie czy wszystko gra po stronie procka za pomocą terminte. To taki terminal dla PC co pozwala odbierać/wysyłać dane po com.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 1x, ostatnio: revcorey
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0
revcorey napisał(a):

ehh wygląda że nie wiesz ogólnie za co się bierzesz. Z dwóch stron musisz mieć oprogramowane odpowiedzialne za odbieranie/wysyłanie danych. tzn. Na procku wysyłasz dane do odpowiednich rejestrów żeby coś wysłać do PC a także masz odbiór danych z kompa.
Na PC biblioteką/frameworkiem otwierasz port com i przyjmujesz\wysyłasz dane. Jak podałem wcześniej SerialPort z qt http://doc.qt.io/qt-5/qtserialport-index.html
Na początek najpierw sprawdź sobie czy wszystko gra po stronie procka za pomocą terminte. To taki terminal dla PC co pozwala odbierać/wysyłać dane po com.

Owszem masz rację. Moja wiedza jest uboga. Nie jestem programistą dlatego sprawia mi to duży problem. Udało mi się pewne rzeczy samemu napisać, a niestety tej nie jestem w stanie dlatego zgłasza się do takich ludzi jak Ty.

RE
niestety tu nie robimy za kogoś. Nie może być tak że bierzesz copy+paste kod i mówisz nie wiem. Poczytaj trochę o tym kodzie który wysłałeś wyżej, są na pewno tutoriale. Jak mniej więcej będziesz wiedział o co chodzi ale zatniesz się w pewnym miejscu pytaj.
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Udało mi się napisać program który przetwarza liczbę int na kod ACSII, który jest wpisany w poszczególne miejsca w tablicy c_string[]. Program działa tak jak chcę. Jak należy teraz go wysłać do Arduino ? Jak ma wyglądać odbiór po stronie Arduino ?

Kopiuj
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SerialClass .h"
using namespace std;



int X = -343;
char *c_string = new char[8];


int main()
{
	Serial * arduino = new Serial("COM3");
	if (arduino->IsConnected()) cout << "Hura!Jestesmy polaczeni z Arduino" << endl;
	else cout << "Sprawdz polaczenie";
	
	if (arduino->IsConnected())
	{
		int iloscx = X;
		int acsix = X;
		int lengthCountx = 0;
		for (; iloscx != 0; iloscx /= 10, lengthCountx++);
		{
			if (X <= 0)
			{
				lengthCountx = lengthCountx + 1;
				acsix = acsix * -1;
			}
		}
		int rx = 0;
		int ix = 1;
		while (ix <= lengthCountx)
		{
			rx = acsix % 10;
			acsix = acsix / 10;
			c_string[ix] = rx + 48;
			if (X < 0)
			{
				c_string[lengthCountx] = '-';
			}
			//cout << c_string[ix] << endl;
			ix++;
		}
		arduino->WriteData(c_string, 4);
		arduino->WriteData("/", 1);
	}
}
RE
mniej więcej tak jak na stronach arduino. Masz tam przykładowe programy do obsługi usb/rs232. Ten soft co napisałeś jest po stronie PC, teraz trzeba naklepać po stronie arduino.
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Chciałbym, aby bity wysłane z PC wpisywały się w tablice w Arduino. Chciałbym również, aby dał mi informację zwrotną co dokładnie otrzymał. Napisałem program, lecz nie działa. W jaki sposób mogę monitorować co się dzieje w mikrokontrolerze ?

Kopiuj
char x[4];

void setup() 
{
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available())
  {
    int i = 1;
    if (i <= 4)
    {
      x[i] = Serial.read();
      i++;
      Serial.println(x[i]);
    }
edytowany 2x, ostatnio: xszalonyx
RE
Za pomocą programatora JTAG. BTW. Nie znam za bardzo arduino ale po co pinMode(13,output) on chyba z automatu inicjalizuje wyjścia serial port.
XS
Nie usunąłem zbędnej linii kodu
RE
Czemu nic nie odbierasz(użyłeś transmite na pc żeby sprawdzić czy coś przychodzi?)? Przyczyn może być parę, złe podłączenie(lub nie pewne), problemy z zegarem(czyli za duża prędkość). Ogólnie ja robiłem takie rzeczy przez rs232(w czystym C) a nie przez gniazdko usb ale to powinno być ostatecznie to samo(o ile się nie mylę skoro widzisz port com a nie usb) i przeważnie jakieś luzy na kabelku(wtyczce miałem słabe luty).
XS
Myślę, że problem z połączeniem możemy wyeliminować. Na Arduino mam dokładnie taki kod jak widać wyżej(juz poprawiony po uwadze kolegi post niżej). Kompiiluje go, a następnie w VS odpalam kod, który jest widoczny post wyżej, lecz dopisane jest tam na końcu: arduino->ReadData(output, 4); //printf("%s", output); cout << output[1] << endl; cout << output[2] << endl; cout << output[3] << endl; cout << output[4] << endl; Ten kod jest poniżej linijki "arduino->WriteData("/", 1);"
atmal
  • Rejestracja:prawie 8 lat
  • Ostatnio:3 dni
  • Postów:913
0

Jeżeli masz tablicę 4 elementów

Kopiuj
char x[4];

To pierwszy element znajduje się pod indeksem 0, drugi 1... ostatni pod 3.

Załóżmy że w poniższym kawałku kodu i = 2

Kopiuj
x[i] = Serial.read(); // Wpisanie do x[2], załóżmy 32
i++; // i = 3
Serial.println(x[i]); // Pod x[3] są śmieci

Failure of one test is a tragedy, failure of fifty is a statistic.
XS
Dziękuje za słuszną uwagę. Lecz dalej w Visual nie widzę odpowiedzi Arduino
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 6 godzin
0

Co ty się uparłeś z tym visualem. Najpierw testuj na jakimś terminalu typu transmite.
edit:
a widzę tu jest też print w serial. Co nie zmienia faktu najpierw użyj terminala i na żywca wklej kod
https://www.arduino.cc/reference/en/language/functions/communication/serial/print/

Tak sprawdzisz czy problem to np. druty.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 4x, ostatnio: revcorey
Zobacz pozostały 1 komentarz
RE
ok tzn. połączenie arduino => PC ok. Teraz wrzuć swój soft i znajdź problem.
XS
Jak mogę sprawdzić czy jakieś dane docierają do Arduino ? Czyli test PC->Arduino?
RE
na parę sposobów. Programator jtag, wyrzucić przychodzące dane na wyświetlacz hd4470, albo użyć diod led n. jak przyjdzie literka 'a' zapalić diode.
RE
a możesz jeszcze zapętlić tzn. Wysyłasz z pc => arudino literkę 'a' w arudino automatycznie odsyłasz do pc to co przyszło.
XS
W taki wlasnie sposób chciałem to zrealizować 😉
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Po wczytaniu w VS poszczególnych cyfr do tablicy na końcu pojawiają mi się jakieś dziwne znaki. Jakie mogą być przyczyny pojawienia się takiego "szumu" ? Przeanalizowałem swój soft i nie widzę miejsca w którym mogłyby dziać się takie dziwne rzeczy.

syf.png

  • syf.png (120 KB) - ściągnięć: 110
atmal
  • Rejestracja:prawie 8 lat
  • Ostatnio:3 dni
  • Postów:913
0

Baud rate masz dobrze ustawiony?


Failure of one test is a tragedy, failure of fifty is a statistic.
XS
Korzystam z SerialClass.h oraz Serial.Cpp gdzie z góry Baud rate ustawiony jest na 9600. Oto definicja BaudRate "dcbSerialParams.BaudRate = CBR_9600;". W Arduino ustawiłem Serial.begin(9600).
RE
mu chodziło że to może być za dużo. To zależy ściśle od zegara. Ustaw mniej. Drugi przypadek to nie do końca dobrze stykające kabelki.
atmal
9600 za dużo? Przecież w Arduino jest zegar 16MHz. Chodziło mi bardziej o to czy baud rate jest taki sam w Arduino jak i w programie.
XS
Niestety zmiejszenie prędkości nic nie dało. Przewody również styk mają dobry
RE
Ja tam za bardzo arduino nie znam to nie wiem jakie tam zegary ;). jak kolega wyżej napisał dostosowałeś prędkość po stronie programu?
XS
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:13
0

Może dla ułatwienia wrzucę softy. Chciałbym wyeliminować nieznane znaki z tablicy wysyłanej oraz odbieranej. Rozumiem, że baudrate w obu urządzeniach musi być takie same ? Zmieniałem jego wartość od 9600 do 1200. Dalej widnieje problem. Styk przewodów jest dobry. Widocznie wina leży po stronie kodu dlatego go tu zamieściłem.

Kod po stronie PC:

Kopiuj
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SerialClass .h"
using namespace std;



int X = -345;
char *c_string = new char[4](); //tworzenie wkaźnika
char output[4] = {}; //tworzenie tablicy która pobiera dane z arduino


int main()
{
	Serial * arduino = new Serial("COM3");
	if (arduino->IsConnected()) cout << "Hura!Jestesmy polaczeni z Arduino" << endl;
	else cout << "Sprawdz polaczenie"; //otwarcie komunikacji z arduino
	
	if (arduino->IsConnected()) 
	{
		int lcx = X;
		int acsix = X;
		int liczba_cyfrx = 0;
		char kodx = 0;
		int ix = 0;

		for (; lcx != 0; lcx /= 10, liczba_cyfrx++); //zliczanie ilosci cyfr w liczzbie
		if (X <= 0)
		{
			c_string[liczba_cyfrx] = { '-' };
			acsix = acsix * -1;
		}
		while (ix < liczba_cyfrx)
		{
			kodx = acsix % 10; //pobieranie ostatniej cyfry z liczby
			acsix = acsix / 10; 
			c_string[ix] = kodx + 48;  //wpisywanie do tablicy w kodzie ACSII
			ix++;
		}
		cout << c_string << endl;
		arduino->WriteData(c_string, 4);
		arduino->ReadData(output, 4);
		cout << output << endl;
          }
}

Kod po stronie Arduino:

Kopiuj
char buff[4]={};

void setup() 
{
  Serial.begin(1200);
}

void loop()
{
  Serial.readBytes(buff, 4);
  Serial.println(buff);

}

Odpowiedź układu w takim przypadku wygląda następująco:
asd.png

  • asd.png (124 KB) - ściągnięć: 111
edytowany 1x, ostatnio: xszalonyx
RE
ja tam w tym sofcie na pc nie widzę ustawiania prędkości. Od dwóch stron mówię ci żebyś najpierw ściągnął terminal typu termite. Wtedy przetestujesz sobie samo połączenie pc <=> arduino. Taki terminal ma możliwość ustawiania prędkości czy wyboru port. A wtedy dopiero pracujesz nad softem na pc bo wiesz że wszystko po stronie arduino i samego połączenia do pc działa.
XS
Używam SerialClass.h i Serial.Cpp gdzie jest definiowanie baudrate. Użyłem programu RealTerm oraz stworzyłem witualny mostek międyz portem 5,a 6. Na port 5 wysyłam informację, a na 6 obserwuje co się dzieje. W tym programie wygląda na to, że wszystko jest idealnie, lecz jeżeli wyświetlam te tablice w VS to widać jakieś znaczki ....
XS
Komunikacja działa bez problemu tylko te nieznane znaki uszkadzają wysyłane dane i przez to odbiór także jest zły
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 6 godzin
0

I to dobre info, teraz wiemy ze problem jest w appce na pc. parę spraw na start. Dodaj sobie do cout jakieś info w stylu "wyświetlam c_string:". Dwa to trochę dziwnie wygląda bo wygląda że piszesz jakieś bzdury w tym c_stringu. Po co używasz cstringów w ogóle? Użyj std::String, czyli zrób z int std::String i zliczanie liczby cyfr będzie trywialne. Cały ten algorytm dziwny się uprości. Trochę jest to takie dziwne że piszesz i od razu czytasz. Ja po stronie PC zawsze używałem tu javy nie c++, i pamiętam że moje rozwiązanie było na wątkach, jeden pisał na com a drugi czytał. Nie wiem co to za biblioteka ale sprawdź w dokumentacji do niej czy nie ma jakieś ostrzeżenia o tym że piszesz na com i następnie czytasz od razu.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
XS
Piszę i od razu czytam ponieważ chcę obserwować co się dzieje w Arduino. W finalnym programie będę tylko wysyłał dane (kilkanaście liczb na sekundę) i odczyt będzie realizwany tylko w Arduino.Używam C++ ponieważ to jest mała część mojego programu. Na początku pisałem czym się zajmuje.
RE
tak tylko zauważ, przesyłasz do arduino => mcu wykonuje rozkazy => odsyła. A to chwilę trwa a ty natychmiast czytasz z bufora i kończysz program. Poza tym dodaj info o tym w cout że teraz piszesz a terasz czytasz(tak jak pisałem + zmiany na std::string). BTW. w c++ też masz wątki :)
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

Chciałbym wyeliminować nieznane znaki z tablicy wysyłanej oraz odbieranej.

Na końcu każdego c-stringa powinno znajdować się zero. Nie ustawiasz tego zera i stąd te "nieznane znaki".

Kopiuj
char c_string[ std::numeric_limits<int>::digits10 + 3]; // bufor musi pomieścić łańcuch i zero na końcu
...

if (X <= 0)
{
	c_string[liczba_cyfrx] = { '-' };
	c_string[liczba_cyfrx + 1] = '\0';
	acsix = acsix * -1;
}

Oczywiście łańcuch powinieneś wysłać razem z tym zerem, żeby druga strona wiedziała, kiedy jest koniec.

edytowany 2x, ostatnio: _0x666_
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)