seri porttan gerçek zamanlı veri okuma yardım.

Başlatan cebeci52, 06 Eylül 2014, 17:48:32

cebeci52

arkadaşlar ölçtüğüm gerilim bilgisini seri porttan sürekli okuyup textbox yada listbox a yazdırmak istiyorum. Bir türlü okuyamadım yardımcı olur musunuz?

kodlar şu şekilde C# tarafı

  private void Form1_Load(object sender, EventArgs e)
        {

            string[] portlar = SerialPort.GetPortNames();  // portları dizi halinde aldık

            foreach (string port in portlar)
            {

                comboBox1.Items.Add(port.ToString()); // Portlarımızı combobox ın içine aldık.

            }

            CheckForIllegalCrossThreadCalls = false;
           
            this.WindowState = FormWindowState.Maximized;
                     
                                 
        }

private void buttonStart_Click(object sender, EventArgs e)
        {

            if (serialPort1.IsOpen) // Bağlantıyı açıyoruz.eğer önceden bağlan butonuna basmış isek yani bağlantıyı açmışsak aşağıdaki hata mesajını verecektir.
            {

                MessageBox.Show("Port Açık Bulunmaktadır..", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);

                return;

            }

            else
            {

                try
                {

                    serialPort1.BaudRate = int.Parse("9600"); // Hız olarak 9600 verdik.

                    serialPort1.DataBits = int.Parse("8"); // Veri bit ini de 8 bit olarak verdik

                    serialPort1.StopBits = System.IO.Ports.StopBits.One; // Durma bitini tek sefer olarak verdik.

                    serialPort1.Parity = Parity.None; // eşlik bit ini vermedik.

                    serialPort1.PortName = comboBox1.Text; // Port adlarını comboboxtan alıyoruz.

                    serialPort1.Open(); // Bağlantıyı açıyoruz

                    MessageBox.Show("Bağlantı Başarılı");

                }

                catch (Exception) // Herhangi bir hata anında alttaki hata mesajını alacağız..
                {

                    MessageBox.Show("cihazınız bağlı değil...", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);

                }

            }
      }

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
           

           byte[] buffer;

            buffer = new byte[1];

            serialPort1.Read(buffer, 0, 0);

            string veri = serialPort1.ReadExisting();
           
            textBox1.Text = veri;
                   
                     
        }


cebeci52

üstat inceledim onları aynı bişey değişmedi veriyi bozuk okuyor yada ????(soru işareti) şeklinde okuyor.

omereliusuk

Eger veri hex olarak geliyorsa 127 ye kadar dogru okur. Uzeri degerleri ise size sacmaliyor gibi gelir. Ama gercekte dogru okuma yapar.

Gökhan BEKEN

Gelen her veride kesmeye girdiğinden emin misiniz?
c# ile kesme neden çalışmaz? Cevabı burda:


Eğer kesmeye girdiği halde bozuk geliyorsa baudrate ayarını kontrol edin.
Özel mesaj okumuyorum, lütfen göndermeyin.

cebeci52

#5
üstat veri listbox a aldıgımda şu şekilde gözküküyor




kesme derken nasıl anlamadım.


mesaj birleştirme:: 06 Eylül 2014, 21:52:58

kodlarımı şu şekilde düzelttim yine de aynı

private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.SelectedItem.ToString();
            serialPort1.BaudRate = 9600;

            serialPort1.Open();
           serialPort1.DataReceived += serialPort1_DataReceived;

           
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
              //  timer1.Enabled = true;

               
            }
}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
           

           string line = serialPort1.ReadExisting();
           this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
           

        }

private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {

            listBox1.Items.Add(line);
            textBox1.Text = line;
         }


        textbox yada list box a düzgün gelmiyor veri.

Gökhan BEKEN

#6
MCU nasıl gönderiyor veriyi?

mesaj birleştirme:: 06 Eylül 2014, 22:06:27

Seriport terminal programlarından birisi ile denediniz mi? Terminale baktığınızda düzgün görebiliyor musunuz?
Özel mesaj okumuyorum, lütfen göndermeyin.

omereliusuk

#7
Eger o veriler dogru ise sizin son bytelik veri gecikiyor. O yuzden veriyi dogru aliyorsunuz ama yanlis satirda goruyorsunuz. Eger veriyi siz gonderiyosaniz veriyi gonderdikten sonra kucuk bir delay ekleyin. C# ta hqrhangi bir sorun yasamazsiniz.
Verinizin sonuna \r eklemeyi unutmayin

cebeci52



terminale düzgün geliyor bozulma yok C# da textbox yada list box a alınca bozuk gösteriyo sebebini anlamadım. sorun mikrodenetleyici tarafında olmasa gerek..



omereliusuk


omereliusuk


cebeci52

#11
üstat nerenin sonuna anlamadım

mikrodenetleyici kodlarım şu şekilde

int sayi=0,mV=0;
char txt[64],volt[64],kk;
char gelen,i=0;

int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
  temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}

void LCD_Yaz(int okunan_deger)
{
mV=okunan_deger*0.7130;
if(mV>=10000)
  volt[0]=(mV/10000)+48;
  else volt[0]=' ';
  volt[1]=(mV%10000)/1000+48;
  volt[2]='.';
  volt[3]=(mV%1000)/100+48;
  volt[4]=(mV%1000)%100/10+48;
  volt[5]=(mV%1000)%100%10+48;

  Lcd_Out(2,1,volt);
  Lcd_Out(2,8,"V");


  }
  void usb_yaz()
  {
    char i=0;
    for(i=0;i<8;i++)
    txt=volt;
    UART3_Write_Text(txt);

  }
  void usb_kesme()
  {
   // kk=UART3_Read();
   // if(kk=='v')
    usb_yaz();
  }
 
   void main()
   {
   GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
   GPIOE_ODR.B9=0;
   
   UART3_Init_Advanced(9600,_UART_8_BIT_DATA, _UART_NOPARITY,_UART_ONE_STOPBIT, & _GPIO_MODULE_USART3_PD89);
   
   Lcd_init();
   ADC1_init();
   ADC_Set_Input_Channel(_ADC_CHANNEL_1);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Out(1,1,"Voltmetre");
   while(1)
   {

   sayi=ADC_Olcum(1);
   LCD_Yaz(sayi);
   usb_kesme();

   
   }

mesaj birleştirme:: 06 Eylül 2014, 22:26:20





mikrodenetleyici tarafına delay_ms(100); ekledim veri üstteki  gibi C# a bozuk geliyor

/r dedigini nereye ekleyecem

omereliusuk

#12
void usb_yaz()
  {
    char i=0;
    for(i=0;i<8;i++)
    txt=volt;

txt[8]=0x0d;


    UART3_Write_Text(txt);

cebeci52

orası tam olarak şu şekilde yapıştırınca çıkmamış burda nereye eklemem gerekiyor.




omereliusuk


void usb_yaz()
  {
    char i=0;
    for(i=0;i<8;i++)
    txt=volt;

txt[8]=0x0d;


    UART3_Write_Text(txt);
}