Skocz do zawartości

UART - gdzie montuje się STM32 na Linuksie


gustawdaniel

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
Link do komentarza
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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
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)

Link do komentarza
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).

Link do komentarza
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 🙂

Link do komentarza
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!

Anonim
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.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.