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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg av DanielM »

Hej!

Jag försöker ansluta min USB med ett C-exempel med LibUSB. Det fungerar att att ansluta om jag kör via min STMicroelectronics STLINK-V2 adapter, men inte när jag kör via STMicroelectronics Virtual COM Port.

Om ni undrar vad STMicroelectronics STLINK-V2 är, så är det den där lilla extra apparaten som används för att programmera ST-kretsarna.
STMicroelectronics Virtual COM Port är det där inbygga USB stödet som finns i vissa lite dyrare ST-processorer.

Så vad kan vara felet här? Det fungerar alltså att skapa en anslutning när jag kör min STLINK-V2 men inte Virtual COM Port.
Min Vendor ID och produkt ID för STMicroelectronics Virtual COM Port är vendorID = 1155, productID = 22336. Jag är 100% säker på att dessa ID tillhör STMicroelectronics Virtual COM Port då jag har kollat i http://www.linux-usb.org/usb.ids Där finns allt.

Kan det vara så att LibUSB har bara stöd för vissa typer av USB enheter?
Senast redigerad av DanielM 21 november 2022, 20:56:46, redigerad totalt 1 gång.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

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

Inlägg av adent »

Hej!

Jag förstår inte riktigt vad du vill göra? Har du en STM32:a som du vill använda dess inbyggda USB-client-stöd på?
Det har ingenting med programmeraren att göra?

Så du vill skriva kod på PC:n som använder libUSB för att kommunicera med din stm32:a? Eller vill du skriva kod på PC:en som styr din STLink?
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 vill kunna tala med min STM32 via min PC. För det så har jag använt mig av LibUSB. Ett rätt krångligt bibliotek, men det verkar inte finns något annat tydligen.

Min STM32 har inbyggt USB stöd som kallas för Virtual COM Port och jag kan läsa utav tillverkar ID och produkt ID
Så du vill skriva kod på PC:n som använder libUSB för att kommunicera med din stm32:a?
Jag har kod som kan tala med STLINK-V2, men koden fungerar inte att ansluta mot Virtual COM Port. Jag tycker det är konstigt, men något måste skilja mellan STLINK-V2 och Virtual COM Port.

Både STLINK-V2 och Virtual COM Port är alltså USB.
Användarvisningsbild
AndLi
Inlägg: 17050
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 »

STM32 usb är väl helt generisk och antar den skepnad av det program man programmerar den med?

är libUSB du menar för STM32an eller för PC?
För PC kommer en VCP dyka upp som en helt vanlig serieport, som man kan hantera som en sådan rakt av.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

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

Inlägg av adent »

Ja kör du en virtuell com-port på STM32:an dyker den upp som en COM-port och du varken behöver eller ska använda libUSB.
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 »

AndLi skrev: 21 november 2022, 20:30:23 STM32 usb är väl helt generisk och antar den skepnad av det program man programmerar den med?

är libUSB du menar för STM32an eller för PC?
För PC kommer en VCP dyka upp som en helt vanlig serieport, som man kan hantera som en sådan rakt av.
Jag har ingen aning hur STM32 skapade sin USB. Jag använder deras USB och måste säga att det är otroligt enkelt. Man skriver knappt kod för att få det fungera. Bara bocka i en box och sedan generera kod.

LibUSB är på min PC.

Ja, det måste vara något i den stilen att min VCP är inte en äkta USB port, utan något...virtuellt?
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 »

adent skrev: 21 november 2022, 20:34:42 Ja kör du en virtuell com-port på STM32:an dyker den upp som en COM-port och du varken behöver eller ska använda libUSB.
Så hur ska man göra då?

LibUSB har två bibliotek:
- LibUSB
- HidApi

Men ingen av dom kan ansluta min Virtual COM Port tydligen.

Kod: Markera allt

/*******************************************************
 HIDAPI - Multi-Platform library for
 communication with HID devices.
 Alan Ott
 Signal 11 Software
 libusb/hidapi Team
 Copyright 2022.
 This contents of this file may be used by anyone
 for any reason without any conditions and may be
 used as a starting point for your own applications
 which use HIDAPI.
********************************************************/

#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>

#include <hidapi/hidapi.h>

// Headers needed for sleeping.
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

// Fallback/example
#ifndef HID_API_MAKE_VERSION
#define HID_API_MAKE_VERSION(mj, mn, p) (((mj) << 24) | ((mn) << 8) | (p))
#endif
#ifndef HID_API_VERSION
#define HID_API_VERSION HID_API_MAKE_VERSION(HID_API_VERSION_MAJOR, HID_API_VERSION_MINOR, HID_API_VERSION_PATCH)
#endif

//
// Sample using platform-specific headers
#if defined(__APPLE__) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
#include <hidapi_darwin.h>
#endif

#if defined(_WIN32) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
#include <hidapi/hidapi_winapi.h>
#endif

#if defined(USING_HIDAPI_LIBUSB) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
#include <hidapi_libusb.h>
#endif
//

void print_device(struct hid_device_info* cur_dev) {
	printf("Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
	printf("\n");
	printf("  Manufacturer: %ls\n", cur_dev->manufacturer_string);
	printf("  Product:      %ls\n", cur_dev->product_string);
	printf("  Release:      %hx\n", cur_dev->release_number);
	printf("  Interface:    %d\n", cur_dev->interface_number);
	printf("  Usage (page): 0x%hx (0x%hx)\n", cur_dev->usage, cur_dev->usage_page);
	//printf("  Bus type: %d\n", cur_dev->bus-type);
	printf("\n");
}

void print_devices(struct hid_device_info* cur_dev) {
	while (cur_dev) {
		print_device(cur_dev);
		cur_dev = cur_dev->next;
	}
}

int main(int argc, char* argv[])
{
	(void)argc;
	(void)argv;

	int res;
	unsigned char buf[256];
#define MAX_STR 255
	wchar_t wstr[MAX_STR];
	hid_device* handle;
	int i;
	int vendorID = 1155;
	int productID = 22336;

	struct hid_device_info* devs;

	printf("hidapi test/example tool. Compiled with hidapi version %s, runtime version %s.\n", HID_API_VERSION_STR, hid_version_str());
	if (HID_API_VERSION == HID_API_MAKE_VERSION(hid_version()->major, hid_version()->minor, hid_version()->patch)) {
		printf("Compile-time version matches runtime version of hidapi.\n\n");
	}
	else {
		printf("Compile-time version is different than runtime version of hidapi.\n]n");
	}

	if (hid_init())
		return -1;

#if defined(__APPLE__) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
	// To work properly needs to be called before hid_open/hid_open_path after hid_init.
	// Best/recommended option - call it right after hid_init.
	hid_darwin_set_open_exclusive(0);
#endif

	devs = hid_enumerate(vendorID, productID);
	print_devices(devs);
	hid_free_enumeration(devs);

	// Set up the command buffer.
	memset(buf, 0x00, sizeof(buf));
	buf[0] = 0x01;
	buf[1] = 0x81;


	// Open the device using the VID, PID,
	// and optionally the Serial number.
	////handle = hid_open(0x4d8, 0x3f, L"12345");
	handle = hid_open(vendorID, productID, NULL);
	if (!handle) {
		printf("unable to open device\n");
		hid_exit();
		return 1;
	}
	else {
		printf("Device open!\n");
	}

	// Read the Manufacturer String
	wstr[0] = 0x0000;
	res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
	if (res < 0)
		printf("Unable to read manufacturer string\n");
	printf("Manufacturer String: %ls\n", wstr);

	// Read the Product String
	wstr[0] = 0x0000;
	res = hid_get_product_string(handle, wstr, MAX_STR);
	if (res < 0)
		printf("Unable to read product string\n");
	printf("Product String: %ls\n", wstr);

	// Read the Serial Number String
	wstr[0] = 0x0000;
	res = hid_get_serial_number_string(handle, wstr, MAX_STR);
	if (res < 0)
		printf("Unable to read serial number string\n");
	printf("Serial Number String: (%d) %ls", wstr[0], wstr);
	printf("\n");

	// Read Indexed String 1
	wstr[0] = 0x0000;
	res = hid_get_indexed_string(handle, 1, wstr, MAX_STR);
	if (res < 0)
		printf("Unable to read indexed string 1\n");
	printf("Indexed String 1: %ls\n", wstr);

	// Set the hid_read() function to be non-blocking.
	hid_set_nonblocking(handle, 1);

	// Try to read from the device. There should be no
	// data here, but execution should not block.
	res = hid_read(handle, buf, 17);

	// Send a Feature Report to the device
	buf[0] = 0x2;
	buf[1] = 0xa0;
	buf[2] = 0x0a;
	buf[3] = 0x00;
	buf[4] = 0x00;
	res = hid_send_feature_report(handle, buf, 17);
	if (res < 0) {
		printf("Unable to send a feature report.\n");
	}

	memset(buf, 0, sizeof(buf));

	// Read a Feature Report from the device
	buf[0] = 0x2;
	res = hid_get_feature_report(handle, buf, sizeof(buf));
	if (res < 0) {
		printf("Unable to get a feature report: %ls\n", hid_error(handle));
	}
	else {
		// Print out the returned buffer.
		printf("Feature Report\n   ");
		for (i = 0; i < res; i++)
			printf("%02x ", (unsigned int)buf[i]);
		printf("\n");
	}

	memset(buf, 0, sizeof(buf));

	// Toggle LED (cmd 0x80). The first byte is the report number (0x1).
	buf[0] = 0x1;
	buf[1] = 0x80;
	res = hid_write(handle, buf, 17);
	if (res < 0) {
		printf("Unable to write(): %ls\n", hid_error(handle));
	}


	// Request state (cmd 0x81). The first byte is the report number (0x1).
	buf[0] = 0x1;
	buf[1] = 0x81;
	hid_write(handle, buf, 17);
	if (res < 0) {
		printf("Unable to write()/2: %ls\n", hid_error(handle));
	}

	// Read requested state. hid_read() has been set to be
	// non-blocking by the call to hid_set_nonblocking() above.
	// This loop demonstrates the non-blocking nature of hid_read().
	res = 0;
	i = 0;
	while (res == 0) {
		res = hid_read(handle, buf, sizeof(buf));
		if (res == 0) {
			printf("waiting...\n");
		}
		if (res < 0) {
			printf("Unable to read(): %ls\n", hid_error(handle));
			break;
		}

		i++;
		if (i >= 10) { /* 10 tries by 500 ms - 5 seconds of waiting*/
			printf("read() timeout\n");
			break;
		}

#ifdef _WIN32
		Sleep(500);
#else
		usleep(500 * 1000);
#endif
	}

	if (res > 0) {
		printf("Data read:\n   ");
		// Print out the returned buffer.
		for (i = 0; i < res; i++)
			printf("%02x ", (unsigned int)buf[i]);
		printf("\n");
	}

	hid_close(handle);

	/* Free static HIDAPI objects. */
	hid_exit();

#ifdef _WIN32
	system("pause");
#endif

	return 0;
}
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 »

Om du nu har en virtuell COM-port, använd den som det.

Du använder den precis som vilken annan COM-port som helst.
Exakt hur man gör det beror på vilken miljö du kör i, operativsystem och programspråk.
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 »

Okej. I detta fall är det Windows, då kanske jag ska anropa interna WIN32 funktioner.
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 »

Är du öppen för något modernare än C så är det väldigt enkelt med tex. .NET
https://learn.microsoft.com/en-us/dotne ... at-ext-7.0

Förmodligen ännu enklare i Python eller något liknande.
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 kör egentligen C++. Hur modernt som helst :D
Orsaken varför jag kör C++ har med att grafikbibliotek att göra.

Enklare desto högre nivå på språket det är. Personligen föredrar jag C kod, med vissa C++ funktionaliteter så som std:vector och std::string. Mycket användbart.
Användarvisningsbild
AndLi
Inlägg: 17050
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 »

fortfarande behöver du inga speciallib, bara öppna som du gjort med vilken serieport som helst.
google kommer garanterat kunna hjälpa dig oberoende av vilket mer eller mindre obskyrt programmeringsspråk du valt..
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 en Communication Device Class och det ska tydligen LibUSB ha stöd till.

https://github.com/tytouf/libusb-cdc-ex ... _example.c

Jag har kört detta exempel med korrekt vendor-ID och produkt-ID. Nix, kan inte ansluta.

Men när jag kör QT C++ så kan jag ansluta. Inga problem där! Dock så ansluter jag med strängarna COM8, COM2 osv.
Användarvisningsbild
AndLi
Inlägg: 17050
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 »

Och vad är det vi har sagt att du ska göra?

Och varför envisas du med att krångla till det med libusb?
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 »

Men jag bara säger det att jag har testat libusb till max, och det fungerar inte. Ville bara klargöra detta.
Så det jag får göra då är väll använda någon Win32 API istället.

Jag tycker det är skumt att libusb inte fungerar till min enhet. Jag menar, varför skulle det inte fungera.

Men jag ska antingen välja Win32 API eller något annat bibliotek.

Uppdaterat:
Jag har testat Win32 API nu, det fungerar att ansluta.
Skriv svar