Skocz do zawartości
Zaloguj się, aby obserwować  
gustawdaniel

UART - gdzie montuje się STM32 na Linuksie

Pomocna odpowiedź

Dla użytkowników systemu Linux. 

Żeby sprawdzić gdzie montuje się wasze urządzenie możecie skorzystać z instrukcji https://askubuntu.com/a/408831/614907

U mnie była to ścieżka /dev/serial/by-id/usb-STMicroelectronics_STM32_STLink_066FFF494849887767072607-if02

Do czytania danych wysłanych przez mikrokontoler można użyć zarówno programu cat (zwykły tekst) jak i xdd (wygodny dla danych binarnych)

Na przykład:

cat /dev/serial/by-id/usb-STMicroelectronics_STM32_STLink_066FFF494849887767072607-if02

Znalezienie tego zajęło mi dużo czasu, być może ten komentarz go komuś oszczędzi.

UPDATE:

Do wysyłania danych można oczywiście używać przekierowań takich jak echo "a" > /dev/serial/... ale wygląda na to, że takie coś załącza jakiś dodatkowy znak końca strumienia danych, żeby tego uniknąć napisałem w node.js program który przechwytuje klawisze z klawiatury i wysyła na ten adres. W tym programie problem problem znaku kończącego zapis nie występuje, ale z chęcią dowiem się czy ktoś nie zna prostszego sposobu.

/**
 * Script reads keys from keyboard and redirects them to usb device
 * We assume that device with usb communication is located in path
 * described in constant `file`.
 *
 * Usage: 
 * connect STM32 with program from example "Data receiving" from Forbot Course
 * first conosle: cat /dev/serial/by-id/usb-STMicroelectronics_STM32_STLink_066FFF494849887767072607-if02 
 * second console: node app.js
 * Start typing in second console, you should see responses from microcontroller in first console
 * 
 * It is possible that id of your device will be different, them use methods described on link:
 * https://askubuntu.com/a/408831/614907
 * to detect youd device path
 *
 * Daniel Gustaw <gustaw.daniel@gmail.com>
 *
 * Sat Mar 16 20:54:45 CET 2019
 *
 * Recommended tutorials:
 * https://forbot.pl/blog/kurs-stm32-5-komunikacja-z-komputerem-uart-id8439
 * https://thisdavej.com/making-interactive-node-js-console-apps-that-listen-for-keypress-events/
 * https://dustinpfister.github.io/2018/08/17/nodejs-filesystem-create-write-stream/
 * https://askubuntu.com/a/408831/614907
 */
const readline = require('readline');
const fs = require('fs');
const file = '/dev/serial/by-id/usb-STMicroelectronics_STM32_STLink_066FFF494849887767072607-if02';

let writer = fs.createWriteStream(file); // stream that allow redirect characters

readline.emitKeypressEvents(process.stdin); // enable listening
process.stdin.setRawMode(true); // listen for all keys (without confirming by enter)
process.stdin.on('keypress', (str, key) => { // listen on pressing keys
    if (key.ctrl && key.name === 'c') { // allow for closing connection by ctrl+c
        process.exit(); // close process
    } else {
        console.log(`You pressed the "${str}" key`); // log info what you pressed
        writer.write(str); // send this key to stream
    }
});
console.log('Press any key...');

 

Edytowano przez gustawdaniel
lepsze ujęcie co mam na myśli
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@gustawdaniel witam na forum i dziękuję za podzielenie się rozwiązaniem! Na pewno pomoże to w przyszłości jakiejś innej osobie, która trafi tu podczas szukania rozwiązania swojego problemu 🙂

Udostępnij ten post


Link to post
Share on other sites
Dnia 16.03.2019 o 19:10, gustawdaniel napisał:

echo "a" > /dev/serial/... ale wygląda na to, że takie coś załącza jakiś dodatkowy znak końca strumienia danych

No załącza \n - w końcu echo a na wyjściu daje 'a\n'.

Dnia 16.03.2019 o 19:10, gustawdaniel napisał:

z chęcią dowiem się czy ktoś nie zna prostszego sposobu.

echo -n "a" >/dev/gdzieśtam

nie zadziała?

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Taka mała prośba do admina - może ten offtopic warto byłoby wydzielić?

Po pierwsze to nie ma nic wspólnego z kursem, który był oparty na Windows. Po drugie te rady powinny mieć podtytuł "jak skomplikować sobie prosty problem i nic nie rozwiązać".

Wcale nie trzeba grzebać w /dev/serial/by-id/, bo podłączając Nucleo do komputera tworzony jest link /dev/ttyACM0, który jest znacznie łatwiej użyć niż grzebać i poszukiwać po ID.

A jeśli już ktoś potrzebuje coś pozmieniać, to lepiej poczytać o daemonie udev i przygotować odpowiednią regułę, zamiast narzekać że życie jest ciężkie.

Kolejna sprawa to używanie echo i cat do komuniakcji z UART-em. To oczywiście działa, ale tylko czasem. Ponieważ nie ustawiliśmy konfiguracji portu, możemy mieć mnóstwo niespodzianek - dlatego lepiej tego nie robić. Po to są programy do komunikacji przez port szeregowy, jak chociażby minicom, a nawet screen żeby z nich korzystać. A bezpośrednie zapisy i odczyty zostawmy sobie i innym na deser, jak już będą na nieco wyższym poziomie znajomości linuksa.

No i na koniec to nieszczęsne echo i strzelanie z armaty do wróbla przy użyciu node.js... to już oczy bolą jak się czyta takie wpisy. Nauczka powinna być inna - zanim wynajdziesz własne, kwadratowe koło, przeczytaj dokumentację:

man echo

to nie boli...

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
17 minut temu, Elvis napisał:

man echo

Jeśli już to "help echo" (to polecenie wbudowane w basha)

 

Udostępnij ten post


Link to post
Share on other sites

A co złego jest w użyciu man?

Udostępnij ten post


Link to post
Share on other sites

Bo man jest do innego polecenia (do /bin/echo a nie do wbudowanego polecenia shella). Zresztą cytując man echo:

Cytat

NOTE: your shell may have its own version of echo, which usually super‐
       sedes the version described here.  Please refer to your  shell's  docu‐
       mentation
for details about the options it supports.

(wytłuszczenie moje)

Udostępnij ten post


Link to post
Share on other sites

A wiesz która wersja jest używana, czy zgadujesz?

Udostępnij ten post


Link to post
Share on other sites

A Ty? 😉

Ja się domyślam ; jeśli ktoś wspomina o askubuntu i nie czytuje dokumentacji to raczej nie jest developerem PLD i używa tego co fabryka dała w jego Jedynej Słusznej Dystrybucji (czyli basha).

Udostępnij ten post


Link to post
Share on other sites

U mnie ubuntu używa /bin/echo, sprawdzałem. Ale to i tak mało ważne, -n działa nawet z busybox-em

Udostępnij ten post


Link to post
Share on other sites

Która wersja ubuntu? Bo u mnie (18.04, akurat z niego piszę) używa wbudowanego... zresztą odkąd pamiętam zawsze tak było.

A że -n jest wszędzie to inna sprawa 🙂

Udostępnij ten post


Link to post
Share on other sites

Ja sprawdzałem na 16.04, ale teraz i na 18.04 - w obu przypadkach domyślnie używa /bin/echo. Dopiero po usunięciu tego pliku bash używa wewnętrznej wersji.

Ale to chyba zupełnie nieistotne. man, albo jak ktoś woli info to tylko sugestia co można użyć jako pierwsze źródło informacji. Później można szukać dalej, np. w dokumentacji powłoki, a czasem nawet w kodach źródłowych. Ważne żeby wiedzieć gdzie szukać, a nie od razu łapać za node.js i wywarzać otwarte drzwi.

Edit: faktycznie, źle sprawdzałem. Na szybko użyłem strace i wtedy bash odwołuje się do /bin/echo. Jeśli wydajemy polecenie bezpośrednio faktycznie używana jest wbudowana opcja. Przyznam, że wcześniej nie wiedziałem że takie różnice są w zależności od wywołania, jak widać człowiek uczy się całe życie 🙂

Udostępnij ten post


Link to post
Share on other sites

Zgodnie z sugestią powyższe posty zostały wydzielone z poniższego odcinka kursu STM32:

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...