7 Şubat 2016 Pazar

STM32F407VG ve BİLGİSAYAR SERİ PORT HABERLEŞMESİ - USART İLETİŞİM PROTOKOLÜ

     Merhabalar,

     Bu yazımızda, USART seri iletişim protokollerinden bahsedeceğiz. Ardından da STM32F407 Discovery kiti ile bilgisayarımız arasında bir UART iletişim uygulaması gerçekleştireceğiz.
    USART ( Universal Synchronous Asynchronous Receiver Transmitter ) iki sistem arasında verilerin bit bit sıra ile yani seri olarak iletildiği iletişim protokolüdür. Seri iletişim, senkron ve asenkron iletişim olmak üzere ikiye ayrılır. Senkron iletişimde alıcı ve verici devre eşzamanlı olarak çalışırlar. Bu iletişimde data hattı ve clock sinyali hattı bulunur. Clock hattı verilerin eşzamanlı olarak gönderilip alınmasını sağlar.

   Asenkron iletişimde ise sadece data hatları bulunur. Asenkron iletişim, clock sinyali hattı bulundurmaz, bu nedenle alıcı ve verici eşzamanlı olarak çalışmazlar.



  Asenkron iletişimde clock sinayli yerine start, stop ve parity bitleri bulunur. Start biti, göndereceğimiz veriden önce gönderilir ve verinin gönderileceğini alıcı tarafa bildirir. Stop biti, gönderdiğimiz verinin bittiğinin işaretidir ve veri sonunda alıcı tarafa gönderilir. Parity biti ise verilerin alıcıya doğru şekilde iletilip iletilemediğini kontrol etmek için kullanılır. Parity bitinin gönderilmesi şart değildir. Asenkron iletişimde veri formatı aşağıdaki gibidir.

     Asenkron iletişimin hızı, baud rate ile belirlenir.  Baud oranı (baud rate, bps) saniyede gönderilen bit sayısı olarak tanımlanır. İletişimin doğru bir şekilde sağlanabilmesi için  alıcı ve vericinin baud oranları aynı olmalıdır.
     Masaüstü bilgisayarlarda RS232 seri iletişim portları bulunmaktadır. RS232 portu aracılığıyla bilgisayarlar farklı cihazlar ile haberleşebilir.  RS232 portunun 9 adet pini vardır.

     RS232 portunun pinlerinde dataların voltaj seviyeleri ya -3 ile -15 ya da +3 ile +15 arası değerlerdir. TTL voltaj seviyesi ise 0 ile 5V arasında değişir. Yani RS232 ile TTL cihazların voltaj seviyeleri birbirinden farklıdır. Haberleşmenin sağlanabilmesi için bilgisayarın RS232 portu ile TTL cihaz arasına TTL-RS232 seviye denkleyici entegre bağlanır. STM32F407 mikrodenetleyicinin TTL voltaj seviyesi 0 ile 3,3V aralığındadır. STM32F407 mikrodenetleyici ile bilgisayarımızın haberleşmesinin sağlanabilmesi için MAX3232 entegresini (TTL-RS232 seviye denkleyici) kullanacağız.





    Uygulamada aşağıdaki RS232-TTL çevirici modülü kullandık, siz isterseniz çevirici devreyi kendiniz de kurabilirsiniz.
     Dizüstü bilgisayarlarda RS232 çıkışı bulunmamaktadır. Eğer dizüstü bilgisayar kullanacaksanız birde USB - RS232 dönüştürücü kullanmanız gereklidir.
   Uygulamamızda visual C# da bir arayüz UART terminali yapacağız. Bu terminalden gerekli verileri, bilgisayarımızın COM portları üzerinden RS232 aracılığıyla mikrodenetleyimicize göndererek STM32F4 Discovery üzerinde bulunan 4 adet ledi kontrol edeceğiz. Ledlerin kontrolünün sağlanmasından sonra da, yanan ledlerin renk bilgisini mikrodenetleyiciden terminale göndereceğiz. Uygulamamızın genel devresi aşağıdaki gibi olacaktır.

   STM32F407VG mikrodenetleyici 6 adet UART modülüne sahiptir. Programımızda PD5-TX ve PD6-RX olarak UART2 modülü kurduk. UART modüllerinin TX veRX pinleri aşağıdaki tabloda yer almaktadır.

Uygulamamızın mikrodenetleyici programını microC de yazdık.

char uart_rd;
void main(){
      GPIO_Digital_Output(&GPIOD_ODR,
                       _GPIO_PINMASK_12|
                       _GPIO_PINMASK_13|
                       _GPIO_PINMASK_14|
                       _GPIO_PINMASK_15);

 UART2_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART2_PD56);               
    delay_ms(500);
  while (1) {
if (UART2_Data_Ready()) {
      uart_rd = UART2_Read();
      if(uart_rd=='s')     {
                           GPIOD_ODR.B12=0; 
                           GPIOD_ODR.B13=0; 
                           GPIOD_ODR.B14=0; 
                           GPIOD_ODR.B15=0;
                           UART2_Write_Text("ledler sondu");
                           }
      else if(uart_rd=='y'){
                           GPIOD_ODR.B12=1;
                           GPIOD_ODR.B13=0;
                           GPIOD_ODR.B14=0; 
                           GPIOD_ODR.B15=0;
                           UART2_Write_Text("yesil");
                           }
      else if(uart_rd=='t'){
                           GPIOD_ODR.B12=1; 
                           GPIOD_ODR.B13=1; 
                           GPIOD_ODR.B14=0; 
                           GPIOD_ODR.B15=0;
                           UART2_Write_Text("turuncu");
                           }
      else if(uart_rd=='k'){
                           GPIOD_ODR.B12=1; 
                           GPIOD_ODR.B13=1; 
                           GPIOD_ODR.B14=1; 
                           GPIOD_ODR.B15=0;
                           UART2_Write_Text("kirmizi");
                           }
      else                 {  //(uart_rd=='m')
                           GPIOD_ODR.B12=1; 
                           GPIOD_ODR.B13=1; 
                           GPIOD_ODR.B14=1; 
                           GPIOD_ODR.B15=1;
                           UART2_Write_Text("mavi");
                           }
      
                         }

             }
}


      Vusial C# da yaptığımız arayüzün dizaynı ve kodları aşağıdaki gibidir.



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

namespace STM32F4_TERMİNAL
{
    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
        
        byte aralik;
        bool deger=false;
        bool izci = true, izci1 = true, izci2 = true, izci3 = true, izci4 = true;
      
         
        public Form1()
        {
            InitializeComponent();

            
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }

        void dolgu0()
        {
            Graphics cemberdolgu;


            cemberdolgu = this.CreateGraphics();

            
            Brush dolgu_bos = new SolidBrush(Color.White);
            cemberdolgu.FillEllipse(dolgu_bos, 141, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 171, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 201, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 231, 61, 18, 18);
            cemberdolgu.Dispose();

        }
        void dolgu1()
        {
            Graphics cemberdolgu;
            

            cemberdolgu = this.CreateGraphics();
            
            Brush dolguyesil = new SolidBrush(Color.Green);
            Brush dolgu_bos = new SolidBrush(Color.White);
            cemberdolgu.FillEllipse(dolguyesil, 141, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 171, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 201, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 231, 61, 18, 18);
            cemberdolgu.Dispose();
        
        }
        void dolgu2()
        {
            Graphics cemberdolgu;


            cemberdolgu = this.CreateGraphics();

            Brush dolguyesil = new SolidBrush(Color.Green);
            Brush dolguturuncu = new SolidBrush(Color.Orange);
            Brush dolgu_bos = new SolidBrush(Color.White);
            cemberdolgu.FillEllipse(dolguyesil, 141, 61, 18, 18);
            cemberdolgu.FillEllipse(dolguturuncu, 171, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 201, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 231, 61, 18, 18);
            cemberdolgu.Dispose();

        }
        void dolgu3()
        {
            Graphics cemberdolgu;


            cemberdolgu = this.CreateGraphics();

            Brush dolguyesil = new SolidBrush(Color.Green);
            Brush dolguturuncu = new SolidBrush(Color.Orange);
            Brush dolgukirmizi = new SolidBrush(Color.Red);
            Brush dolgu_bos = new SolidBrush(Color.White);
            cemberdolgu.FillEllipse(dolguyesil, 141, 61, 18, 18);
            cemberdolgu.FillEllipse(dolguturuncu, 171, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgukirmizi, 201, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgu_bos, 231, 61, 18, 18);
            cemberdolgu.Dispose();

        }
        void dolgu4()
        {
            Graphics cemberdolgu;


            cemberdolgu = this.CreateGraphics();

            Brush dolguyesil = new SolidBrush(Color.Green);
            Brush dolguturuncu = new SolidBrush(Color.Orange);
            Brush dolgukirmizi = new SolidBrush(Color.Red);
            Brush dolgumavi = new SolidBrush(Color.Blue);
            
            cemberdolgu.FillEllipse(dolguyesil, 141, 61, 18, 18);
            cemberdolgu.FillEllipse(dolguturuncu, 171, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgukirmizi, 201, 61, 18, 18);
            cemberdolgu.FillEllipse(dolgumavi, 231, 61, 18, 18);
            cemberdolgu.Dispose();

        }
        delegate void sonucYazdirDelegate(string str);

        private void sonucYazdir(string str)
        {
            if (this.textBox1.InvokeRequired)
            {
                sonucYazdirDelegate d = new sonucYazdirDelegate(sonucYazdir);
                this.Invoke(d, new object[] { str });
            }
            else
            {              
                this.textBox1.Text =str;  
            }
        }

      private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string InputData;
            
            System.Threading.Thread.Sleep(20);
            InputData = port.ReadExisting();
            System.Threading.Thread.Sleep(20);
            sonucYazdir(InputData);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Cihaz açıldı";
            button1.Enabled = false;
            button2.Enabled = true;
            port.Open();
            numericUpDown1.Value = 0;
            deger = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Cihaz kapandı";
            button1.Enabled = true;
            
            dolgu0();
           
            port.Write("s");
            port.Close();
            button2.Enabled = false;
            progressBar1.Value = 0;
            //numericUpDown1.Value = 0;
            deger = false;
        }


        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void progressBar1_Click(object sender, EventArgs e)
        {

        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

            if (deger == true)
            {
                progressBar1.Value = (int)numericUpDown1.Value;
               if ( progressBar1.Value == 0)
                {
                    izci1 = true;
                    izci2 = true;
                    izci3 = true;
                    izci4 = true;
                   
                    dolgu0();
                    port.Write("s");
                    
                   
                }
               else if (progressBar1.Value >= 1 && progressBar1.Value <= 25&&izci1)
               {
                   
                   izci1 = false;
                   izci2 = true;
                   izci3 = true;
                   izci4 = true;
                   
                   dolgu1();
                   port.Write("y");
                    
                }
          
                else if (progressBar1.Value > 25 && progressBar1.Value <= 50&&izci2)
               {
                   izci1 = true;
                   izci2 = false;
                   izci3 = true;
                   izci4 = true;
                    
                   dolgu2();
                   port.Write("t");
                   
                }
                else if (progressBar1.Value > 50 && progressBar1.Value <= 75&&izci3)
               {
                   izci1 = true;
                   izci2 = true;
                   izci3 = false;
                   izci4 = true;
                   
                   dolgu3();
                   port.Write("k");
                   
                }
                else if (progressBar1.Value > 75 && progressBar1.Value <= 100&&izci4)
               {
                   izci1 = true;
                   izci2 = true;
                   izci3 = true;
                   izci4 = false;
                   
                   dolgu4();
                   port.Write("m");
                 
                }

            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics cember = e.Graphics;
            Pen p = new Pen(Color.Black, 2);
            
            cember.DrawEllipse(p, 140, 60, 20, 20);
            cember.DrawEllipse(p, 170, 60, 20, 20);
            cember.DrawEllipse(p, 200, 60, 20, 20);
            cember.DrawEllipse(p, 230, 60, 20, 20);
            Brush dolgu_bos = new SolidBrush(Color.White);
            cember.FillEllipse(dolgu_bos, 141, 61, 18, 18);
            cember.FillEllipse(dolgu_bos, 171, 61, 18, 18);
            cember.FillEllipse(dolgu_bos, 201, 61, 18, 18);
            cember.FillEllipse(dolgu_bos, 231, 61, 18, 18);
            cember.Dispose();
        }

    }
}


    Uygulamamızın videosunu aşağıdan izleyebilirsiniz.



   İyi günler dilerim...

3 yorum:

  1. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  2. Projelerinizi sürekli takip ediyorum. Bu proje de diğerleri gibi güzel olmuş paylaşımlarınızın devamını bekliyorum.

    YanıtlaSil
  3. İlginiz için teşekkür eder, başarılar dilerim...

    YanıtlaSil