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: říjen 07
Pohlaví: Muž
Stav:
Offline

Sériový port v C#

Příspěvekod Zeppelin » 22 říj 2011 14:03

Č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

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod faraon » 22 říj 2011 14:11

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: říjen 07
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod Zeppelin » 22 říj 2011 16:25

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ů
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Sériový port v C#

Příspěvekod domitea » 22 říj 2011 17:11

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: říjen 07
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod Zeppelin » 22 říj 2011 17:32

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ů
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Sériový port v C#

Příspěvekod domitea » 22 říj 2011 17:39

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: říjen 07
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod Zeppelin » 22 říj 2011 17:49

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ů
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Sériový port v C#

Příspěvekod domitea » 22 říj 2011 19:40

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: říjen 07
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod Zeppelin » 22 říj 2011 20:36

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ů
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Sériový port v C#

Příspěvekod domitea » 22 říj 2011 20:47

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: říjen 07
Pohlaví: Muž
Stav:
Offline

Re: Sériový port v C#

Příspěvekod Zeppelin » 23 říj 2011 09:56

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ů
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Sériový port v C#

Příspěvekod domitea » 23 říj 2011 11:22

Co dávat recievedChar do stringu, který pak zobrazíš v labelu a při každé změně hodnoty refreshovat?


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

Kdo je online

Uživatelé prohlížející si toto fórum: Google [Bot] a 2 hosti