Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

komunikacja pomiędzy PC a uC poprzez Konwerter USB-UART w c++

mintek 06 Lis 2014 20:21 1128 4
  • #1 06 Lis 2014 20:21
    mintek
    Poziom 2  

    Witam

    Próbuję napisać w c++ program do komunikacji z moim mikroprocesorem sterującym mostek H. Warto dodać, że w programie Bray Terminal wszystko działa. W uC wgrany jest program odpowiedzialny za komunikację uart. Komunikację podzieloną mam na ramki. Poniżej fragment kodu odpowiadający za sterowanie mostkiem:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Wynika z niego, że aby sterować silnikami trzeba wysłać kolejno ramki:
    -FF (otwarcie komunikacji)
    -0C (zmienna ADDRESS)
    -20 (ramka odpowiadająca za sterowanie mostkiem)
    - 8 znaków konwertowanych na wartość dla silników
    - 0A (ramka kończąca komunikację)

    W c++ napisałem program, który powinien wysyłać opisane wcześniej ramki poprzez port usb. Dane są konwertowane przez konwerter USB-Uart i dostarczane do uC. Kod w c++ wygląda następująco:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Chciałbym dodać, że w programie Bray terminal wysłanie ciągu danych $FF$0C$2000000000$0A powoduje założone sterowanie silnikami. Oznacza to, że problem nie tkwi w uC, tylko w programie w c++. Dodatkowo przy wysyłaniu danych w c++, na płytce zapala się dioda informująca o przesyle danych oraz nie ma żadnych błędów, co oznacza że port został dobrze skonfigurowany. Według mnie problemem są wysyłane dane, które mają zły format. Jednak próbowałem już wielu możliwości, wysyłałem ramki "0xFF", wysyłałem w całości, znak po znaku. Byłbym wdzięczny za jakiekolwiek rady.

    0 4
  • #2 06 Lis 2014 20:37
    vonar
    Poziom 28  

    W mikrokontrolerze odbierasz dane binarne, a z PC wysyłasz ASCII...

    0
  • #3 06 Lis 2014 20:49
    witoldwitoldowicz
    Poziom 28  

    Dziwne ze createfile działa ja musze robić "\\\\.\\COM3", te wszystkie "\n\r" też dziwne przeważnie jest "\r\n" a jeżeli potrzebne jest 0x0a to wystarczy "\n".

    0
  • #4 06 Lis 2014 20:57
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak, jak wyżej napisał vonar: zamiast wysłać jeden bajt o wartości 0xff, wysyłasz cztery znaki "0xff". Twoja ramka powinna mieć postać:

    uint8_t buf[] = {0xff, 0xc, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0xa};

    A wysyłanie:
    WriteFile(hPort, buf, sizeof(buf), &byteswritten, NULL);

    0
  • #5 07 Lis 2014 10:01
    mintek
    Poziom 2  

    Niestety po wpisaniu podanych przez BlueDraco komend efektów dalej nie widać.

    [edit]
    Dobra udało się. :D Wartości heksadecymalne trzeba było wysyłać tak jak napisał BlueDraco, jednak pojedyncze znaki powinny być w kodzie ascii.
    Dzięki za pomoc.

    0