Spannung am COM auslesen
-
Moin
ich muss für ein Projekt den hautwiderstand zwischen 2 fingern auslesen und grafisch darstellen. das gerät hängt am comport, besteht nur aus widerständen,einer diode, einem transistor und kondensator, also ohne mikrocontroller oä.
jetzt hab ich hier in einem andere thread den code für die ansprache eines mikrokontrollers gefunden. (http://www.c-plusplus.net/forum/viewtopic-var-p-is-1413286.html)
nur leider funktioniert des bei mir nicht, hab den code auch ein bisschen an meien bedürfnisse angepasst und verschieden Read- funktionen getestet (also ReadByte/ReadChar etc) funktioniert aber alles nicht.
bei ReadByte zBsp hängt sich das Programm auf und lässt sich nur noch über den taskmanager beenden.
Was hab ich falsch gemacht?
Hier mal der Code:#pragma once namespace comport2 { 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::Text; public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); } protected: ~Form1() { if (components) { delete components;} } private: System::Windows::Forms::TextBox^ textBox1; protected: private: System::Windows::Forms::Button^ button1; private: System::IO::Ports::SerialPort^ serialPort1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Button^ button4; private: System::Windows::Forms::Label^ label2; private: System::ComponentModel::IContainer^ components; private: #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components)); this->button2 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->button4 = (gcnew System::Windows::Forms::Button()); this->label2 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // textBox1 // this->textBox1->BackColor = System::Drawing::Color::White; this->textBox1->Location = System::Drawing::Point(12, 41); this->textBox1->Multiline = true; this->textBox1->Name = L"textBox1"; this->textBox1->ReadOnly = true; this->textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Vertical; this->textBox1->Size = System::Drawing::Size(379, 194); this->textBox1->TabIndex = 0; // // button1 // this->button1->Location = System::Drawing::Point(12, 12); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 2; this->button1->Text = L"open Port"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // serialPort1 // this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived); this->serialPort1->PinChanged += gcnew System::IO::Ports::SerialPinChangedEventHandler(this, &Form1::serialPort1_PinChanged); // // button2 // this->button2->Location = System::Drawing::Point(93, 12); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 3; this->button2->Text = L"close Port"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(156, 263); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(63, 13); this->label1->TabIndex = 5; this->label1->Text = L"Port closed!"; // // button4 // this->button4->Location = System::Drawing::Point(12, 241); this->button4->Name = L"button4"; this->button4->Size = System::Drawing::Size(75, 23); this->button4->TabIndex = 6; this->button4->Text = L"Read"; this->button4->UseVisualStyleBackColor = true; this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click); // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(115, 263); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(40, 13); this->label2->TabIndex = 7; this->label2->Text = L"Status:"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(403, 285); this->Controls->Add(this->label2); this->Controls->Add(this->button4); this->Controls->Add(this->label1); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { try { this->serialPort1->Open(); } catch (Exception^ e ) { this->label1->Text = e->Message; } label1->Text = "Port open!"; } // wird nicht aufgerufen, warum? -> es kommt nix an... private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) { // Event for receiving data // Read the buffer to text box. label1->Text = "Receiving Data!"; array<Object^> ^args = {this, e}; this->Invoke(gcnew EventHandler(this, &Form1::DoUpdate), args); } private: void DoUpdate(Object ^o, EventArgs ^e) { label1->Text = "Getting Data!"; cli::array<unsigned char, 1> ^buffer; //Log ob was ankommt if(this->serialPort1->ReadExisting()=="") label1->Text = "nothing to read!"; this->textBox1->AppendText(this->serialPort1->ReadExisting()); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->serialPort1->Close(); label1->Text = "Port closed!"; } //auslesen des COM1 erzwingen private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { // Event for receiving data // Read the buffer to text box. array<Object^> ^args = {this, e}; //Invoke = thread aufrufen this->Invoke(gcnew EventHandler(this, &Form1::DoUpdate), args); } private: System::Void serialPort1_PinChanged(System::Object^ sender, System::IO::Ports::SerialPinChangedEventArgs^ e) { label1->Text = "Pin changed!"; } }; }
serialPort1.portname hab ich auf COM1 gesetzt (hab nur einen)
hab alles unter visual studio 2005 gemacht.danke
grüße
-
so hab mich jetzt mal ein bisschen über messtechnik belesen, und laut den büchern ist es gar nicht möglich ohne d/a wandler irgendwas auszulesen, klingt ja eigentlich au ganz logisch.
Die Sache ist nur die, wir haben von unserer uni nur die schon beschriebene analoge schaltung bekommen ohne jeglichen kommentar. Diese stammt aus einem Experimentierbakasten, ich habe hier auch die Kopie der Seite aus dem in dem Kasten befindlichen Buch. Da steht nur nichts weiter drin, nur der Schaltplan und das auf der beiliegenden CD (die ich nicht bekommen habe) ein Prgramm zu finden ist was den Spannungsverlauf grafisch darstellt.
In dem recht kurzem Text zu dem versuchsaufbau ist ach nicht von einem d/a wandler oä die Rede. Evtl. auf den Seiten vorher, aber die bekomm ich nicht.Also ich kann mir inzwischen nicht mehr erklären wie man das ohen d/a wanlder realisieren soll.
Lieg ich mit der Anahme das analog definitiv ncht funktioniert richtig?
danke
grüße\edit: ich glaube ich meine A/D Wandler nicht D/A, will ja was analoges digitaliesieren...
-
Hi!
Du hast noch ein anders Problem. Da der COM-Port ein serieller Port ist, mußt du das gemessene Signal erst digitalisieren und anschließend paralell-seriell wandeln.
Meine Empfehlung ist, du setzt doch einen Mikrocontroller ein. Ich kann dir nur die AVR von ATMEL (www.atmel.com) empfehlen. Die sind leicht in C programmiert (mit WinAVR http://winavr.sourceforge.net/ gibts aber auch für Linux), haben schon einen ADC drauf und können auch auf eine serielle Schnitstelle schreiben (in Verbindung mit einem MAX232 auch auf die COM-Schnitstelle eines PC. Das ist eigentlich nur ein Pegelumsetzer, da der COM vom PC mit -15/+15 V und die normale UART vom Controller mit 0/+5 V arbeitet.)
Die Atmels brauchen im Grunde nur eine Stromversorgung, einen Quarz, ein paar Widerstände/Kondensatoren und in deinem Fall einen MAX232.
mfg bauerb
-
jo danke erstma,
ich hab grad im internet die Experimentalplatine gefunden die wir nutzen:
http://www.elexs.de/elexs.htm#platinebzw das Exp. Kit an sich:
http://www.b-kainka.de/basis.htm#rc5es muss also irgendwie auch ohne extra A/D Wandler funktionieren, zumindest sollen wohl die basic programme die man dazu bekommt funktinieren.
-
so hab nun endlich das richtige buch gefunden und rausbekommen wie das funktionieren soll.
zwischen dem DSR und dem TXD Pin des ComPortst hängt ein Elko, dieser wird nun aufgeladen wenn man den stromkreis mit den Fingern schließt, aus der Auflade Zeit welche man mit einem TImer misst, kann man auf die Spannung und somit auf den Hautwiderstand schließen. Um die Aufladezeit zu bestimmen muss man nun irgendwie des Status des DSR und TXD Pins direkt abfragen. Dabei kommt eine 0 zurück wenn keine Spannung anliegt und eine 1 wenn eine Spannung anliegt.
Hat wer ne Ahnung mit welcher Funktion ich die Pins unter C++/CLI einzeln abfragen kann? hab nur die verschiedenen Read() funktionen für den kompletten Port gefunden
-
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport_members.aspx
-
jop da war i au schon, daher hab ich auch die funktionen und dem SerialPort anzusprechen, aber halt nur im gesamten, ich will ja nur den Status zBsp des TXD Pins, ob da nun eine SPannung anliegt oder nicht, das hab ich da jetzt nicht gefunden, oder hab ich das nur überlesen?
danke grüße
-
Properties:
- CDHolding
- CtsHolding
- DsrHolding
- DtrEnable
- RtsEnable
-
ah cool vielen dank