C# tan PIC e veri gönderme sorunu

Başlatan Magic_Key, 13 Aralık 2015, 13:17:35

Magic_Key

Arkadaşlar C# tan rs232 seri iletişim yoluyla PIC e veri gönderirken sorun yaşamıyorum ama PIC ten C# a veri gönderirken sorunla karşılaşıyorum. Sorunu özetlemek gerekirse C# tarafından butona basıldığında PIC ten "Veri Gonderildi..." iletisini göndermek istiyorum. Butona ilk basıldığında veri düzgün geliyor ama ikinci basışımda "eri Gonderildi..." üçüncü basışımda "Gonderildi..." dördüncüde "..." böyle gidiyor. Ben her basışımda "Veri Gonderildi..." yazısını textbox a yazmak istiyorum. Yardımlarınız için şimdiden teşekkür ederim.

CCS C kodu:
#include <lcd_sicaklik.h>
#include <lcd.c>

int veri;

unsigned long int deger;
float voltaj, sicaklik;

#int_rda
void kesme()
{
disable_interrupts(int_rda);
veri=getch(); 
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_a(0x01);
set_tris_b(0x00);

lcd_init();

setup_adc(adc_clock_div_32);
setup_adc_ports(AN0);

set_adc_channel(0);
delay_us(20);

enable_interrupts(GLOBAL);
int z=0;
   while(TRUE)
   {
    lcd_send_byte(0,0x0d);
    enable_interrupts(int_rda);
   
    deger=read_adc();
    voltaj=(0.0048828125*deger)*1000;
    sicaklik=(voltaj/10)+2;
    lcd_gotoxy(1,1);
    printf(lcd_putc,"Sicaklik=%5.1f",sicaklik);
       
  if(veri==10)
  {
  z++;              //veri her gönderildiğinde 1 değer arttırılıp lcd ye yazılıyor.
  veri=0;                   // bir sonra ki gönderim için sıfırlanıyor.
printf("VERI GONDERILDI...\n");            //PIC e göndermek istediğim ifade
       lcd_gotoxy(1,2);
      // printf("%f5.1",sicaklik);                //ilk sorunu halledersem sicaklik değerini göndereceğim
       printf(lcd_putc,"Veri=%d",z);          //verinin gönderilişini test etmek için yazdım
  } 
}
}

C# kodu:
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;

namespace Sicaklik
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Enabled = false;
        }

        private void Baglan_Click(object sender, EventArgs e)
        {
            try
            {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                    PortName.Text = "PortName:" + serialPort1.PortName;
                    BaudRate.Text = "BaudRate:" + serialPort1.BaudRate;
                    DataBits.Text = "DataBits:" + serialPort1.DataBits;
                    Parity.Text = "Parity:" + serialPort1.Parity;
                    StopBits.Text = "StopBits:" + serialPort1.StopBits;
                    HandShake.Text = "HandShake:" + serialPort1.Handshake;

                    Sicaklik.Enabled = true;
                    textBox1.Enabled = true;
                }
            }
            catch (Exception hata)
            {
                MessageBox.Show(hata.Message);
            }
        }

        private void Kopar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                PortName.Text = "PortName:";
                BaudRate.Text = "BaudRate:";
                DataBits.Text = "DataBits:";
                Parity.Text = "Parity:";
                StopBits.Text = "StopBits:";
                HandShake.Text = "HandShake:";

                Sicaklik.Enabled = false;
                textBox1.Enabled = false;
            }
        }

        string gelen_veri;
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            gelen_veri = serialPort1.ReadExisting();

        }
        byte[] veri = { 0 };

        private void Sicaklik_Click(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;       //çakışan threadleri önlemek için
            textBox1.Text = gelen_veri.ToString();           // sicaklik butonuna bastığımda textboxta Veri Gönderildi... verisini yazmak için
        }

        private void Gonder_Click(object sender, EventArgs e)
        {
            veri[0] = 10;                                            //Gonder butonuna basıp veriyi 10 yapıyorum ve PIC e gönderiyorum sonra Sicaklik butonuna basınca
                                                                            //PIC o değeri kontrol edip Veri Gonderildi yazısını gönderiyor.     
            serialPort1.Write(veri, 0, 1);
        }
    }
}

Gökhan BEKEN

Mcu ile veri gönderirken verinin sonuna enter karakteri ekleyin.
c# kısmında ise gelen_veri = serialPort1.ReadExisting(); değil gelen_veri = serialPort1.ReadLine(); kullanın.
Özel mesaj okumuyorum, lütfen göndermeyin.

Magic_Key

Teşekkür ederim. Dediğinizi yapınca sorun çözüldü :)

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

muhittin_kaplan

vb.crlf
(carriage return + line feed)

"key(13)"

dür.

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir