RS232 odbieranie danych i wyświetlanie w Label

0

Witam

Mam problem z odbieraniem danych przez RS232.

Przy próbie odbierania danych program się zawiesza i tyle.

void __fastcall TForm3::Button3Click(TObject *Sender)
{
	DWORD BytesRead;

	while(CommFlag) {
		Application->ProcessMessages();

		ReadFile(hComm, lpBuffor_read, 15, &RS_ile, NULL);

		if(RS_ile) {
			lpBuffor_read[BytesRead] = 0;
			Memo1->Text=lpBuffor_read;
			//Label1->Caption=lpBuffor_read[10];
			//Edit1->Text=lpBuffor_read;
		}
	}
}

Będę wdzięczny za jakieś sugestię.

0

Po pierwsze powinieneś użyć debugger'a by się samemu dowiedzieć czemu.
Po drugie nie jest to dziwne w końcu masz nieskończoną pętle w której na dodatek masz wywołanie blokującej funkcji.

0

Jak nie chcesz pomóc, to się nie wypowiadaj debilu.

0

Godzinkę temu zacząłem się wgryzać w temat. Mam odczyt danych z żyroskopu do atmegi i dalej wysyłam to przez RT232RL (przejściówka usb-rs232) do kompa.
Po pierwsze musisz ustawić w atmedze, w menadżerze urządzeń i w programie odbierającym te same parametry RS232 jak na przykład baud rate.
Program wyświetla mi dane w konsoli :)

*http:*www.hotfix.pl/c-c++-winapi-komunikacja-poprzez-port-com-rs-232-a334.htm

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

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

/*
dcb - struktura DCB (Device Control Block) definiująca rodzaj połączenia
hNumPort - uchwyt do otwartego portu
lpBuffor_read, lpBuffor_write - tablice z danymi odbieranymi oraz wysyłanymi
RS_ile - zmienna trzymająca informację ile czego wysyłamy lub czytamy
*/

int main(int argc, char *argv[])
{
string port = "COM2"; //Dla COM20 nie działa.

//Uchwyt do portu COM
hNumPort = CreateFile(port.c_str(), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
//hNumPort = CreateFile("\\\.\COM20", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
//HANDLE hFile = CreateFile("COM2", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);


//Ustawienie parametrów portu COM
dcb.DCBlength = sizeof(dcb);

dcb.BaudRate = CBR_57600;
//dcb.BaudRate = CBR_9600;
dcb.fParity = FALSE;
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;
*/
/*
dcb.BaudRate = CBR_9600; // prędkość transmisji, CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600
dcb.fParity = TRUE; //TRUE jeśli ustawiamy kolejną opcję dla sprawdzenia parzystości
dcb.Parity = EVENPARITY; //Ustawienie parzystości: EVENPARITY (parzysta), MARKPARITY (bit parzystości 1), NOPARITY (bez bitu parzystości), ODDPARITY (nieparzysta)
dcb.StopBits = ONESTOPBIT; // Ustawienie bitu stopu: ONESTOPBIT (jeden bit), TWOSTOPBITS (dwa bity)
dcb.ByteSize = 7; //Liczba bitów wysyłanych/odebranych danych (UWAGA wartościod 5 do 8)

dcb.fDtrControl = DTR_CONTROL_ENABLE; //Kontrola linii DTR: DTR_CONTROL_DISABLE (sygnał nieaktywny), DTR_CONTROL_ENABLE (sygnał aktywny), DTR_CONTROL_HANDSHAKE
dcb.fRtsControl = RTS_CONTROL_ENABLE; //Kontrola linii RTS: RTS_CONTROL_DISABLE (sygnał nieaktywny), RTS_CONTROL_ENABLE (sygnał aktywny), RTS_CONTROL_HANDSHAKE
*/

//Połączenie się z portem COM
if(!SetCommState(hNumPort, &dcb)) cout<<"Nie udalo sie polaczyc z portem "<<port<<endl;
else cout<<"Polaczono z portem "<<port<<endl;

/*
//Pisanie do urządzenia
strcpy(lpBuffor_write, "RES0070002");// Niech to będzie przykładowe polecenie dla urządzenia
WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);
*/

int i = 0;
while(i<10)
{
   //odczytanie 15 znaków
   ReadFile(hNumPort, lpBuffor_read, 15, &RS_ile, 0);
   cout<<RS_ile<<": "<<lpBuffor_read<<endl;
   Sleep(1000);
}



//Zamknięcie portu COM
CloseHandle(hNumPort);
system("PAUSE");
return EXIT_SUCCESS;

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1