TextBox z danymi z rs232

0

W Form1 jest textbox

public: System::Windows::Forms::TextBox^ textBox1;

W momencie otrzymania danych z RS232c chce aby textBox1 wyświetlał te dane

static void DataReceviedHandler(
                        Object^ sender,
                        SerialDataReceivedEventArgs^ e)
    {   
        SerialPort^ sp = (SerialPort^)sender;
	    String^ indata = sp->ReadExisting();
		textBox1->Text = "test";
		
	
        
    }

przy kompilacji
error C2227: left of '->Text' must point to class/struct/union/generic type

musi to mieć miejsce w DataReceviedHandler

0

zapomniałem
// Czytanie danych
serialPort1->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceviedHandler);

0

co to w ogole za pisownia? ^ zamiast * ? wtf?

a tresc bledu sobie przetlumacz a nam daj wiecej kodu.

0

co to w ogole za pisownia? ^ zamiast * ? wtf?

To jest C++\CLI a nie wtf...

@autor - a masz gdzieś zadeklarowanego tego textboxa? Inaczej - czy jest on w zakresie? Jeszcze inaczej - czy takie coś też spowoduje błąd:?

System::Windows::Forms::TextBox^ t = textBox1

Bo myślę że ominąłeś część błędu, a cały brzmi:

must point to class/struct/union/generic type. type is unknown-type

a wcześniej

undeclared identifier

!
Jeśli tak to podałeś zły komunikat, bo to ten był najważniejszy.

Proponowałbym też żebyś wątki z CLI dawał do działu .NET (z C++\CLI jest problem, bo nie wiadomo gdzie go włożyć ;) )

0

w Visual C++ raczej malo kto Ci pomoze. radzilbym szukac w dziale C#, w VC++ bedzie podobnie (z tymi dziwnymi ^ gcnew itp)

0
1>------ Build started: Project: CardReader, Configuration: Debug Win32 ------
1>  CardReader.cpp
1>c:\users\....\documents\visual studio 2010\projects\CardReader\CardReader\Form1.h(219): error C2227: left of '->Text' must point to class/struct/union/generic type
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
        using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
        using namespace System::IO::Ports;
        using namespace System::Threading;

Deklaracje

private: System::Windows::Forms::Button^  button1;
	private: System::Windows::Forms::Button^  button2;
	private: System::Windows::Forms::Button^  button3;
	private: System::Windows::Forms::CheckBox^  checkBox1;
	public: System::Windows::Forms::TextBox^  textBox1;
	private: System::Windows::Forms::TextBox^  textBox2;
	private: System::Windows::Forms::ComboBox^  comboBox1;
	private: System::IO::Ports::SerialPort^  serialPort1;
	private: System::ComponentModel::IContainer^  components;
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				// Create a new SerialPort object with default settings.
                
				
				
				if (serialPort1->IsOpen == false)
                
				{  
				  serialPort1->PortName =  comboBox1->Text;
                  serialPort1->BaudRate = 9600;
                  serialPort1->Parity = Parity::Even;
                  serialPort1->StopBits = StopBits::Two;
                  serialPort1->DataBits = 8;
                  serialPort1->Handshake = Handshake::XOnXOff;

				  // timeouty
                  serialPort1->ReadTimeout = 500;
                  serialPort1->WriteTimeout = 500;

				  // Port Open
                  serialPort1->Open();
				  

				  // Data Read
				  serialPort1->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceviedHandler);
				}
				else 
                {
                   MessageBox::Show("Port już otwarty");

                }
                
				
                                //serialPort1->DiscardInBuffer();
				//serialPort1->DiscardOutBuffer();
				serialPort1->RtsEnable = true;
                serialPort1->RtsEnable = false;
        
			
				
				

				//serialPort1->Close();

			 }


    

     static void DataReceviedHandler(
                        Object^ sender,
                        SerialDataReceivedEventArgs^ e)
    {   
        SerialPort^ sp = (SerialPort^)sender;
	    String^ indata = sp->ReadExisting();

		textBox1->Text = "test"; //bez tej linii kompiluje się
                 // chodzi o to, aby zawsze gdy polecą dane z czytnika, automatycznie pojawiły się w textBox1 w postaci  hex (stringa z wartościami  hex - ATR karty)
		
		
	
        
    }
0

Błąd jest raczej składniowy, a nie związany z .NETem.
Ściślej: kompilator nie wie co to jest textBox1 w tym miejscu.
A co do C# to w nim nie ma żadnych ^ ani gcnew..

UPDATE: DataReceviedHandler (literówka!) zadeklarowałeś jako static

, więc nie może się odwoływać do niestatycznego pola klasy.
0

Coś wykombinuję ...
A czy jest w .net metoda, która zamieni string w postaci ASCII n string w postaci hex ??
p-d

string ??;$?$??00
zamieni na string 3f3f3b243f243f3f3030

0

A czy jest w .net
metoda, która zamieni string w postaci ASCII n string w postaci hex ??

string s = "123";
int i = int.Parse(s);
i.ToString("X");

W C++\CLI może to minimalnie lepiej wyglądać, chwilowo nie mogę uruchomić kompilatora.</quote>

0

@olo16 - prosiłem o pomoc a nie o Twoje zdanie na temat CLI, jak nie masz nic sensownego do napisania to zmień wątek. Reszcie osób serdecznie dziękuję. Okazało się, że wszystkie moje problemy wynikają z faktu że handler przechwytujący dane z bufora zamieniał np FF na 3F. Okazało się że zamiast sp->ReadExisting(); pobierający string trzeba użyć sp->Read(); który pobierze dane do tablicy typu byte

więc proszę o podpowiedź jak zmodyfikować ten kod

static void DataReceviedHandler(
                        Object^ sender,
                        SerialDataReceivedEventArgs^ e)
    {   
        SerialPort^ sp = (SerialPort^)sender;
            String^ indata = sp->ReadExisting();
                textBox1->Text = "test";
               
       
       
    }

na równoważny

static void DataReceviedHandler(
                        Object^ sender,
                        SerialDataReceivedEventArgs^ e)
 
	{           SerialPort^ sp = (SerialPort^)sender;
                byte[]^ data = new byte[sp->BytesToRead]; // tego byte[]^ nie przyjmuje
                sp->Read(data, 0, data->Length);

tyle wymodziłem, ale jak widać nie kompiluje się. Doradzi ktoś ?? Z góry dziękuję

0

Nie ma się co zniechęcać :P

Chwilę mnie nie ma na forum a tu już zarzuty że forum jest "niepoważne" ;)

Problem polega na pewno na tym że OnDataRecivedHandle (czy jakoś tak) jest metodą statyczną. Nie możesz się w niej odwołać do pól klasy.
Usunięcie modyfikatora static jest niestety konieczne, nie wiem jak to wpłynie na resztę twojego proramu :/

0

Wybacz, może pochopne te zarzuty były [green], ale wqr... się czytając te elokwentną wymianę zdań na temat "kto wie lepiej" itd.

static void DataReceviedHandler(
                        Object^ sender,
                        SerialDataReceivedEventArgs^ e)
   
	{   
		 SerialPort^ sp = (SerialPort^)sender;
	         array<Byte> ^data = gcnew array<Byte>(sp->BytesToRead);
                 sp->Read(data, 1, data->Length);
		   
			
    }

Zmieniłem kod i teraz się kompiluje, natomiast nie wiem dlaczego nie działa tak jak tego oczekuję, tzn. nie wczytuje z sp do data. Przypomnę chodzi o to, by za każdym razem jak pojawią się dane na wejściu z RS, handler przechwycił je (tym razem do tablicy typu Byte), by następnie dało się je wyświetlić do textBox1. Z programowaniem mam do czynienia od około 2 miesięcy. Staram się czynić postępy m.in. próbując pisząc takie programy (które na dodatek są mi użyteczne :) )

P.S. Kiedyś przeczytałem w czyimś podpisie cyt." nigdy nie dyskutuj z idiotą, najpierw zrówna Cię do swojego poziomu, by potem pokonać doświadczeniem..."

0

Z C++\CLI jest ten problem że na razie mało osób go zna. Ciężko od niego zaczynać naukę, ale pewnie cię i tak nie zniechęcę ;) Z drugiej strony to zdaniem wielu (w tym moim) to jeden z najbardziej rozbudowanych (najpotężniejszych) języków, a już na pewno na platformie .NET.

Hmm, twój kod wygląda poprawnie. Jedyne co to nie jestem pewien czy nie oczekujesz od niego czegoś czego nie może zrobić ;) Ten kod wczyta, owszem, dane z serialportu do tablicy, ale nie będziesz mógł się do nich odwołać bo tablica jest lokalna. Jeśli chodzi ci o to żeby do data można się było odwoływać w całej klasie zrób z tego zmienną globalną w klasie (jako pole klasy a nie zmienną w metodzie).

Aha, i jeszcze pierwszym argumentem Read powinno być 0.

0
MSM napisał(a)

Z C++\CLI jest ten problem że na razie mało osób go zna. Ciężko od niego zaczynać naukę, ale pewnie cię i tak nie zniechęcę ;) Z drugiej strony to zdaniem wielu (w tym moim) to jeden z najbardziej rozbudowanych (najpotężniejszych) języków, a już na pewno na platformie .NET.

Coś tam w javie skrobałem. Dlatego właśnie CLI, początki trudne, ale po nabraniu wprawy aplikacje pisze się szybko niczym w javie

MSM napisał(a)

... ale nie będziesz mógł się do nich odwołać bo tablica jest lokalna. Jeśli chodzi ci o to żeby do data można się było odwoływać w całej klasie zrób z tego zmienną globalną w klasie (jako pole klasy a nie zmienną w metodzie).

Aha, i jeszcze pierwszym argumentem Read powinno być 0.

Brzmi sensownie, w weekend znajdę czas i wenę ;] na dalszą naukę. Wtedy napisze co i jak. Póki co dziękuję za okazaną pomoc.
pozdr.

0

Ok. Wszystko już bangla jak chciałem

static void DataReceviedHandler() musi być funkcją statyczną

Rozwiązaniem jest zastosowanie delegate oraz invoke

pozdr.

0

Ostatni problem :) (mam nadzieję)

załóżmy że mam taki fragment

<code=c++/cli> static void DataReceviedHandler(System::Object^ sender,SerialDataReceivedEventArgs^ e)

    {  
             SerialPort^ sp = (SerialPort^)sender;
             array<Byte> ^data = gcnew array<Byte>(sp->BytesToRead);
             sp->Read(data, 0, data->Length);
             String^ st="";
         st = System::BitConverter::ToString(data);				 
             MessageBox::Show(st);				 
	}


Teraz tracę istotne dane. Znaki odczytane z portu COM a nie mające odpowiedników w string (np wartość 00) zamieniana jest na 3F podczas wyświetlania MessageBox. Jak temu zaradzić ??
0

oczywiście wkradł się błąd, skrypt forum wyciął to co w nawiasach <>

powinno być array<Byte> ^data = gcnew array<Byte>(sp->BytesToRead);

0

http://stackoverflow.com/questions/3583930/system-io-ports-using-rtsenabled-receiving-wrong-packet

tutaj więcej o moim problemie. Natomiast użycie Read() zamiast ReadExisting() niczego nie zmieniło

0

Dodam że dzieje się tak również gdy czytam bajt po bajcie (mam założony hehsadecymalny Watch na zmienną data w debuggerze)

SerialPort^ sp = (SerialPort^)sender;
array<Byte> ^data = gcnew array<Byte>(sp->BytesToRead);
int i=0;
while (sp->BytesToRead > 0)
                                   {
                                     data[i]= Convert::ToByte(sp->ReadByte());
				     i++;
                                   }

Nawet gdy czytam bajt po bajcie zamiast 3B240030423030 otrzymuje 3F3F3B243F0E9CFE3030

serialPort1->Encoding = System::Text::Encoding::Default;
                  serialPort1->BaudRate = 9600;
		  serialPort1->Parity = Parity::Even;
                  serialPort1->StopBits = StopBits::Two;
                  serialPort1->DataBits = 8;
                  serialPort1->Handshake = Handshake::None;
                  serialPort1->ReadTimeout = 200;
                  serialPort1->WriteTimeout = 200;

Pomoże ktoś ??

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