środa, 14 stycznia 2015

Podstawowa aplikacja do UART w C#




Wstęp

Chciałbym zaprezentować przykładową aplikację do prostej transmisji po przykładowo RS232.
Program realizuje podstawowe działanie terminala, w których możemy wysyłać, odbierać dane z realizowanego urządzenia.

Obsługa

Aby prawidłowo odbierać, wysyłać dane, w pierwszej kolejności należy podłączyć urządzenie do portu USB (może być to konwerter RS232 <-> USB ). Następnie musimy otworzyć połączenie Serial Port. W tym celu wybieramy COM komputera, do którego podłączono został układ (port zostanie sam wyświetlony jeśli jest aktywny). Kolejnym krokiem jest wybranie podstawowych parametrów dotyczących transmisji RS232. Ostatnim elementem jest naciśnięcie klawisz "Open". Jeżeli wszystko pójdzie prawidłowo, czerwony kwadrat zmieni swój kolor na zielony.
W przypadku złego skonfigurowania programu, podczas próby otwarcie Serial Port wyskoczy komunikat o niepowodzeniu



Rozwój

Program ma na celu stworzenie "bazy" do dalszego rozwoju w innych projektach, w których wymagana jest komunikacja urządzenia z komputerem przykładowo po RS232.
Szukając na internecie wiele jest poradników jak napisać taki program. Przebierając między stronami starałem się napisać jak najprostszy program, tak więc może komuś się przyda ; )

Kod programu

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

namespace UART_base
{
    public partial class Form1 : Form
    {
       

        public Form1()
        {
            InitializeComponent();
            cmdClose.Enabled = false; //dezaktywacja klawisza zamykajacego polaczenie
            cmdSend.Enabled = false;
            cmbBaudrate.SelectedIndex = 1;   //domyslanie aby uzytkownik nigdy nie zapomnial
            cmbParity.SelectedIndex = 0;
            cmbDatabits.SelectedIndex = 0;
            cmbStopbits.SelectedIndex = 0;
            foreach (string s in System.IO.Ports.SerialPort.GetPortNames())  //przypisuje do s znalezione porty i dodaje do panelu. jest tak dlugo az bedzie puste getport
            {
                txtPort.Items.Add(s);
            } 

          
        }

        public System.IO.Ports.SerialPort sport;  //spot to klasa, krotsza nazwa poprostu
        string InputData = String.Empty;
        internal delegate void SetTextDelegate(string Text);

        public void serialport_connect(string port, int baudRate, Parity parity, int dataBits, StopBits stopbits)
        {
            DateTime dt =  DateTime.Now; //pobranie aktualnej daty z struktury
            string dtn = dt.ToShortTimeString();
            sport = new System.IO.Ports.SerialPort(port,baudRate,parity,dataBits,stopbits); //nowy obiekt klasy o tych parametrach         

            try
            {
                sport.Open(); //otwarcie portu
                cmdOpen.Enabled = false; //zablokowanie przed ponownym otwarciem
                cmdClose.Enabled = true; //odblokowanie aby zamknac polaczenie
                cmdSend.Enabled = true;
                txtReceive.AppendText("[" + dtn + "] " + " Connected\n");                                
                sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived); // handler do przerwania gdy nastapi nadejscie danych. datareceived tak samo jak w F12 napisane
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error ;(");
            }
        }

        private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) //gdy event zglosi ze cos przyszlo to przechodzi do tej metody
        {
            try
            {
                InputData = sport.ReadExisting();
                IAsyncResult result = this.BeginInvoke(new SetTextDelegate(SetText), new object[] { InputData }); //wywolanie asynchroniczne (DELEGAT, ARGUMENT)
                this.EndInvoke(result);
            }
            catch (Exception)
            {
                MessageBox.Show("error");
            }
         
        }

        private void SetText(string text)
        {
            this.txtReceive.AppendText(text);           
        }




        private void cmdOpen_Click(object sender, EventArgs e)
        {
            try
            {

                int baudrate = Convert.ToInt32(cmbBaudrate.Text);
                int databits = Convert.ToInt32(cmbDatabits.Text);
                Parity parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
                string port = txtPort.Text;
                StopBits stopbits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopbits.Text);

                serialport_connect(port, baudrate, parity, databits, stopbits);
                flControl.BackColor = System.Drawing.Color.DarkGreen;
            }
            catch (Exception)
            {
                MessageBox.Show("Check your settings\n Port can't be open", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);                  
               
            }
          

        }

        private void cmdSend_Click(object sender, EventArgs e)
        {
           try
            {

                DateTime dt = DateTime.Now;
                string dtn = dt.ToShortTimeString();
                string data = txtDatatoSend.Text;
                InputData = txtDatatoSend.Text;
                sport.Write(data);               
                IAsyncResult result = this.BeginInvoke(new SetTextDelegate(SetText), data);        
                this.EndInvoke(result);
                this.txtReceive.AppendText("\n");

            }
            catch (Exception)
            {
                MessageBox.Show("Port is close\n Can't send data", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);                 
            }

          
        }

        private void cmdClose_Click(object sender, EventArgs e)
        {
            DateTime dt = DateTime.Now;
            string dtn = dt.ToShortTimeString();

            if (sport.IsOpen)
            {
                sport.Close();
                cmdClose.Enabled = false;
                cmdOpen.Enabled = true;
                cmdSend.Enabled = false;
                txtReceive.AppendText("[" + dtn + "]" + " Disconnected\n");   
                flControl.BackColor = System.Drawing.Color.DarkRed;  //zmiana koloru kontrolki
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            txtReceive.Clear();
        }  
      
    }
}









Brak komentarzy:

Prześlij komentarz