Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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?
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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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?
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?
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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
Både STLINK-V2 och Virtual COM Port är alltså USB.
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
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.Så du vill skriva kod på PC:n som använder libUSB för att kommunicera med din stm32:a?
Både STLINK-V2 och Virtual COM Port är alltså USB.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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.
ä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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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?
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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;
}
- Klas-Kenny
- Inlägg: 11365
- 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?
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.
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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
Okej. I detta fall är det Windows, då kanske jag ska anropa interna WIN32 funktioner.
- Klas-Kenny
- Inlägg: 11365
- 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?
Ä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.
https://learn.microsoft.com/en-us/dotne ... at-ext-7.0
Förmodligen ännu enklare i Python eller något liknande.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
Jag kör egentligen C++. Hur modernt som helst
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.
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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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..
google kommer garanterat kunna hjälpa dig oberoende av vilket mer eller mindre obskyrt programmeringsspråk du valt..
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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.
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.
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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?
Och varför envisas du med att krångla till det med libusb?
Re: Vad är det för skillnad mellan STMicroelectronics Virtual COM Port och STMicroelectronics STLINK-V2?
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.
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.