Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Seri porttan veri gönderme

Başlatan baran123, 19 Mayıs 2014, 23:26:31

baran123

Seri porttan 1 ve 0 değerlerini göderip pıc ıle led yakıp söndürmek istiyorum usb to ttl çevirici kullanacağım fakat yaptıgım uygulamaları simle etmenin yolu var mı bilmiyorum aşşağıda paylaştım bu kodlarla led yakıp söndürebilir miyim ?


c# arayüzüm
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.IO;

namespace SeriPort
{
    public partial class Form1 : Form
    {
        SerialPort SerialPort1;
        public Form1()
        {
            InitializeComponent();
        }
        private void OkumaFonksiyonum(object s, SerialDataReceivedEventArgs e)
        {
            int bytes = SerialPort1.BytesToRead;
            // Create a byte array buffer to hold the incoming data
            byte[] buffer = new byte[bytes];
            // Read the data from the port and store it in our buffer
            SerialPort1.Read(buffer, 0, bytes);
            if (buffer[0] == 0xBB)
            {
                textBox1.Text = "LED On";
            }
            else if (buffer[0] == 0xCC)
            {
                textBox1.Text = "LED Off";
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            SerialPort1 = new SerialPort();
            SerialPort1.DataReceived += new SerialDataReceivedEventHandler(OkumaFonksiyonum);
            baudRate.SelectedItem = "1200";
            portName.SelectedItem = "COM3";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                SerialPort1.PortName = portName.Text.ToString();
                SerialPort1.BaudRate = Convert.ToInt32(baudRate.Text.ToString());
                SerialPort1.DataBits = 8;
                SerialPort1.Parity = Parity.None;
                button1.Enabled = false;
                button2.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Seri Port", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        int control = 0;
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (control == 0)
                {
                    control = 1;
                    if (SerialPort1.IsOpen == false)
                    {
                        SerialPort1.Open();
                        button2.Text = "Port Kapat";
                        button3.Enabled = true;
                        baudRate.Enabled = false;
                        portName.Enabled = false;
                    }

                }
                else
                {
                    SerialPort1.Close();
                    control = 0;
                    button2.Text = "Port Aç";
                    button3.Enabled = false;
                    baudRate.Enabled = true;
                    portName.Enabled = true;
                    textBox1.Text = "";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Seri Port", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void baudRate_SelectedIndexChanged(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
        }

        private void portName_SelectedIndexChanged(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] data = { 0xAA };
            SerialPort1.Write(data, 0, 1);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (SerialPort1.IsOpen)
            {
                SerialPort1.Close();
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}


c kodum
#include <16F628a.h>
#fuses NOWDT,XT,NOPUT,PROTECT,NOBROWNOUT,MCLR,NOLVP,NOCPD            
#use delay(clock=4M)
#use rs232(baud=9600, parity=N, xmit=PIN_B2, rcv=PIN_B1, bits=8, stop=1)

int data;
int1 control = 0;

void main()
{
   while(TRUE)
   {
      data=getch();
      
      if(data == 0xAA)
      { 
         control++;
      }
      
      if(control == 1)
      {
         output_high(PIN_B7);
         putc(0xBB);
      }
      
      else
      {
         output_low(PIN_B7);
         putc(0xCC);
      }
   }
}

Kabil ATICI

Oradaki tek sıkıntı USB seri bağdaştırıcı kullandığın zaman COMx'un doğru olduğuna emin ol.

Programdan çıkarken seri portu kapat. (C# için)
ambar7

baran123

#2
hocam dönüştürücüyü taktığım zaman aygıt yöneticisinden comx in kaç olduğunu öğrenebilirim sanırsam kodda herhangi bir problem var mı ?
edit : bide programdan çıkarken kapatma olayını c# da form closing ventine mi yazaağım

vitruvius

Sorgulamayı Data==1 şeklinde yapmak gerekmez mi?

baran123

doğru ya, == yaptım ama iflerin olduğu satırda code has no effect diyor c#kodunu ve c kodunu güncelledim

Kabil ATICI

C# üzerinde
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
           {
               if (serialPort1.IsOpen)
               {
                   serialPort1.Close();
               }
           }

gibi bir şey olabilir. Bunun birkaç yolu var. Sonuçta form kapanırken seri portu kapatmak.
ambar7

baran123

hocam dediğinizi ekledim bide internetten başka bir arayüz buldum ve biraz değiştirdim dediklerinize göre programda bir sorun var mı bide bunu proteusda deneme imkanım var mı ? yanı c#da bu program açıkken proteus da acık olacak arayüzde led toggle a basacağım proteusda led durumu değişecek böyle deneme imkanım var mı

vitruvius

C# kısmına bakmadım ama pic tarafındaki hatalarını söyleyeyim.

Hangi portu kullanuyorsan aşağıdaki kodu eklemeyi unutma.
#use fast_io(b)


set_tris_b(0x00);

Burada sıkıntı var. Rx pini input'tur, çıkış olarak tanımlamamalısın. Aksi takdirde data alamazsın.

if(Data == '0');

";" koyma if'lerden sonra.

Dediklerimi yaparsan programın çalışıyor. C# ile denemedim, Realterm ile 1-0 yollayıp simule ettim. İlerisi için bir tavsiyede bulanayım, seri iletişim kesmesi kullan.

baran123

teşekkürler deneyeceğim yeni bir proje buldum netten kodları güncelledim tekrar böyle yapsam çalışır mı ?

vitruvius

C#'ta sorun yoksa ve dediğim tris ayarını yaparsan çalışıyor.

baran123

tamamdır çok teşekkür ederim :)