C# ile Seri Port İletişim

Başlatan vitruvius, 19 Nisan 2011, 19:11:41

vitruvius

Öncelikle çok teşekkür ederim, çok güzel bir yöntem gösterdiniz. Yolladığım datayı bilgisayarda görmek için serialPort1.Readline(); gibi bir komut mu yazmam gerekiyor? Bir de PC'nin TX ucu dediğiniz CONN-D9F'in 3 numaralı ucu mu oluyor?

kudretuzuner

Merhaba
Max232 ve rs232(D9) sizin şemanızda gördüğüm kadar doğru bağlanmış.2,3 diyerek yanıltmayayım.
Amatör

kudretuzuner

Merhaba
Komple full kod verme adetim yok (gençlerin çalışıp araştırıp kendilerinin bulması için)fakat işiniz uzayacağı için yardımcı olayım.Ama ben VB Net 2008 express edition kullanmaktayım.
Public Class Form1

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Me.Close()
    End Sub



    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Label1.Text = Len(TextBox1.Text)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SerialPort1.PortName = ComboBox1.Text
        SerialPort1.Open()
        Button1.Enabled = False
        Button3.Enabled = True
        Button2.Enabled = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        SerialPort1.WriteLine(TextBox1.Text)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.Text = "COM3"
        Button3.Enabled = False
        Button2.Enabled = False

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        SerialPort1.Close()
        Button1.Enabled = True
        Button3.Enabled = False
        Button2.Enabled = False

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim gelen As String = SerialPort1.ReadLine

        If gelen = "kudret" Then
            PictureBox1.BackColor = Color.Red
            Exit Sub
        End If

        MsgBox(gelen)
    End Sub
End Class
text box'a "kudret" yazar da data doğru giderse picture box kırmızı oluyor.Kolay gelsin
https://rapidshare.com/files/459834929/data_yollama.rar
Amatör

vitruvius

Ehehe birkaç gündür sorularımla bıktırdım sizi farkındayım, sabrınıza hayranım. Ancak aynı adetten komple kodlara son anda bakarım, çünkü yapmak değil öğrenmek istiyorum. Sorularım bitmeyecek yani  :) Size ne kadar teşekkür etsem azdır.

yamak

Dostum bir de şunu dener misin rx ucuna 100 ohm ile beraber bi led bağlayıp bilgisayarda hazırladığınız formdaki butona basıldığında ledte herhangi bir yanıp sönme oluyo mu?

yamak

Bir de benim daha önceden hazırladığım bi uygulama var dı hi-tech c de yazılmış kodlarına bir bak istersen belki senin için bir ip ucu olur.Anladığım kadarıyla c# kısmında bir sorun yok tabi serialport un property lerini doğru ayarlamışsanız.
#include <htc.h>
#include <delay.c>
#include <yusuf_lcd.c>
#include <yusuf_usart.c>
#include <stdio.h>
#include <stdlib.h>
void
main(void)
{
	unsigned char c,c1=0,c2,c3=0,i=10,k=0,q=0;
	unsigned char f[]="";
	unsigned char g[]="";
	int a;
	TRISD=0;
	PORTD=0;
	ADCON1=7;
	TRISA=0;
	PORTA=0;
	TRISB=0;
	PORTB=0;
	TRISC=128;
	PORTC=0;
	CCP1M0=1;
	CCP1M1=1;
	CCP1M2=1;
	CCP1M3=1;
	TOUTPS0=1;
	TOUTPS1=1;
	TOUTPS2=0;
	TOUTPS3=0;
	T2CKPS0=1;
	T2CKPS1=1;
	CCPR1L=16;
	CCP1X=0;
	CCP1Y=0;
	CCPR2L=125;
	CCP2X=0;
	CCP2Y=0;
	TMR2ON=1;
	lcd_hazirla();
	lcd_temizle();
	usart_hazirla();
	while (1){
		c=usart_al();
		if(k==1&&c!='+'&&c!='\n')
		{
		sprintf(f,"%c",c);
		c2=atoi(f);
		c3=c3+c2*i;
		i=1;
		}
		if(c=='!')
		{
		k=1;
		}
		if(c=='+')
		{
			c1=c3;
			i=10;
			k=0;
			c3=0;
		}
	    if(c=='#')
		{
			lcd_gotoxy(2,1);
			continue;
		}
		if(c=='&')
		{
			lcd_gotoxy(1,1);
			continue;
		}
		if(c=='x')
		{
			lcd_temizle();
		    continue;
		}
		if(c=='W')
		{
		  PORTA=1;
		  continue;
		}
		if(c=='Q')
		{
			PORTA=2;
			continue;
		}
		if(c=='V')
		{
			PORTA=0;
			continue;
		}
		if(c=='x')
		{
			PORTA=0;
			continue;
		}
		
	    if(c=='\n')
		{
			continue;
		}
		if(c!='!'&&c!='+')
		{
		veri_gonder(c);
		}
		PORTD=c1;
		PR2=250-c1*10;
		}
		}

vitruvius

Alıntı yapılan: dumansiz - 30 Nisan 2011, 00:03:30
x=getc();
Bu fonksiyon veri gelene kadar kodu aynı satırda bekletiyor mu?
Bekletmiyorsa; while döngüsü içerisinde LCD ye sürekli bir şey yazdığınızdan veri LCD de görünmüyor olabilir mi?
Bir de C# da kullandığınız serialport nesnesinin özelliklerine baktınız mı? Hızı(9600) ve haberleşme kuralları(8N1) aynı mı?

Alıntı YapCcs c de mesela getc(); yazıp bilgiyi almak istiyoruz ya, bu komut buton tarama komutu vs. gibi sürekli döngü şeklince çalıştırılmıyor.Mesela sen void main içerisine getc(); yazdın diyelim. Pic bunu gördüğünde veriyi beklemeye başlıyor yani rs232den veri gelinceye kadar programı kesiyor gibi birşey alt satırları çalıştırmıyor. diyelim ki sen bir display sürüyorsun pic ile display kodlarından önce getc(); yazdın, pic bilgi beklediği için display kodlarını çalıştırmayacaktır.

Böyle bir bilgi buldum, sanırım bununla alakalı sorunum? Serialport nesnesinin özellikleri ayarlı. Teşekkürler.

Yamak bey sizin dediklerinizi de uygulayacağım ancak led'in yanıp sönmesi için ekstradan bir kod yazmam gerekmez mi? Teşekkürler.

yamak

Hayır gerekmez siz pc den veri gönderdiğinizde orada bir gerilim oluşuyo zaten.Yani bir kare dalga rx hattından bundan dolayı veriyi gönderdiğinizde ledte yanıp sönme olması lazım.

vitruvius

Dediğinizi denemek için devreyi şu şekilde kurdum fakat led'de bir değişiklik olmadı.


yamak

Veri pc den pic e geldiği için bağladığınız şekilde devreyi açık devre haline getirmiş olursunuz.rcx ucuyla toprak arasına led ile direnci seri olacak şekilde bağlayıp dener misini?Yani led in anot u pic tarafnda olacak şekilde.

vitruvius

Bu şekilde mi olmalı yani? Yine led'te bir değişiklik olmadı.


yamak

Siz bunu simülasyonde denemiyosunuz di mi gerçek devre üzerinde deniyosunuz?

vitruvius

Yok hayır simülasyonda deniyorum =) Demiştim Isis'te açıyorum çalıştırıyorum, sonra C#'ı açıyorum diye... O şekilde yapamaz mıyız?

yamak

Ben böyle uygulamaları hep gerçek devre üzerinde gerçekleştiriyorum sizin de öyle yapmanızı öneriririm.Eğer proteusta yapmak isterseniz illa da seriport konektörünün yerine compim diye bi tool var onu kullanının.

vitruvius

Bu compim'deki rxd ucunun (2 nolu pinin) sarı yanması bir sıkıntı olduğunu gösteriyor değil mi? En azından butona bastığımda yeşil olan rxd kırmızı oluyor, yani iletişim var. Bir de compim'in özelliklerinde physical özellikler ile virtual olanların arasındaki fark ne? Ben ikisini de aynı ayarladım. C#'taki seriport COM2 kullanıyor, compim'deki virtual ve physical portları da COM1 olarak ayarladım bilmiyorum doğru mu yaptım.

Önerinizi dikkate alıp pazartesi günü gerekli ekipmanları alacağım. Merak ettiğim pic'e programı kaç defa silip yükleyebiliriz ve bu işlem için hangi cihazı ve programı önerirsiniz? Teşekkürler.

Simulasyon çalışırken bir resim aldım, ufak kırmızı,sarı, mavi ve gri renkteki kutucukları nasıl yorumlayacağımı tam bilmiyorum çünkü. Sarı yanması bir sıkıntı olduğuna işaret sanırım.