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í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

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

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í

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?