Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
X-IL
EF Sponsor
Inlägg: 8261
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av X-IL »

Jag tror att vi alla hakar upp oss på att du försöker ansluta till en virtuell COM-port med nåt special. ST-Link V2 kanske har stöd för en egen virtuell COM som används till debugging, eller så är det nån annan USB-profil, inte en virtuell serieport. Men den vanliga virtuella serieporten bör du kunna testa att den funkar eller inte med vilken terminal som helst. Får du det sen inte att funka i ett C/C++/JAVA/SML/PYTHON/whatever-program, så är det dags att kolla på portinställningar osv OCH att du använder ett bibliotek för seriell kommunikation, då behöver du inga USB-ID:n eller annat.
OM du ska använda STMs stöd för USB-device med nån annan profil, ja då får du lösa det då. Men som du skrivit är det serieport du vill ansluta till?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Jadu. Den heter STMicroelectronics Virtual COM Port, men är en Communication Device Class (CDC).

Det fungerar inte att ansluta med libusb, men interna Win32 C++ API fungerar utmärkt att ansluta. Skillnaden mellan Win32 API och libusb är att libusb använder VendorID och ProductID för att ansluta.

Denna kod fungerar:

Kod: Markera allt


#include <windows.h>
#include <stdio.h>
#include <stdio.h>
int main()
{
    HANDLE hComm;

    hComm = CreateFileA("\\\\.\\COM8",                //port name
        GENERIC_READ | GENERIC_WRITE, //Read/Write
        0,                            // No Sharing
        NULL,                         // No Security
        OPEN_EXISTING,// Open existing port only
        0,            // Non Overlapped I/O
        NULL);        // Null for Comm Devices

    if (hComm == INVALID_HANDLE_VALUE)
        printf("Error in opening serial port");
    else
        printf("opening serial port successful");

    CloseHandle(hComm);//Closing the Serial Port

    return 0;
}
https://aticleworld.com/serial-port-pro ... win32-api/
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av AndLi »

Så använd inte libusb då utan öppna den som en serieport i Linux med så kommer det funka där med!
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Jag har fått det fungera nu.
Det var inte libusb som var fel på. Det var drivrutinerna. Libusb kan inte använda usbser.sys drivrutinen. Jag fick ta och ominstallera det till WinUSB för att få det fungera :)

Nu kan jag ansluta. :tumupp:

Tur detta, för jag har tänkt att min C++ applikation ska vara för Android, Iphone, Win, Lin, Mac också.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av Klas-Kenny »

Ett tips om du nu inte vill använda enheten som virtuell COM-port, välj ett annat USB-protokoll.

Att enheten dyker upp som virtuell COM-port kan vara förvirrande för en användare som försöker öppna COM-porten tex. Bättre med någon mer "diskret" enhetstyp då. Rätt säker på att ST har stöd för andra typer än virtuell COM-port också.
Dessutom att Windows automatiskt väljer in usbser.sys av den anledningen, kan ju enkelt undvikas.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Tackar.

Min processor STM32407-serie har stöd för olika USB protokoll, men jag har dålig kännedom om dessa.
Jag tycker det är enklare att installera rätt drivrutin för USB-porten istället :) Jag använde programmet "zadig" för att installera WinUSB.
Skärmbild 2022-11-08 012139.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av agehall »

Du vill verkligen inte lyssna på vad folk försöker säga till dig.

Om du skapar en virtuell COM-port på din STM32, så bör du INTE använda LibUSB eller andra bibliotek som går direkt på USB-stacken på PC-sidan för att kommunicera med din STM32 eftersom den automatiskt dyker upp som en COM-port. Det du gör nu är att ta bort Windows egna stöd för den COM-porten för att själv sedan prata med den via LibUSB. Det är helt galet och lär bara leda till konstigheter, framförallt när du inte har koll på vad du gör.

LibUSB et al är bra om du har en USB klass som Windows inte har inbyggt stöd för, men om allt du vill göra täcks av vad en COM-port erbjuder så är det enklast att bara köra med en vanlig CDC.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Klart jag lyssnar.
Jag har noll koll på Virtual Com Port. För mig är det bara en sak som jag kan ansluta. Vad den heter är ointressant för mig. Jag har dessutom aldrig hållit på med USB, förutom att ansluta en sådan.

På vilket sätt är det galet? Att det finns olika drivrutiner för USB portar köper jag. Jag ser inget problem att byta ut usbser.sys mot WinUSB.
Jag har behov utav att använda LibUSB för den är krossplattform. Win32 API kan ansluta min CDC-enhet (Den som kallas Virtual COM Port).
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av Klas-Kenny »

Finns bibliotek som kan hantera serieportar cross-platform.

Tex. Boost.Asio
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av TomasL »

Eller också så använder du XAMARIN eller liknande system, fördelen med Xamarin är att du kan använda Win APIer och kodar i C#, oavsett om det skall snurra under IOS, Android osv.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Xamarin är väll utgående? Nu är det Maui som gäller.

Microsofts produkter har alltid varit kortvariga.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Klas-Kenny skrev: 22 november 2022, 20:02:44 Finns bibliotek som kan hantera serieportar cross-platform.

Tex. Boost.Asio
Riktigt snyggt bibliotek. Jag tror jag ska titta på den seriella delen hos detta bibliotek. Tackar.

Edit:

Det fungerar :) Tackar så mycket Klas-Kenny. Riktigt välskrivet bibliotek. Önskar att fler bibliotek såg ut så där också.

Kod: Markera allt


#include <stdio.h>
#include <boost/asio.hpp>

int main()
{
	boost::asio::io_service io;
	boost::asio::serial_port port(io);

	port.open("COM8");

	if (port.is_open()) {
		printf("Yes.");
	}
	else {
		printf("no");
	}

	return 0;
}
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av ToPNoTCH »

DanielM skrev: 22 november 2022, 19:44:20 Jag har behov utav att använda LibUSB för den är krossplattform.
VCP Är väl konstruerad för att vara ClassCompliant så den funkar väl i alla OS (mer eller mindre).
Jag har i alla fall kört på Windows, Linux och MacOS utan att pilla in en ända drivare.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Boost är också krossplattform och har väldigt fina funktioner. Men jag saknar hur man hittar information om USB enheten med Boost. Typ Vendor ID och Produkt ID. Det ska tydligen inte fungera.

Hur som helst. Vad tycker ni om mitt sätt att läsa data via USB:n igenom att aktivera en tråd?
Se funktionerna:

- void readDataViaUSB()
- bool openUSBConnection(std::string portName, int baudrateIndex)

Kod: Markera allt


#include "USBHandler.h"
#include <boost/asio.hpp>
#include <thread>

// USB port
boost::asio::io_service usbPort;
boost::asio::streambuf readData;
boost::asio::serial_port port(usbPort);

// Thread for USB reading
uint8_t data[100];
void readDataViaUSB();
std::thread usbReader;
bool isThreadActive = false;
bool isBeenRunBefore = false;

bool openUSBConnection(std::string portName, int baudrateIndex) {
	// Connect 
	if (portName.length() > 0 && !isConnectedToUSB()) {
		// Open port
		port.open(portName);

		// Sett settings
		int baudrate = 0;
		switch (baudrateIndex) {
			case 0:baudrate = BAUD_110; break;
			case 1:baudrate = BAUD_150; break;
			case 2:baudrate = BAUD_300; break;
			case 3:baudrate = BAUD_600; break;
			case 4:baudrate = BAUD_1200; break;
			case 5:baudrate = BAUD_1800; break;
			case 6:baudrate = BAUD_2400; break;
			case 7:baudrate = BAUD_4800; break;
			case 8:baudrate = BAUD_9600; break;
			case 9:baudrate = BAUD_19200; break;
			case 10:baudrate = BAUD_38400; break;
			case 11:baudrate = BAUD_57600; break;
			case 12:baudrate = BAUD_115200; break;
		}
		port.set_option(boost::asio::serial_port_base::baud_rate(baudrate));

		// Start new read thread
		if (!isThreadActive && isBeenRunBefore)
			usbReader.join();
		usbReader = std::thread(&readDataViaUSB);
		isThreadActive = true;
		isBeenRunBefore = true;

		// Now return
		return isConnectedToUSB();
	}
	else {
		return false;
	}
}

bool closeUSBConnection() {
	if (isConnectedToUSB()) {
		port.close();
	}
	return !isConnectedToUSB();
}

bool isConnectedToUSB() {
	return port.is_open();
}

inline void checkPort(std::vector<std::string>& portNames, char portName[]) {
	port.open(portName);
	if (port.is_open()) {
		portNames.push_back(portName);
	}
	port.close();
}

void getUSBPortNames(std::vector<std::string>& portNames) {
	// Get the names
	char portName[15];
	for (int i = 0; i < 256; i++) {
		try {
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
			sprintf_s(portName, "COM%i", i);
			checkPort(portNames, portName);
#else
			sprintf_s(portName, "/dev/ttyAMC%i", i);
			checkPort(portNames, portName);
			sprintf_s(portName, "/dev/ttyUSB%i", i);
			checkPort(portNames, portName);
#endif

		}
		catch (...) {}
	}
}

int sendDataViaUSB(uint8_t data[], int lengthOfData) {
	return port.write_some(boost::asio::buffer(data, lengthOfData));
}

void readDataViaUSB() {
	// This try-catch statement is used because if we close the USB port, then the thread stops
	try {
		int readBytes = 0;
		while (1) {
			// Blocking read
			readBytes = port.read_some(boost::asio::buffer(data, sizeof(data)));

			// Do stuffs here...
		}
	}
	catch (...) {}
	isThreadActive = false;
}
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?

Inlägg av DanielM »

Nyfiken fråga om Boost Asio.

Jag har fått min USB att fungera. Uppskattar verkligen biblioteket :)
Men hur skulle ni ha gjort om ni har en tråd som synkroniserar data (lyssnar efter inkommande data via blockering) och en icke-tråd som bara skickar iväg data så snabbt som möjligt.

Vad händer om jag skickar snabbare än vad jag kan läsa?
När jag skickar ett kommando så SKALL min ST-processor skicka tillbaka 59 bytes av data. Om jag råkar skicka två kommandon snabbare innan Boost hinner läsa, så blir det 59*2 = 118 bytes av data. Råkar jag skicka 3 kommandon snabbare innan Boost hinner läsa så blir det 59*3 = 117 bytes av data.

Så, som du ser så verkar 59*X följa med tillbaka om jag skickar lite snabbare än vad jag kan läsa. Detta är så klart inte alls bra!
Hur löser jag detta med Boost?

Min idé är att ha någon sorts booleansk variabel som kan bekräfta om dom får skicka data eller inte.
Skärmbild 2022-11-29 203015.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar