Sériový port v C#

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Sériový port v C#

Příspěvek od Zeppelin »

Čau, posílám si do sériového portu teplotu (int) asi 2x za vteřinu a potřebuju to zobrazit v text labelu v aplikaci C#. Nevím jak mám udělat tu smyčku pro čtení, ono mi to funguje ale jenom když se to připojí (automaticky po startu aplikace). Když dám normální smyčku for(;;) tak to zamrzne. C# znám jen okrajově takže se pokouším aplikovat "čistý C" :D Díky moc.

Kód: Vybrat vše

public void loop()
			{
			if((serialPort1.IsOpen) && (serialPort1.ReadBufferSize != 0))
				{
					label2.Text = Convert.ToString(serialPort1.ReadByte() + "°C");
				}
			}

Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7415
Registrován: 23 pro 2010 09:23

Re: Sériový port v C#

Příspěvek od faraon »

Neměl bys převádět na text jen ten int, a to "°C" k tomu přidat až pak?

label2.Text = Convert.ToString(serialPort1.ReadByte()) + "°C";
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)
Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Re: Sériový port v C#

Příspěvek od Zeppelin »

Klidně, ale to bohužel nic nemění.. někde se musí udělat nějaký obnovování toho co příjde z portu

mám to teď takto

Kód: Vybrat vše

temp = serialPort1.ReadByte();
label2.Text = Convert.ToString((temp) + ("°C"));
temp mám definovaný jako int
Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Sériový port v C#

Příspěvek od domitea »

While popřípadě s do jsi zkoušel?

//EDIT-------

Teď jsem našel něco zajímavého:

Kód: Vybrat vše

while ((serialPort1.IsOpen) && (serialPort1.ReadBufferSize != 0)) {
    /* Prichozi byte precteme a ulozime do pomocne promenne */
    //1. receivedByte = serialPort1.ReadByte();
    //2. rtb_received.Text += (char) serialPort1.ReadByte();
    //3. Nyní spravne reseni:
    AddASCII( (char) serialPort1.ReadByte() );
   }
Zdroj, sice to je RS 232, ale to je jedno :smile:
Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Re: Sériový port v C#

Příspěvek od Zeppelin »

Podle tohoto jsem to dělal ale nefungovalo to-vůbec se nezobrazí hlavní okno, ale už mám dodělanou notifikační ikonu a tam to funguje :) tak ale teď v tom okně-asi je problém s tím text labelem
Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Sériový port v C#

Příspěvek od domitea »

Můžu vidět celý ten kód Formu?
Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Re: Sériový port v C#

Příspěvek od Zeppelin »

Tady to je, zkoušel jsem to znovu podle toho návodu-to čtení, i s ritch boxem a nejde to. Problém je že na konci té funkce AddASCII má "rtb_received.Items.Add(receivedChar);" jenže pro ritch box ani pro label nejde "items"

Kód: Vybrat vše

/*
 * Created by SharpDevelop.
 * User: Marek
 * Date: 24.7.2011
 * Time: 14:54
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace TempTerminal
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class First_form : Form
	{
		public First_form()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
			int temp;
		
		public void PortLoad()
		 {
		int rate_int;
			try {
  		string name = (System.IO.File.ReadAllText(@"C:\port_name.txt"));
  		serialPort1.PortName = name;
  		
  		string rate = (System.IO.File.ReadAllText(@"C:\baud_rate.txt"));
  		rate_int = Convert.ToInt32(rate);
  		serialPort1.BaudRate = rate_int;
  			
 		serialPort1.Open();
  		
 
  		if ( serialPort1.IsOpen ) 
  		{
    		label3.Text = "Připojeno";
   		}
}
			catch ( Exception ) 
		{
 			 label3.Text = ("Nelze otevřít port");
		}

}


		
		void Button1Click(object sender, EventArgs e)
			{
				Form1 Settings = new Form1();
				Settings.Show();
				serialPort1.Close();
			}
  			
		void MainFormLoad(object sender, EventArgs e)
			{
		 		PortLoad();
		 		this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
				this.ShowInTaskbar = false;
				this.Visible = false;
				notifyIcon1.ContextMenuStrip = contextMenuStrip1;
				loop();
   			}

		public void loop()
			{
			while((serialPort1.IsOpen) && (serialPort1.ReadBufferSize != 0))
				{
					temp = serialPort1.ReadByte();
					label2.Text = Convert.ToString((temp) + ("°C"));
					ShowText((Convert.ToString((temp)) + ("°")), new Font("Helvetica", 8), Color.FromName ("White"));
				}
			}
		
		public void ShowText(string text, Font font, Color col)
			{

    			Brush brush = new SolidBrush(col);
    			Bitmap bitmap = new Bitmap(16, 16);
    			Graphics graphics = Graphics.FromImage(bitmap);
    			graphics.DrawString(text, font, brush, 0, 0);
 
   				 IntPtr hIcon = bitmap.GetHicon();
   				 Icon icon = Icon.FromHandle(hIcon);
   				 notifyIcon1.Icon = icon;
			}
		
			
		void NotifyIcon1MouseDoubleClick(object sender, MouseEventArgs e)
		{
			this.Visible = true;
			this.WindowState = System.Windows.Forms.FormWindowState.Normal;
		}
		
		void NotifyIcon1MouseClick(object sender, MouseEventArgs e)
		{
			notifyIcon1.ShowBalloonTip(500, "TempSensor", "Teplota je: " + Convert.ToString(temp + "°C"), ToolTipIcon.Info);
		}
		
		void OtevřítToolStripMenuItemClick(object sender, EventArgs e)
		{
			this.Visible = true;
			this.WindowState = System.Windows.Forms.FormWindowState.Normal;
		}
		
		void ZavřítToolStripMenuItemClick(object sender, EventArgs e)
		{
			this.Close();
		}

		
	}
	
}
		
		







		




Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Sériový port v C#

Příspěvek od domitea »

Pokud chceš dávat itemy (jednu na jeden řádek) tak je tu listbox a tam to je přes Items.Add :wink:
Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Re: Sériový port v C#

Příspěvek od Zeppelin »

Můžu to zkusit, ale já bych stejně radči udělal ten label-myslím si, že list box nebo cokoliv jiného je ústupek, který není potřeba, nemůže to přeci být až takový problém to přijímat a vypisovat do labelu.
Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Sériový port v C#

Příspěvek od domitea »

Kde je funkce AddACII, RecivedChar se můžeš dát do labelu.

// Proč nepoužíváš Visual Studio, je edice Express.
Uživatelský avatar
Zeppelin
Level 3.5
Level 3.5
Příspěvky: 939
Registrován: 24 říj 2007 19:18

Re: Sériový port v C#

Příspěvek od Zeppelin »

Vzhledem k tomu že v C# dělám něco párkrát za rok tak SharpDevelop je pro m akorátní :D takže jsem tam přidal toto:

Kód: Vybrat vše

		void SerialPort1DataReceived(object sender, SerialDataReceivedEventArgs e)
		{
			int receivedByte;
try {
  /* Cteme z prijimaciho bufferu dokud neni prazdny */
  while ((serialPort1.IsOpen) && (serialPort1.ReadBufferSize != 0)) {
    /* Prichozi byte precteme a ulozime do pomocne promenne */
    //1. receivedByte = serialPort1.ReadByte();
    //2. rtb_received.Text += (char) serialPort1.ReadByte();
    //3. Nyní spravne reseni:
    AddASCII( (char) serialPort1.ReadByte() );
   }
}
catch ( Exception ) {
  /* Do status baru vypiseme chybove hlaseni */
  label3.Text = "Nelze číst";                
}
		}
		
		private void AddASCII(char receivedChar) 
{
  if (label2.InvokeRequired) {
    label2.Invoke(new Action<char>(AddASCII), receivedChar);
  }
  else {
				label2.Text = (Convert.ToString(receivedChar));
  }
}


Akorát že to pořád nefunguje.... myslím si že už jsem to tato jednou zkoušel. Ovšem i bez tohoto to okno zamrzá.... tak nevím v čem je chyba... a to mám zakomentované toto: label2.Text = Convert.ToString((temp) + ("°C")); ale znovu říkám-pokud tento řádek dám do MainLoad tak to normál funguje, akorát že ta hodnota je pořád ta co byla při startu.
Intel Celeron G1840, 4GB RAM DDR3, MB Gigabyte H81-S2V, Asus GT610 1GB, SSD Kingston HyperX Fury 120GB, WD 500GB SATAII, Asus DVD-RW LightScribe, Fortron 350W

Jak označit téma za vyřešené
HiJackThis
Návod na údržbu systému pro začátečníky
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Sériový port v C#

Příspěvek od domitea »

Co dávat recievedChar do stringu, který pak zobrazíš v labelu a při každé změně hodnoty refreshovat?
Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • 16 port switche 1GB
    od BigSandy » » v Sítě - hardware
    3 Odpovědi
    17399 Zobrazení
    Poslední příspěvek od meda2016

Zpět na „Programování a tvorba webu“