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 PC z uC przez RS232

Wojtek44 10 Mar 2007 23:13 4532 14
  • #1 10 Mar 2007 23:13
    Wojtek44
    Poziom 27  

    Witam

    Na PC piszę program w Delphi i do komunikacji przez RS232 używam komponentu CPort (ComPort). Gdy przesyłam do uC tzw. "znaki sterujące" ( kody od 0 do 32) to dzieją się dziwne rzeczy np. przed znak nr. 13 wstawiany jest znak nr. 10 itp.
    Chcę to wyłączyć aby uC odbierał takie znaki jak ja wysyłam z PC i odwrotnie. Jak to zrobić?

    Wojtek

    0 14
  • #2 10 Mar 2007 23:32
    markosik20
    Poziom 33  

    Zmienić program w uC :)

    0
  • #3 10 Mar 2007 23:57
    tzok
    Moderator Samochody

    10 13 to Enter (CR+LF)... z innymi znakami też dzieją się "dziwne rzeczy"? Jeśli tak - to jakie?

    0
  • #4 11 Mar 2007 00:13
    Wojtek44
    Poziom 27  

    Wysłałem znaki od 0 do 255 z PC do uC i to co odebrał uC wygląda tak ,że przed 13 jest wstawiana 10 ,potem brak całkiem znaku 15 (albo 14) nie wiem teraz dokładnie.
    O ile znaki nr 10 mogę wycinać przed 13 to jeśli jakiegoś znaku całkiem mi brakuje to co mam zrobić?

    0
  • #5 11 Mar 2007 09:46
    mirekk36
    Poziom 42  

    z tego co piszesz to masz w ogóle jakąś sieczkę. Żeby jakoś dojść do ładu sprawdź najpierw czy działa ci w pełni poprawnie przy jednej założonę prędkości baudrate - transmisja np taka, że wysyłasz z delphi string np: 'test'+#13+#10

    zrób to w jedną i w drugą stronę i sprawdź czy zawsze masz takie same wyniki. Jeśli nie to posprawdzaj najpierw czy masz prawidłowo zaprogramowany procek, fusebity, baudrate itp

    albo program w procku, który to odbiera oraz sam kod w delphi bo tam też możesz mieć jakiegoś babola.

    Ja od dawna gdy coś na szybko potrzebuję zrobić to korzystam w Delphi z ComPort'a a transmisję do uC robię na zwykłym RS232 albo do magistrali RS485 na własnych ramkach i wszystko działa pięknie. Wiadomo - na początku jednak trzeba przejść troszkę aby to pouruchamiać.... jednak za mało podajesz informacji jak już zwracali uwagę wyżej koledzy.... wiemy tylko, że dzieję ci się dziwne rzeczy i że wcina ci jakieś znaki przed 13. A co to znaczy? - skoro wysyłasz po kolei znaki od 0 do 255 to skąd biorą ci się te 13 ??? a przed nimi 10 ??? czy wysyłając każdy znak wystawiasz po nim 13 i 10 czy jak - opisz to dokłdniej jeśli chcesz aby ktoś ci pomógł

    pozdrówka

    0
  • #6 11 Mar 2007 11:23
    Wojtek44
    Poziom 27  

    Objaśniam dokładnie:
    Mój program na uC ('51) jest napisany poprawnie - odbiera wszystkie znaki jakie wysyła PC.

    Program na PC też jest napisany poprawnie : wszystkie "teksty" przesyłane są poprawnie.

    Tylko protokół RS232 przewiduje znaki sterujące transmisją - są to znaki zamieszczone poniżej.

    One działają w nadajniku (u mnie PC) i korygują transmisję :
    - przed znak 13 wstawiany jest znak 10
    - po znaku 14 następne nie są wysyłane aż pojawi się 15
    - i inne, których jeszcze nie odkryłem ale pewnie są

    to nie jest błąd tak działają te znaki ja chcę się dowiedzieć jak to wyłączyć.

    Przy wysyłaniu tekstu - znaki od 48 w górę nie ma to znaczenia i wszystko działa poprawnie ala ja chcę przesyłać dane z całego zakresu od 0 do 255.

    Robię to teraz tak ,że liczby zamieniam na hex i zamiast wysyłać znak 13 wysyłam dwa bajty :
    - "1" czyli znak 49
    - "3" czyli znak 51

    zamiast znaku np.62
    - "3" i "F"
    to działa ale ja mam tych danych bardzo dużo i chciałbym wysyłać jedną liczbę jako jeden znak ( a nie jako dwa) - będzie 2x szybciej.

    0
  • #7 11 Mar 2007 13:53
    mirekk36
    Poziom 42  

    a no dobrze ale zaraz zaraz - o czym ty mówisz - to ty napisałeś ten nadajnik? czy korzystasz z jakiegoś gotowca? - bo nie rozumiem tego....

    jeśli się samemu pisze transmisję i masz wyłączoną kontrolę przepływu (tak warto zrobić) to kto albo co zamienia ci te znaki???? że chcesz się tego pozbyć?

    przecież używając ComPort w Delphi piszesz :

    ComPort.WriteStr('aaaa');

    albo jeśli chcesz przesłać dowolny kod to piszesz:

    ComPort.WriteStr(Chr(4)); przesyłasz znak o kodzie 4

    ComPort.WriteStr(Chr(17)); kod nr 17 itd itp

    dlatego nie rozumiem o jakiej zamianie znaków ty piszesz - to wygląda tak jakbyś nie robił tego ty "ręcznie" tak jak pokazałem powyżej tylko jakbyś korzystał z jakiegoś nadajnika w jakimś tam standardzie na dodatek z kontrolą softwarową przepływu - gdzie wtedy rzeczywiście będziesz miał takie niechciane dziwolągi.

    a widzisz chyba po tych przykładach, że wysyłanie w kodzie jest za pomocą tego komponentu poprostu banalne

    chyba, że jeszcze o coś innego ci chodzi

    pozdrówka

    0
  • #8 11 Mar 2007 14:41
    Wojtek44
    Poziom 27  

    mirekk36
    Korzystam z ComPort ( co napisałem już wyżej )

    Jeśli napiszę : ComPort.WriteStr('aaaa'); - to działa ( co napisałem już wyżej ) - odbiornik dostanie aaaa

    gdy napiszę ComPort.WriteStr(Chr(4)); to odbiornik dostanie znak 4 - OK

    gdy napiszę ComPort.WriteStr(Chr(17)); odbiornik dostanie znak 17 - ok

    ale gdy napiszę ComPort.WriteStr(Chr(13)); to odbiornik otrzyma najpierw znak 10 a dopiero następny będzie 13.

    Napisz mi czy SPRAWDZIŁEŚ ,że wszystkie znaki są wysyłane prawidłowo czy WYDAJE Ci się ,że powinno tak być.

    Piszesz o wyłączaniu kontroli przepływu - co masz na myśli ?
    Ja używam ComPort bez żadnych dodatkowych ustawień (nic nie zmieniałem) może w tym problem ?
    Tylko co zmienić ?

    0
  • #9 11 Mar 2007 15:29
    Whisperjet
    Poziom 1  

    A czy przypadkiem nie ma w tym komponencie czegoś zbliżonego do emulacji terminala? W końcu jest ich trochę - VT, Xtetm, BBS ANSI itd. O ile pamiętam, to różnica jest w wysyłanych kodach sterujących. Tak więc jeśli wysyłasz #13, to komponent może pomyśleć tak: wysyłamy #13 czyli enter, ale dla emulacji takiego terminala muszę to zamienić na #10#13.

    0
  • #10 11 Mar 2007 16:31
    mirekk36
    Poziom 42  

    nooo widzisz teraz już jeseśmy prawie w domu - o takie wyjaśnienia z twojej strony mi chodziło ....

    najpierw jak powinno być: czyli jak napiszę:
    ComPort.WriteStr(Chr(13));

    to na wybrany port COM nie może wylecieć nic innego niż 13 - i tu dotykamy sedna sprawy ;)

    czy masz ustawionego w ten sposób?:
    Komunikacja PC z uC przez RS232

    Komunikacja PC z uC przez RS232

    poza tym jakiej wersji ComPort używasz napisz ok?

    gwarantuję ci, że nie ma prawa nic po drodze zmieniać wysyłanych w ten wyżej opisany sposób wysyłanych znaków - ComPort sam nie myśli - robi to co mu każemy ...

    chyba, że masz jeszcze po drodze jakiś monitor COMa włączony, który dokonuje jakiegoś szachrajstwa ale wątpię w to

    pozdrawiam

    0
  • #11 11 Mar 2007 17:08
    Wojtek44
    Poziom 27  

    Setup mam identycznie (tylko inna prędkość)

    Object Inspector zamieszczam i zamieszczam widok tego mojego komponentu na pasku.
    ComPort jest w wersji 3.0 natomiast to zaznaczone na czerwono to jest jakiś Com Terminal ale ja z tego nie korzystam (przynajmniej nie świadomie).

    0
  • #12 11 Mar 2007 17:26
    mirekk36
    Poziom 42  

    hmmm czyli wygląda na to, że wersje mamy takie same, ustawienia ComPort'a takie same - to że nie używasz w tym przypadku comprotowego terminala to ok - w takim razie jest to jakaś albo dziwna zagadka albo trzeba dalej szukać ;)

    .... tak z czystej ciekawości czy jesteś w stanie przetestować to sobie na takiej prędkości jak 9600 ???

    poza tym czy jesteś pewien (myślę ża tak - ale tonący brzytwy się chwyta) , że twój programik w uC odbierający znaki nie robi sobie jakichś jaj ?

    bo tak jak mówię, gdy w delphi położymy ten komponent ComPort i wyślemy za pomocą WriteStr jeden znak o obojętnie jakim kodzie to nie ma bata - musi on właśnie się pojawić po drugiej stronie bez żadnych podmian itp - tak to działa u mnie od zawsze a nie raz nie dwa używam takich procedurek napisanych nawet na szybko w delphi do kontaktowania się ze swoimi prockami .... jak mówię jeszcze gdzieś leży babol ale po tym do czego doszliśmy wydaje się, że nie w twoim programie w delphi. A nie masz włączonego jakiegoś jak pisałem wcześniej tak poza delphi monitora ortu COM czy czegoś co nasłuchuje a może i miesza przy okazji na wyjściu????

    możesz być tylko pewien tego, że jeśli wysyłasz za pomocą writestr i nic innego sam nie narobiłeś dziwnego w kodzie to to musi działać ok więc przyczyny trzeba zacząć szukać gdzie indziej jak pisałem powyżej - co m.inn bym sprawdził na twoim miejscu

    0
  • #13 11 Mar 2007 17:53
    Wojtek44
    Poziom 27  

    Nie będę tego testował na prędkości 9600 bo to się mija z celem.
    Ja nie mam przekłamań jakichś w transmisji.

    Mój programik w uC nie robi jaj bo tam to naprawdę ja tym dyryguję a nie jakieć API.

    Nie odpowiedziałeś na moje pytanie:
    Napisz mi czy SPRAWDZIŁEŚ ,że wszystkie znaki są wysyłane prawidłowo czy WYDAJE Ci się ,że powinno tak być.

    Wojtek

    0
  • #14 11 Mar 2007 18:40
    mirekk36
    Poziom 42  

    ja nie chciałem ci zarzucać przede wszystkim, że zaraz coś źle zrobiłeś w uC - poprostu ja bym to sprawdzał,

    a co do tego czy wszystkie znaki u mnie wysyła ok? - to nic mi się nie WYDAJE, u mnie zawsze jest tak, że gdy wysyłam dowolny kod to po drugiej stronie dokładnie taki odbieram i odwrotnie też to działa bezbłędnie

    a jeśli chodzi o PC to jeśli coś nie wychodzi to też nie można odrazu mówić że to wina jakiegoś tam API , Windy albo samego bila gatesa trzeba tylko umieć nad tym zapanować

    a co do API to równie dobrze możesz to wysyłanie zrobić bez udziału ComPort'a tylko w czystym API napisać prostą obsługę RSa - i sprawdzić jak działa? może wtedy własnie ci się wyjaśni gdzie jest tzw "pies pogrzebany"

    0
  • #15 13 Mar 2007 10:39
    tzok
    Moderator Samochody

    Dlaczego używasz kontrolki ComTerminal a nie ComPort? Pierwszy raz się spotykam z tym komponentem ale odrazu to zauważyłem. ComPort (pierwsza ikonka) przesyła "RAW Data" a ComTerminal (ostatnia ikonka) obsługuje kody sterujące terminala VT100.

    0
  Szukaj w 5mln produktów