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.

Wysyłanie łańcucha znaków do urządzenia [C++]

antyterrorysta 22 Maj 2010 21:07 1305 5
  • #1 22 Maj 2010 21:07
    antyterrorysta
    Poziom 8  

    Steruję urządzeniem przez RS232 HyperTerminal'em. Dla przykładu wpisując np. "FF portb =" i zatwierdzając klawiszem enter urządzenie poprawnie reaguje.

    Chciałbym jednak obsługiwać to urządzenie aplikacją napisaną w C++. Jak więc zaimplementować tę komendę ("FF portb =") w C++, jeśli poniższy kod nie daje pozytywnych efektów?

    Code:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            TransmitCommChar(hCommDev, 'F');
            TransmitCommChar(hCommDev, 'F');
            TransmitCommChar(hCommDev, ' ');
            TransmitCommChar(hCommDev, 'p');
            TransmitCommChar(hCommDev, 'o');
            TransmitCommChar(hCommDev, 'r');
            TransmitCommChar(hCommDev, 't');
            TransmitCommChar(hCommDev, 'b';
            TransmitCommChar(hCommDev, ' ');
            TransmitCommChar(hCommDev, '=');
    }

    0 5
  • #2 22 Maj 2010 22:02
    McMonster
    Poziom 32  

    Bo nie wysyłasz kodu ENTER. Spróbuj tak:

    Code:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    
    {
            char komenda[] = "FF portb =\n";
            for(int i = 0; i < sizeof(komenda)/sizeof(char); i++)
                    TransmitCommChar(hCommDev, komenda[i]);
    }


    Dodałem też małe usprawnienie, deklarowana jest tablica znaków, inicjalizowana twoją komendą, a "\n" to wbrew pozorom jeden znak oznaczający nową linię, a potem dla każdy znak z osobna z tablicy jest przesyłany. Fragment sizeof(komenda)/sizeof(char) to rozmiar całej tablicy w bajtach podzielony przez rozmiar jednego znaku, czyli długość komendy. Nie jestem pewien, czy będzie działać, ale chyba powinno.

    0
  • #3 28 Maj 2010 18:59
    antyterrorysta
    Poziom 8  

    Przepraszam, że tak późno odpowiadam, ale nie miałem do tej pory dostępu do urządzenia... Niestety powyższy kod nie działa.

    0
  • #4 29 Maj 2010 23:07
    KwoiteK
    Poziom 16  

    Witam

    Odnośnie przykładu McMonster

    Code:

    sizeof(komenda)
    zwraca 12 (zero konczące tablice znaków tez jest liczone) wiec program wyśle jeszcze niepotrzebnie 0.

    Zamiast
    Code:

    for(int i = 0; i < sizeof(komenda)/sizeof(char); i++)


    należy wpisać
    Code:

    for(int i = 0; i < strlen(komenda); i++)
     


    Poza tym na końcu komendy należny dać \r zamiast \n. Enter w terminalu ma kod 0x0D a to własnie \r.

    Pozdrawiam

    0
  • #5 30 Maj 2010 00:35
    antyterrorysta
    Poziom 8  

    Niestety nadal jest bez zmian... :(

    0
  • #6 30 Maj 2010 01:32
    GSM
    Poziom 25  

    Witam,

    czy aby na pewno port został otwarty, odpowiedni port? Odpowiednio skonfigurowany, ustawiona odpowiednia prędkość?
    Czy w ogóle cokolwiek "wychodzi" z komputera?
    Stara metoda na sprawdzenie czy urządzenie dobrze wysyła - zewrzeć TxD z RxD i odebranie bufora po wysłaniu tego co chcieliśmy wysłać a następnie porównanie odebranych bajtów z wysłanymi.

    Pozdrawiam,
    GSM

    0