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.
[c++] Komunikacja przez RS-232
- cosik_ktosik
- Posty: 21399
- Rejestracja: 13 lis 2008, 01:17
- Lokalizacja: Szczecin
- Kontaktowanie:
[c++] Komunikacja przez RS-232
A urządzenie nie trzeba zainicjować jakimś poleceniem? Zazwyczaj trzeba najpierw wysłać komunikat o np zwracanie wyników.
Hotfix
Pozdrawiam, cosik_ktosik
Pozdrawiam, cosik_ktosik
-
- Posty: 1
- Rejestracja: 06 lip 2012, 15:21
[c++] Komunikacja przez RS-232
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:
Za pomocą Putty mogę bez problemu połączyć się u urządzeniem.
Ustawienia Putty:
Proszę o wskazówki gdzie mogłem zrobić błąd
Pozdrawiam.
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:
Proszę o wskazówki gdzie mogłem zrobić błąd
Pozdrawiam.
- cosik_ktosik
- Posty: 21399
- Rejestracja: 13 lis 2008, 01:17
- Lokalizacja: Szczecin
- Kontaktowanie:
[c++] Komunikacja przez RS-232
Co zwraca
printf("conected = %i",SetCommState(hNumPort, &dcb));
printf("conected = %i",SetCommState(hNumPort, &dcb));
Hotfix
Pozdrawiam, cosik_ktosik
Pozdrawiam, cosik_ktosik
-
- Posty: 1
- Rejestracja: 21 sty 2014, 13:22
[c++] Komunikacja przez RS-232
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?
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