NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Pavel
Člen
Avatar
Pavel:26.10.2017 18:46

Ahoj, chtěl bych na sériový port (v mém případě mám volný COM1) posílat čtyři různé čísla.
Ve své formulářové aplikaci c# to mám uděláno tak, že vždy po stisku numerického tlačítka 9,6,3 a 1 se odešle na COM1 hdnota 1,2,3 nebo 4 (dle klávesy samozřejmě)
Když jsem počítač spojil s jiným počítačem a v něm chtěl prověřit zda čísla přichází, nedaří se.

  1. Můžete se prosím podívat na kód, zda vůbec hodnoty odesílá? Vy v tom ty chyby uvidíte hned.
  2. Jak mám prověřit, že se hodnota na port odeslala?

Byl bych rád, kdybyste mi případně i ten kód opravili. Plavu v tom.
Díky moc

using System;
using System.Collec­tions.Generic;
using System.Componen­tModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Window­s.Forms;
using System.IO.Ports;
using System.Threading;
using System.Runtime­.InteropServi­ces;

namespace Test
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

public Form1()
{
InitializeCom­ponent();
}
int a = 7;
private void button1_Click(ob­ject sender, EventArgs e)
{
sp.Open();
sp.Write(a.ToS­tring());
label1.Text = a.ToString();
//Thread.Sleep(800);
sp.Close();
}
private void Form1_KeyDown(ob­ject sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.NumPad9)
{
a = 1;
button1_Click(sen­der, e);
}
else if (e.KeyCode == Keys.NumPad6)
{
a = 2;
button1_Click(sen­der, e);
}
else if (e.KeyCode == Keys.NumPad3)
{
a = 3;
button1_Click(sen­der, e);
}
else if (e.KeyCode == Keys.NumPad1)
{
a = 4;
button1_Click(sen­der, e);
}

}
private void Form1_Load(object sender, EventArgs e)
{

// Get a list of serial port names.
string[] ports = SerialPort.Get­PortNames();

string a = "VOLNÝ SÉRIOVÝ PORT V ZAŘÍZENÍ JE: ";

// Display each port name to the console.
foreach (string port in ports)
{
//MessageBox.Show(a + port);
//textBox1.Text = (a + port);
}

Console.ReadLine();

}

private void Form1_Activated(ob­ject sender, EventArgs e)
{
this.BackColor = Color.Green;
textBox1.Focus();
}

private void Form1_Deactiva­te(object sender, EventArgs e)
{
this.BackColor = Color.Gray;

this.Activate();
textBox1.Focus();
}

private void button2_Click(ob­ject sender, EventArgs e)
{
this.Close();
}

private void textBox1_TextChan­ged(object sender, EventArgs e)
{
if (textBox1.Text == "3")
{
a = 1;
button1_Click(sen­der, e);
textBox1.Text = null;
}
else if (textBox1.Text == "6")
{
a = 2;
button1_Click(sen­der, e);
textBox1.Text = null;
}
else if (textBox1.Text == "9")
{
a = 3;
button1_Click(sen­der, e);
textBox1.Text = null;
}
else if (textBox1.Text == "7")
{
a = 4;
button1_Click(sen­der, e);
textBox1.Text = null;
}
else
textBox1.Text = null;
}

private void button3_Click(ob­ject sender, EventArgs e)
{
this.Activate();
}

}
}

 
Odpovědět
26.10.2017 18:46
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Pavel
Petr Nymsa:26.10.2017 21:36

Začni tím, že sem kód vložíš pomocí tlačítka. Tohle nikdo luštit chtít nebude

Nahoru Odpovědět
26.10.2017 21:36
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Pavel
Člen
Avatar
Odpovídá na Petr Nymsa
Pavel:27.10.2017 3:17

Vložil jsem tedy kód znovu. Snad jsi to myslel takto

 
Nahoru Odpovědět
27.10.2017 3:17
Avatar
Pavel
Člen
Avatar
Odpovídá na Pavel
Pavel:27.10.2017 3:27

Hmm tak tady ani nejde smazat svůj vlastní příspěvek?
Nevím jak kód nahrát aby se v tom někomu chtělo hrabat.
Zkoušel jsem přes "VYBRAT SOUBORY" nabízí to jen obrázky, po výběru volby "všechny soubory" to stejně nic nenahrálo.
Když kliknu na dlouhý zdroják, tak jsem ho uložil, ale zase není dostupný v psaní příspěvku...nevím jak to děláte.
Tak mě za to snad neodepíšete, jsem starší člověk.....
Takže prosím polopatě: Jak sem vložit kód?
Děkuji

 
Nahoru Odpovědět
27.10.2017 3:27
Avatar
Pavel
Člen
Avatar
Odpovídá na Pavel
Pavel:27.10.2017 3:37

Nejde mi ani tak o celý kód, jako o tuto část

VÝŇATEK Z KÓDU:
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

public Form1()
{
InitializeCom­ponent();
}
int a = 7;

private void button1_Click(ob­ject sender, EventArgs e)
{
sp.Open();
sp.Write(a.ToS­tring());
label1.Text = a.ToString();
sp.Close();
}

OTÁZKA:
Odešle se na COM1 vždy po stisku Button1 číslo 7?

 
Nahoru Odpovědět
27.10.2017 3:37
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Pavel
ostrozan:27.10.2017 6:47

nad oknem, do kterého píšeš jsou různá tlačítka - jedno z nich je </> - na to klikni a pak tam vlož kód

 
Nahoru Odpovědět
27.10.2017 6:47
Avatar
Odpovídá na Pavel
Michal Štěpánek:27.10.2017 6:53

Oním "tlačítkem" bylo myšleno nad zadávacím formulářem druhé zleva "</>", protože pak je to přehlednější

public Form1()
{
InitializeComponent();
}
int a = 7;

private void button1_Click(object sender, EventArgs e)
{
sp.Open();
sp.Write(a.ToString());
label1.Text = a.ToString();
sp.Close();
}
Nahoru Odpovědět
27.10.2017 6:53
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Pavel
Člen
Avatar
Odpovídá na Michal Štěpánek
Pavel:27.10.2017 7:05
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Runtime.InteropServices;

namespace Test
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

public Form1()
{
InitializeComponent();
}
int a = 7;
private void button1_Click(object sender, EventArgs e)
{
sp.Open();
sp.Write(a.ToString());
label1.Text = a.ToString();
//Thread.Sleep(800);
sp.Close();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.NumPad9)
{
a = 1;
button1_Click(sender, e);
}
else if (e.KeyCode == Keys.NumPad6)
{
a = 2;
button1_Click(sender, e);
}
else if (e.KeyCode == Keys.NumPad3)
{
a = 3;
button1_Click(sender, e);
}
else if (e.KeyCode == Keys.NumPad1)
{
a = 4;
button1_Click(sender, e);
}

}
private void Form1_Load(object sender, EventArgs e)
{

// Get a list of serial port names.
string[] ports = SerialPort.GetPortNames();

string a = "VOLNÝ SÉRIOVÝ PORT V ZAŘÍZENÍ JE: ";

// Display each port name to the console.
foreach (string port in ports)
{
//MessageBox.Show(a + port);
//textBox1.Text = (a + port);
}

Console.ReadLine();

}

private void Form1_Activated(object sender, EventArgs e)
{
this.BackColor = Color.Green;
textBox1.Focus();
}

private void Form1_Deactivate(object sender, EventArgs e)
{
this.BackColor = Color.Gray;

this.Activate();
textBox1.Focus();
}

private void button2_Click(object sender, EventArgs e)
{
this.Close();
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text == "3")
{
a = 1;
button1_Click(sender, e);
textBox1.Text = null;
}
else if (textBox1.Text == "6")
{
a = 2;
button1_Click(sender, e);
textBox1.Text = null;
}
else if (textBox1.Text == "9")
{
a = 3;
button1_Click(sender, e);
textBox1.Text = null;
}
else if (textBox1.Text == "7")
{
a = 4;
button1_Click(sender, e);
textBox1.Text = null;
}
else
textBox1.Text = null;
}

private void button3_Click(object sender, EventArgs e)
{
this.Activate();
}

}
}

Paráda, pro příště to budu vědět.
Díky.

 
Nahoru Odpovědět
27.10.2017 7:05
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Pavel
ostrozan:27.10.2017 7:21

ano to by mělo fungovat
ale takhle ani nevíš , jestli se ti port otevřel
úprava:

private void button1_Click(object sender, EventArgs e)
{
try//pokus o otevreni portu
{
sp.Open();
}
catch(exception ex)// pri neuspechu vypise proc se port neotevrel
{
  MessageBox.Show(ex.Message);
  return;
}

sp.Write(a.ToString());
label1.Text = a.ToString();
sp.Close();
}

chyb je tam více

a jinak komunikaci přes COM1 ( mimochodem, to musí být nějaký muzeální stroj - to už se jen tak nevidí :) ) máš vyzkoušenou ? Třeba přes nejaký hotový terminál - na síti je jich spousta?

 
Nahoru Odpovědět
27.10.2017 7:21
Avatar
Odpovídá na ostrozan
František Tischler:27.10.2017 11:29

Jenom poznámka. Sériový port se využívá ještě poměrně často. Aktuálně třeba pro komunikaci se zákaznickými displeji, pokladními tiskárnami, tiskárnami čárových kódů a podobně. Nová zařízení už obvykle využívají USB nebo RJ45, ale v provozu je spousta starších zařízení se sériovým portem. Počítače je pak potřeba rozšířit o kartu s COM porty nebo použít redukci USB-COM. Takže vůbec nemusí jít o muzeální stroj :-)

 
Nahoru Odpovědět
27.10.2017 11:29
Avatar
Odpovídá na František Tischler
Erik Šťastný:27.10.2017 17:34

Tak tak, COM je naprosto jednoduchý a o proti USB a díky tomu je používáme v práci ve vlastních HW zařízeních naprosto běžně v kombinaci s RJčkama, tam kde je třeba lepší traffic:)

 
Nahoru Odpovědět
27.10.2017 17:34
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:28.10.2017 7:06

Naprostý souhlas - mně šlo ale o konkrétní COM1 který patří RS232 interface integrovanému na základní desce, ale jak právě zjišťuju, tak výrobci základních desek ho tam dávají dodnes a i když není vyvedený na konektor - dá se napíchnout bracket na desetipinovou lištu na desce, ale třeba na noteboocích chybí COM1 (fyzicky konektor) už aspoň 10 let a musí se použít nějaký ten USB převodník či karta

 
Nahoru Odpovědět
28.10.2017 7:06
Avatar
zelvicek
Člen
Avatar
Odpovídá na Pavel
zelvicek:28.10.2017 10:55

Osobně bych si na takovouto investigaci vytvořil konzolovou aplikaci, a kód maximálně zjednodušil. V tvém případě by to bylo na 5 řádků - tímto se omezí množství možností problému.

Každopádně, na řádek sp.Open() dej breakpoint a aplikaci spusť s připojeným debuggerem (klávesa F5). Krokuj a pokud tam nastává chyba (exception), VS ti to oznámí a ukáže; pokud žádná chyba nenastane, data by měla být odeslána.

Co se týče propojení s druhým PC: popis "nedaří se" je dost vágní a netuším, co jsi zkusil, jak jsi testoval, jaké byly výsledky, takže těžko radit. Byl snad problém při zasouvání konektoru?

 
Nahoru Odpovědět
28.10.2017 10:55
Avatar
Tomáš H.
Člen
Avatar
Tomáš H.:28.10.2017 11:30

Čau,

já bych na to šel taky od základu. Nejprve bych si asi nainstaloval nějaký virtuální COM a terminál třeba herkules se mi celkem líbí, nebo Putty je hodně jednoduchý. A na tom bych vyzkoušel funkčnost.
Přidám jednoduchý kód pro vyzkoušení.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SimpleTCP;
using Json;
using System.IO;
using System.IO.Ports;

public partial class Form1 : Form
{
        private SerialPort comPort;

        public Form1()
        {
            InitializeComponent();

                // vypise seznam dostupnych COMu do ComboBoxu
            foreach (string com in SerialPort.GetPortNames())
            {
                cb_Ports.Items.Add(com);
            }
        }

        //Button pro odpojeni
        private void btn_Disconnect_Click(object sender, EventArgs e)
        {
            if (comPort.IsOpen) {
                comPort.Close();
            }
        }

        //Button pro pripojeni
        private void btn_Connect_Click(object sender, EventArgs e)
        {
            if (cb_Ports.SelectedItem.ToString() != "")
            {
                comPort = new SerialPort(cb_Ports.SelectedItem.ToString(), 9600, Parity.None, 8, StopBits.One);

                try {
                    comPort.Open();
                    lb_StatusCom.Text = "Open COM port";
                }
                catch(IOException ex){
                    lb_StatusCom.Text = "Open ERROR";
                }
            }
        }

        //Po stisku tlacitka vypise na linku znak 'a'
        private void btn_GetInfo_Click(object sender, EventArgs e)
        {
            if (comPort.IsOpen)
            {
                comPort.WriteLine("a");
            }
        }
}

Snad to k něčemu bude.

Nahoru Odpovědět
28.10.2017 11:30
Člověk se pořád učí :)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.