Wątek przeniesiony 2014-10-22 12:06 z C/C++ przez ŁF.

Wyswietlanie liczby hexadecymalnej (FF)

0

Witam życzliwych forumowiczów.

Nie potrafię wyświetlić w label, RichEdit, liczby hexadecymalnej

Mam taką zmienną

char    Buffer_I[cbInQueue]; 

W niej zapisywany jest znak hexadecymalnie FF

Chce wyświetlić teraz tą zmienną w Label i RichEdit.
Próbuję wyświetlić to tak.

Label1->Caption=Buffer_I;
RichEdit1->Text = Buffer_I;

Gdy do zmiennej wpisze np test to się wyświetli prawidłowo.

Co może być przyczyną.

0

Przekonwertuj pierw do stringa za pomocą sprintf lub stringstream

Twój kod nie bardzo ma sens, Buffer_I jest tablicą, w jaki sposób zapisujesz tam 0xFF?

0

Wpisuję w Terminalu v 1.9 $FF

Następnie kod który jest odpowiedzialny z pobieranie danych z rs umieszcza to w zmiennej Buffer_I

Coś jednak nie jest tak.

W terminalu przesyłam liczbę w formie HEX np: FA 12 02 itd
Te liczny trafiają do bufora Buffer_I.

I teraz nie wiem czy są w formie HEX czy ASCII
Nie potrafię tego wyświetlić.

0

odpalasz debuger i sprawdzasz.

0

Z tym debugerem to za bardzo nie wiem jak wyszukać.

0

O google też za bardzo nie wiesz?

Buffer_I[Indeks_Po_Ostatnim_Zapisanym_Znaku]=0;
Label1->Caption=AnsiString(Buffer_I);
RichEdit1->Text=Label1->Caption;
0

Dzięki za odpowiedz.

Niestety nie pomogło.
W załączniku przesyłam fotkę z wynikiem.
Po naciśnięciu wyślij HEX wysyłam zapytanie, w odpowiedzi dostaje ramkę hex który trafia do Buffer_I

0

Ja widzę że działa prawidłowo, może wyjaśnisz jak i co wpisujesz do Buffer_I i co spodziewasz się zobaczyć?

0

W załączniku rozpisałem jak chciałbym żeby działał.

Wysyłam char hex[8] = {0x01,0x03,0x00,0x00,0x00,0x03,0x05,0xCB};

A chciałbym dostać 01 03 06 00 00 00 19 00 F1 31 36

0

To musisz skonwertować do takiej postaci:

var Str:String;
var I:Integer;
...
 SetLength(Str,0);
for I:=0 to 7 do Str:=Str+Format('%0.2X ',[Ord(Buffer_I[I])]);
Label1->Caption=Trim(Str);
0

Zrobiłem coś takiego ale wywala błąd w C++ Builder

    String Str;
	int i;
	Str.SetLength(0);

	for(int i = 0; i < 7 ; i++)
	{
	   Str = Format('%0.2X ',[Ord(Buffer_I[I])]);
	}
	Label1->Caption=Trim(Str);
0

Zapomniałem że to Builder i napisałem w pascalu.

    AnsiString Str;
    for(int i=0;i<7;++i) Str+=Format("%0.2X ",Buffer_I[I]);
    Label1->Caption=Trim(Str);
0

Dziękuje za pomoc

Niestety kompilator wywala 2 błedy

E2129 Character constant too long (or empty) 
E2285 Could not find a match for 'Format(unsigned int,char)

Jutro będe szukał rozwiązania.
Pozdrawiam
I jeszcze raz bardzo dziękuje.

dodanie znacznika <code> - @furious programming

0

Za późna pora, mają być podwójne cudzysłowy (poprawiłem), a skoro tego nie skojarzyłeś z tych błędów, to masz dobrą radę: - odpuść sobie ten projekt (przynajmniej na razie) i zacznij od podstaw C++

0

Niestety taki jest koszt korzystania z różnego rodzaju forum.
Za nim uzyskasz odpowiedz w mniejszym lub większym stopniu musisz zapłacić frycowe w postaci komentarzy jaki to jesteś beznadziejny i słaby.

Pomimo tych drobnych niedogodności jestem wdzięczny wszystkim życzliwym ludziom którzy są ostatnią deską ratunku gdy cały Internet zawodzi.

Aha błąd dalej wywala.

2

Skoro nadal wywala błąd to pokaż kod, albo zgłoś się na forum wróżbitów.

0
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "mojrs.h"
#include <string.h>
#include <stdio.h>
#include <iostream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define cbOutQueue 16          //rozmiar bufora danych wyjściowych
#define cbInQueue  16          //rozmiar bufora danych wejściowych
TForm3 *Form3;
// Add these global variables
	char    Buffer_O[cbOutQueue]; // bufor danych wyjściowych
	char    Buffer_I[cbInQueue]; // bufor danych wejściowych
	DWORD   Number_Bytes_Read; // liczba bajtów do czytania
	AnsiString Str;
	int I;
String pp;
static DCB dcb;
HANDLE hComm;
char lpBuffor_read[33], lpBuffor_write[33];
DWORD RS_ile;
bool abContinue = true;
int isRead = false;
bool CommFlag;
	DWORD   fdwEvtMask;    // informacja o aktualnym stanie transmisji
    COMSTAT Stat;             // dodatkowa informacja o zasobach portu
	DWORD   Errors;           // reprezentuje typ ewentualnego błędu
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
	: TForm(Owner)
{
}

int __fastcall Read_Comm(HANDLE hComm,
                         LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
{
    DWORD nNumberOfBytesToRead;

	ClearCommError(hComm, &Errors ,&Stat);

    if (Stat.cbInQue > 0)
      {
        if (Stat.cbInQue > Buf_Size)
            nNumberOfBytesToRead = Buf_Size;
          else
            nNumberOfBytesToRead = Stat.cbInQue;

		ReadFile(hComm, &Buffer_I[0], nNumberOfBytesToRead,
                 lpNumberOfBytesRead, NULL);
      }
      else
        *lpNumberOfBytesRead = 0;
    return TRUE;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	hComm = CreateFile( "COM2",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);

			dcb.DCBlength = sizeof( dcb );

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

            dcb.fDtrControl = DTR_CONTROL_ENABLE;
            dcb.fRtsControl = DTR_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;

			 if( SetCommState( hComm, & dcb ) ) MessageBox( NULL, "Udało się połączyć z portem COM1", "Inf", MB_ICONINFORMATION );
            else MessageBox( NULL, "Nie udało się połączyć z portem COM1", "Błąd", MB_ICONERROR );

if (hComm == INVALID_HANDLE_VALUE) {
		RichEdit1->Lines->Add("Could not open comm port.");
		return;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{


	//unsigned char hexx[6]={0x01,0x01,0x00,0x13,0x00,0x25};
	const char hexx[]="\x01\x01\x00\x13\x00\x25";
	char hex[8] = {0x01,0x03,0x00,0x00,0x00,0x03,0x05,0xCB};
	char hexo[6] = { '2', '5', '8' };
	AnsiString S2(hexo);
	//char hex[3]= "\x01\x03\x06";
	//strcpy(lpBuffor_write, &hex[3]);// Niech to będzie przykładowe polecenie dla urządzenia
	//WriteFile(hComm, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);
	WriteFile(hComm, hex, sizeof hex, &RS_ile, 0);





}
//---------------------------------------------------------------------------

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;
		}

	}


}
//---------------------------------------------------------------------------

void __fastcall TForm3::Button4Click(TObject *Sender)
{
	Label1->Caption=ReadFile(hComm, lpBuffor_read, 15, &RS_ile, NULL);
}
//---------------------------------------------------------------------------

void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
	//Write_Comm(hCommDev, strlen(Buffer_O));
	  Sleep(100);
	  //Beep();
	  FlushFileBuffers(hComm);
	  Read_Comm(hComm, &Number_Bytes_Read, sizeof(Buffer_I));
	  if (Number_Bytes_Read > 0)

      for(int i=0;i<7;++i) Str+=Format("%0.2X ",Buffer_I[I]);
	  Label1->Caption=Trim(Str);

		// RichEdit1->Text = Buffer_I;
		 //Edit1->Text = Buffer_I[1];
		// Edit1->Text = S2;
		 //Label1->Caption=sizeof(Buffer_I);
		// Label1->Caption + IntToHex(Buffer_I,2);
		 //Buffer_I[17]=0;
		 //Label1->Caption=AnsiString(Buffer_I);
		// RichEdit1->Text=Label1->Caption;


		 //Label2->Caption=S2;

}
//---------------------------------------------------------------------------

 

W

void __fastcall TForm3::Button2Click(TObject *Sender)

wysyłam ramkę do RS232, a w

void __fastcall TForm3::Timer1Timer(TObject *Sender)

chcę pobrac dane z Buffer_I i wświetlić w formie hexadecymalnej np Label.

dodanie znaczników <code class="cpp"> - @furious programming

0

W okolicach timer'a masz błąd wynikający z tego że absolutnie nie wiesz co robisz:

if(Number_Bytes_Read>0)
  {
    AnsiString Str;
    for(int i=0;i<Number_Bytes_Read;++i) Str+=Format("%0.2X ",Buffer_I[i]);
    Label1->Caption=Label1->Caption+Str;
  }

Już chyba to mówiłem, ten projekt cię przerasta, zacznij od podstaw.

0

Podstawowy kurs programowania C++ zaczynam od stycznia.

0

Zostawiłem rozwiązanie z wyświetlaniem wyniku w postaci HEXadesymalnie w Label, Najwyraźniej jest z tym duży problem.

Zrobiłem to inaczej.

 void __fastcall TForm3::Button5Click(TObject *Sender)
{
	 FILE *f = fopen("plik.txt", "w");
	 fprintf(f, "%0.2X,", Buffer_I[0]);
	 fprintf(f, "%0.2X,", Buffer_I[1]);
	 fprintf(f, "%0.2X,", Buffer_I[2]);
	 fprintf(f, "%0.2X,", Buffer_I[3]);
	 fprintf(f, "%0.2X,", Buffer_I[4]);
	 fprintf(f, "%0.2X,", Buffer_I[5]);
	 fprintf(f, "%0.2X,", Buffer_I[6]);
	 fprintf(f, "%0.2X,", Buffer_I[7]);
	 fprintf(f, "%0.2X,", Buffer_I[8]);
	 fprintf(f, "%0.2X,", Buffer_I[9]);
	 fprintf(f, "%0.2X,", Buffer_I[10]);
	 fprintf(f, "%0.2X,", Buffer_I[11]);
	 fclose(f);
}

W pliku dostaję

01,03,06,00,00,00,23,00,FFFFFFEA,51,30,00, 

Prawie dobrze.
Tylko nie wiem skąd te FFFFFF.

1

To wartość ujemna, zmień typ na unsigned char
Odłóż ten projekt, jeszcze nie jest na twoi możliwości.

0

Dziękuje.

To pomogło.

0

Zostawię jak tylko zamienię otrzymane liczny na dziesiętne.

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