[c++] Komunikacja przez RS-232

Wszystko co dotyczy tworzenia i optymalizacji stron internetowych oraz programowania
krolas

Użytkownik
Posty: 1
Rejestracja: 31 lip 2011, 22:35

[c++] Komunikacja przez RS-232

Post31 lip 2011, 22:42

Witajcie!

Znalazłam na tej stronie artykuł: http://www.hotfix.pl/c-c++-winapi-komun ... 2-a334.htm
Bardzo przydatny. Nawiązałem łączność z portem ale dalej z funkcją ReadFile dzieje się coś dziwnego. Używam DevC++ oraz Qt Creatora. I tu i tu program się kompiluje, w devie nie ma odzewu (program staje) a w Qt zawiesza się na samym początku. Co może być nie tak?

Próbowałem nawet zewrzeć piny 2 z 3 i 7 z 8 ale nie sądzę żeby to miało znaczenie, przecież jakiś rejestr do, którego trafiają odebrane informacje istnieje cały czas a ReadFile sprawdzam jedynie co w nim jest.

Proszę o wskazówki.
Pozdrawiam.

Awatar użytkownika
cosik_ktosik

Administrator
Posty: 21399
Rejestracja: 13 lis 2008, 01:17
Lokalizacja: Szczecin
Kontaktowanie:

[c++] Komunikacja przez RS-232

Post02 sie 2011, 00:04

A urządzenie nie trzeba zainicjować jakimś poleceniem? Zazwyczaj trzeba najpierw wysłać komunikat o np zwracanie wyników.
Hotfix
Pozdrawiam, cosik_ktosik :)

ALN

Użytkownik
Posty: 1
Rejestracja: 06 lip 2012, 15:21

[c++] Komunikacja przez RS-232

Post06 lip 2012, 17:18

Witam, też próbuje połączyć się przez RS232 na podstawie kody z tego artykułu. Napisałem taki kodzik i nie moge połączyć się przez port szeregowy:

Kod: Zaznacz cały

#include <windows.h>
#include <stdio.h>

static DCB dcb;
static HANDLE hNumPort;
static char lpBuffor_read[33], lpBuffor_write[33];
static DWORD RS_ile;

int WINAPI WinMain  (HINSTANCE hInstance               //petla glówna
                     ,HINSTANCE hPrevInstance
                     ,LPSTR lpCmdLine
                     ,int nCmdShow)
{
    hNumPort = CreateFile("COM10", GENERIC_WRITE |
    GENERIC_READ, 0, NULL,
    OPEN_EXISTING, 0, NULL);

    dcb.DCBlength = sizeof(dcb);

    dcb.BaudRate = CBR_9600;
    dcb.fParity = TRUE;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.ByteSize = 8;

    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;

    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fAbortOnError = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fErrorChar = FALSE;
    dcb.fNull = FALSE;

    printf("conected = %i",SetCommState(hNumPort, &dcb));

    strcpy(lpBuffor_write, "QWERTY");
    WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);

    CloseHandle(hNumPort);
    return (0);
}


Za pomocą Putty mogę bez problemu połączyć się u urządzeniem.
Ustawienia Putty:
Obrazek

Proszę o wskazówki gdzie mogłem zrobić błąd :)
Pozdrawiam.

Awatar użytkownika
cosik_ktosik

Administrator
Posty: 21399
Rejestracja: 13 lis 2008, 01:17
Lokalizacja: Szczecin
Kontaktowanie:

[c++] Komunikacja przez RS-232

Post07 lip 2012, 22:56

Co zwraca
printf("conected = %i",SetCommState(hNumPort, &dcb));
Hotfix
Pozdrawiam, cosik_ktosik :)

martkotek

Użytkownik
Posty: 1
Rejestracja: 21 sty 2014, 13:22

[c++] Komunikacja przez RS-232

Post23 sty 2014, 13:36

odgrzeję nieco stary temat. Też działam według opisu w tutorialu ale mam problem. Niby udaje mi się podłączyć do urządzenia ale nie jestem w stanie od niego uzyskać żadnej odpowiedzi...

taki kodzik stworzyłem na podstawie poradnika:

#include <windows.h>
#include <stdio.h>

static DCB dcb; //struktura DCB (Device Control Block) definiująca rodzaj połączenia
static HANDLE hNumPort; //uchwyt do otwartego portu
static char lpBuffor_read[1024], lpBuffor_write[512]; // tablice z danymi odbieranymi oraz wysyłanymi
static DWORD RS_ile; // zmienna trzymająca informację ile czego wysyłamy lub czytamy

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{
/*
///////////////////// TYMCZASOWE WYPELNIENIE TABLICY ODEBRANYCH ///////////////////////////
lpBuffor_read[0]=0;
lpBuffor_read[1]=1;
lpBuffor_read[2]=2;
lpBuffor_read[3]=3;
lpBuffor_read[4]=4;
lpBuffor_read[5]=5;
lpBuffor_read[6]=6;
lpBuffor_read[7]=7;
lpBuffor_read[8]=8;
lpBuffor_read[9]=9;
lpBuffor_read[10]=0;
lpBuffor_read[11]=1;
lpBuffor_read[12]=2;
lpBuffor_read[13]=3;
/////////////////////////////////////////////////////////////////////////////////////////////////
*/

hNumPort = CreateFile("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

dcb.DCBlength = sizeof(dcb);
SetCommState(hNumPort, &dcb); //nawiązanie połączenia
//rozmiar kolejki
//czyszczenie portu
//czasy oczekiwania
dcb.XonChar = 0x11;
dcb.XoffChar = 0x13;
dcb.XonLim = 256;
dcb.XoffLim = 256;
dcb.BaudRate = CBR_9600; // prędkość transmisji, CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600
dcb.fRtsControl = RTS_CONTROL_DISABLE; //Kontrola linii RTS: RTS_CONTROL_DISABLE (sygnał nieaktywny), RTS_CONTROL_ENABLE (sygnał aktywny), RTS_CONTROL_HANDSHAKE
dcb.fDtrControl = DTR_CONTROL_ENABLE; //Kontrola linii DTR: DTR_CONTROL_DISABLE (sygnał nieaktywny), DTR_CONTROL_ENABLE (sygnał aktywny), DTR_CONTROL_HANDSHAKE
dcb.ByteSize = 8; //Liczba bitów wysyłanych/odebranych danych (UWAGA wartościod 5 do 8)
dcb.StopBits = ONESTOPBIT; // Ustawienie bitu stopu: ONESTOPBIT (jeden bit), TWOSTOPBITS (dwa bity)
dcb.fParity = FALSE; //TRUE jeśli ustawiamy poprzednia opcję dla sprawdzenia parzystości
dcb.Parity = NOPARITY; //Ustawienie parzystości: EVENPARITY (parzysta), MARKPARITY (bit parzystości 1), NOPARITY (bez bitu parzystości), ODDPARITY (nieparzysta)
dcb.EofChar = 0x1A;
dcb.fErrorChar = 0x00;
dcb.fTXContinueOnXoff = TRUE;
//breake
//event



dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDsrSensitivity = FALSE;
dcb.fAbortOnError = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;

dcb.fNull = FALSE;








/////////////////////// sprawdzenie poprawnosci połączenia /////////////////////////////
if (SetCommState(hNumPort, &dcb) == FALSE)
{printf("Nie udało się nawiązać połączenia");
}
else
{printf("Nawiazalem polaczenie z portem \n");
}
///////////////////////////////////////////////////////////////////////////////////////////


// printf("conected = %i",SetCommState(hNumPort, &dcb));


strcpy(lpBuffor_write, "01#TG#");// Przykładowe polecenie dla urządzenia
WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);

strcpy(lpBuffor_write, "01#TG#");// Przykładowe polecenie dla urządzenia
WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);



// scanf("%32s", lpBuffor_read);

ReadFile(hNumPort, lpBuffor_read, 15, &RS_ile, 0); //odczytanie

//////////////////////////////// OPERACJA NA PLIKU /////////////////////////////////////
FILE *f = fopen("plik.txt", "w");

for(int i = 13; i <17 ; i ++)
{
if (i==14)
{
fprintf(f, "%d,", lpBuffor_read[i]);
}
else
{
fprintf(f, "%d", lpBuffor_read[i]);
}
}
fclose(f);
////////////////////////////////////////////////////////////////////////////////////////////////

CloseHandle(hNumPort); //zamknięcie połączenia

return (0);
}


efekt jest taki, że udaje się wysłać komendę (sprawdzone programem podsłuchującym komunikacje po rs232 ale nie uzyskuję żadnej odpowiedzi. Zrobiłem coś źle?



  • Reklama

Wróć do „Webmastering i programowanie”



Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości