logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

mintek 06 Lis 2014 20:21 1671 4
REKLAMA
  • #1 14108188
    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: text
    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: text
    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.
  • REKLAMA
  • #2 14108268
    vonar
    Poziom 28  
    W mikrokontrolerze odbierasz dane binarne, a z PC wysyłasz ASCII...
  • REKLAMA
  • #3 14108337
    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".
  • REKLAMA
  • #4 14108379
    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);
  • #5 14109333
    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.
REKLAMA