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

SerialPort Communication

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 :)

1

Próbowałeś WinUSB?

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:

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.

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.

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 ?

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.

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 ?

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

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.

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.

#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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1