Stránka 1 z 2

Sériový port v C#

Napsal: 22 říj 2011 14:03
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");
            }
         }


Re: Sériový port v C#

Napsal: 22 říj 2011 14:11
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";

Re: Sériový port v C#

Napsal: 22 říj 2011 16:25
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

Re: Sériový port v C#

Napsal: 22 říj 2011 17:11
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:

Re: Sériový port v C#

Napsal: 22 říj 2011 17:32
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

Re: Sériový port v C#

Napsal: 22 říj 2011 17:39
od domitea
Můžu vidět celý ten kód Formu?

Re: Sériový port v C#

Napsal: 22 říj 2011 17:49
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();
      }

      
   }
   
}
      
      







      





Re: Sériový port v C#

Napsal: 22 říj 2011 19:40
od domitea
Pokud chceš dávat itemy (jednu na jeden řádek) tak je tu listbox a tam to je přes Items.Add :wink:

Re: Sériový port v C#

Napsal: 22 říj 2011 20:36
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.

Re: Sériový port v C#

Napsal: 22 říj 2011 20:47
od domitea
Kde je funkce AddACII, RecivedChar se můžeš dát do labelu.

// Proč nepoužíváš Visual Studio, je edice Express.

Re: Sériový port v C#

Napsal: 23 říj 2011 09:56
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.

Re: Sériový port v C#

Napsal: 23 říj 2011 11:22
od domitea
Co dávat recievedChar do stringu, který pak zobrazíš v labelu a při každé změně hodnoty refreshovat?