• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Raspberry PI C++ serial multithreads

VPS Starter Arubacloud
0 głosów
260 wizyt
pytanie zadane 3 marca 2023 w C i C++ przez scared Początkujący (260 p.)
zamknięte 7 marca 2023 przez scared

Cześć,

dodaje do mojego projektu w cpp barcoder M800D (połączony seregowo do pinów w raspberry) i wszystko działa

poprawnie [gdy pracuje tylko wątek z barcoderem to wszystko działa ok]

Gdy uruchamiam reszte wątków dla aplikacji to czytnik przyjmuje "Krzaki" dla tych samych kodów. Aplikacja obsługuje PWM, 3 przyciski przez wiringpi.

Kod czytnika kodów: wiringPiSetup() - jest wywołane wczesniej przy starcie aplikacji

int barcode_read(char* buffer) {
    int fd;
    unsigned int nextTime;

if ((fd = serialOpen("/dev/ttyS0", 9600)) < 0)
{
    fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
    throw 1;
}

char dat;
int i = 0;
int counter = 0;
while (true)
{
    if (counter > 100) i = 0;
    if(i>0) counter++;
    delay(5);
    while (serialDataAvail(fd))
    {
        if (i == 0) counter = 0;
        dat = serialGetchar(fd);		/* receive character serially*/
        printf("%c", dat);        
        //serialPutchar(fd, dat);
        buffer[i] = dat;
        if (i == 16) {
            serialClose(fd);
            return 1;
        }// poprawnie zaczytany kod
        i++;
        fflush(stdout);
    }
}
}

 

Proszę o pomoc, już kilka dni spędziłem nad szukaniem rozwiązania :( 

komentarz zamknięcia: Problem rozwiązany
komentarz 4 marca 2023 przez Oscar Nałogowiec (29,290 p.)
W jaki sposób uruchamiasz wątki - biblioterką systemową, phtreads czy biblioteką z C++ (std::)?

Stąd wziąłeś /dev/ttyS0? Moja malinka nie ma takiego portu. Przekonfugurowałeś udev czy coś podobnego?
komentarz 4 marca 2023 przez scared Początkujący (260 p.)
cześć /dev/ttyS0 z dmesg | grep tty, nic nie zmieniałem system tak odczytał. Barcoder jest podłączony pod pin 9 i 10 GPIO.

Biblioteka systemowa z std.

 

Możliwe że czytnik jest uszkodzony. jak łącze się z nim za pomocą minicom to odbiera bardzo dużo błędnych kodów.
komentarz 4 marca 2023 przez Oscar Nałogowiec (29,290 p.)
A jaką masz wersje czytnika (USB, TTL czu RS232)?
komentarz 4 marca 2023 przez scared Początkujący (260 p.)
RS 232, czytnik YHD-M800D
1
komentarz 4 marca 2023 przez Oscar Nałogowiec (29,290 p.)
To źle, potrzebujesz TTL. Malinka nie ma konwerterów napięć z TTL na standard RS232 (+/-12V). Te konwertery poza zmiana poziomów zmieniają też polaryzację H<=>L. Normalnie do tego jest układ MAX232 i pochodne. Ponieważ tylko czytasz jedną linię wystarczy jeden układzik na tranzystorze. Tak na szybko, jeśli masz, możesz użyć przejściówki USB-RS - da ci w malince regularny port RS232, pasujący do posiadanego skanera.
komentarz 4 marca 2023 przez mokrowski Mędrzec (155,460 p.)
Jeśli to ten, http://www.yhdaa.com/English/Product/324971564.html , to ma TTL. Sprawdź czy na tym porcie /dev/ttyS0, nie pracuje np. program login.
komentarz 4 marca 2023 przez Oscar Nałogowiec (29,290 p.)

Ze strony aliexpress wynika, że zamawia się odpowiednią wersję.

komentarz 5 marca 2023 przez scared Początkujący (260 p.)

@mokrowski, root       588     1  0 mar04 tty1     00:00:00 /bin/login -f
chodzi o to?

komentarz 5 marca 2023 przez mokrowski Mędrzec (155,460 p.)
Tak. Ale jak widzisz otwarty jest tty1 a nie ttyS0. Czyli akurat to nie wpływa na problemy w programie. Można uruchomić obsługę konsoli szeregowej w raspi-config. Wtedy miałbyś 2 programy "kłócące" się o jedno urządzenie.

2 odpowiedzi

+1 głos
odpowiedź 3 marca 2023 przez mokrowski Mędrzec (155,460 p.)
Nie widząc całego kodu... to oznaczać może że któryś z innych wątków dokonuje rekonfiguracji portu szeregowego. Albo w wyniku błędnej konfiguracji (bo np. był dostosowany do pracy samodzielnie i przestawia sposób działania pinów), albo w wyniku wyścigu danych.

Powodem może być także inny proces/wątek który odwołuje się do tego portu szeregowego poza Twoim programem.

Jako 3 (mniej prawdopodobny choć sprawdź bo nie widać przewodów i jak są umiejscowione), zakłócenia elektromagnetyczne. Pracujący PWM wzbudza nieoczekiwane stany w połączeniach szeregowych.
komentarz 3 marca 2023 przez scared Początkujący (260 p.)

zauważyłem że wątek czytnika współpracuje z jednym wątkiem w którym jest delay(500);

void swero() {
    while (1) {
        delay(500);
        if (g_read) {
            try {
                g_actual_water_temp = read_temp();
                g_read = false;
            }
            catch (int e) {
                logger("Read temp error + [" + to_string(e) +"]");
                g_read = false;
            }
        }
        if (g_swero != g_new_swero) {
            set_swero(g_new_swero);
            g_swero = g_new_swero;
        }
    }
}

jeżeli usunąłem stąd delay(500); to czytnik już nie działa poprawnie z tym wątkiem. 

1
komentarz 3 marca 2023 przez mokrowski Mędrzec (155,460 p.)
Z tego co widzę, nanosleep() (który jest wewnątrz delay()), nie jest bezpieczny wielowątkowo. Ściślej... nie ma adnotacji że jest bezpieczny a ogólna wykładnia dla libc, mówi że jeśli nie ma adnotacji, to nie jest bezpieczna. Proponuję abyś stosował std::this_thread::sleep_for(....) https://en.cppreference.com/w/cpp/thread/sleep_for

Inną sprawą jest to czy cały WirringPi jest bezpieczny wielowątkowo. Ale to sam sprawdź w dokumentacji.

Swoją drogą, takie "spanie" nie jest dobrym sposobem na docelową implementację. Ale to temat zbyt szeroki by go tu opisywać.
0 głosów
odpowiedź 7 marca 2023 przez scared Początkujący (260 p.)
Dziękuje wszystkim za pomoc. Okazało się że podłączenie czytnika do raspberry było wadliwe(programowo wszystko ok), co powodowało zakłócenia. Przewód do czytnika też był dość długi ponad 0,5m co też mogło powodować zakłócenia w transmisji TTL.

Podobne pytania

0 głosów
0 odpowiedzi 415 wizyt
0 głosów
0 odpowiedzi 122 wizyt
+1 głos
0 odpowiedzi 80 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...