Seriport hakkında her şey

RS232(Seri port) iletişimi


1-    HİKAYE

Bu kısımda sık sık karşımıza çıkan eğer bilmiyorsak çoğu zaman çaktırmadan biliyormuş gibi bir tavır ürettiğimiz aslında oldukça yanlış bildiğimiz bazı ayrıntı görünen ama işin mantığını anlamamız açısından önemli olan kavramları işleyeceğiz.

 

Seriport: Masaüstü bilgisayarlarda bulunan, 9 adet pini olan, eski tip yazıcılarda, mouse’larda, modemlerde ve birçok cihazda bilgisayara bağlamak için kullanılan ve tabiki bizim yani hem bilgisayar yazılımcısı hemde elektronik devre tasarımcılarının sık sık kullandığı bir… bir …. nedir ya cümlenin sonunu getiremedim, neyse bir porttur 😀 Yeni tip bilgisayarlarda bulunmuyor malesef, komplo teorisi yürütecek olursak herhalde usb/rs232 çevirisi satan firmalarla anlaştıkları için bilgisayar üreticileri koymuyor bu portu ürettikleri bilgisayarlara. 😀

 

 

Rs232:

Bildiğimiz seri porttur işte, öğrenmek gerekir, bir çok dijital cihazın ayarlarını yapmamız için bilgisayara bağlamamızda kullanılır. Yeni nesil cihazlar USB ile haberleşsede rs232 hala bir çok cihazda kullanılıyor ve de kullanılacak

Uart: Universal Asyncronous Receiver Transmitter demektir. Sizin anlayacağınız seri port’un işlerini yürüten çiplere denir. Bir çok mcu’da dahili olarak vardır. Ancak yazılımsal olarakta seri iletişim kullanılabilir, tabiki donanımsal olması herzaman daha iyidir.

Usart: Universal Synchronous Asynchronous Receiver Transmitter demektir. “Synchronou “ kısmı senkron anlamına gelir. Anlayacağınız, UART’ın senkronize iletişim destekleyenidir. Peki senkron ne demek? Dataları clock eşliğinde göndermektir,  normalde TX,RX ile haberleşmeyi sağlayabiliriz ama senkron modunda bir tane de clock pini de ilave edilir ve datalar clock ile adından da anlaşıldıgı gibi senkronize edilerek gönderilir.Biz haberleşmemizi clocksuz yapacağız.

Paralel İletişim:

Digital olarak kodlanmış bilginin tüm bitleri aynı anda transfer ediliyorsa buna “paralel veri iletimi “ denir. Paralel veri iletiminde iletilecek bilginin her biti için ayrı bir kablo bağlantısı sağlanır. Seri veri iletiminde, bir kerede bir karakterin sadece biri iletilir. Alıcı makine doğru haberleşme için karakter uzunluğunu, start – stop bitlerini ve iletim hızını bilmek zorundadır.

Seri İletişim:

Seri iletim bilginin tek bir iletim yolu üzerinden n bit sıra ile aktarılmasıdır. Bilgisayar ağları üzerindeki iletişim seri iletişimdir.

Herhangi bir iletişim yönteminde  kullanılan terimler:

a-Full-dublex seri iletişim:

Bu yöntemde her iki taraf da alıcı ve verici olarak çalışır.Yani aynı anda veri gönderip alabilirler.Telefon konuşmaları gibi.

b-Half-dublex seri iletişim:

Bu yöntemde de her iki taraf alıcı ve verici olarak çalışabilir.Fakat biri veri göndeririken diğer dinlemek zorundadır.Aynı anda karşı taraf veri yollayamaz.Telsiz konuşmaları gibi.

c-Simplex seri iletişim:

Bu yöntemde bir taraf verici bir taraf alıcıdır.Değişmesi mümkün değildir.Radyo yayınları gibi.

Not:Bu örnekler seri iletişim örnekleri değildir.Sadece iletişim formatını açıklamak için verilmiştir.

2-Rs232 için kullanılan entegreler ve datasheetleri:

Öncelikle neden bir çevirici entegreye ihtiyacımız var?

Birçok mikrodenetleyici 5 volt ile çalışır. Bu mikrodenetleyicilerin high Kabul ettiği değer 5v, low Kabul ettikleri değer ise 0volt yani gnd dir buna TTL seviye denir. Bilgisayar seri portu için high +12 V low -12 V civarıdır. Bu durumda bilgisayar ile mcu devremizi direkt bağlamamız uygun değildir.Kullandığımız çeviriciler seri port ile TTL devrelerin çalışabilmesini sağlayan birer entegredir. Örnek olarak max232, 5volt ile çalışan cihazlarla pc arasındaki çevirici işini yapar. 3.3 volt ile çalışan cihazlar için ise max3232 entegresini kullanabiliriz. Çoğu pic 3.3 volt ile de çalışabildiğinden(örneğin 16f628A) max3232 entegresini bu şekildede kullanabilirsiniz. LF serisi picler ise düşük voltaj ile çalışan piclerdir. Bu serideki picleri(örn: 16LF628) de bu entegre ile bilgisayarla konuşturabilirsiniz. Uzun Lafın Kısası= ULK J

3.3v için max3232

Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf

5v için max232

Datasheet: http://www.ti.com/lit/ds/symlink/max232.pdf

Çevirici entegre yerine transistör kullanmak:

en büyük eksisi max232 kadar yüksek hızlara çıkamaması.

3-Rs232 nin kablosu, konnektörü ve pinleri:

Aşağıdaki çizim max3232 veya max232 nin iç yapısının anlaşılması için tarafımdan çizilmiştir. 11 ve 12. Pinlere 1. Cihazı, 9. Ve 10. Pinlere ise 2. Cihazı bağlarız.  13 ve 14 pinlerine 1. Pc yi. 7 ve 8. Pinlerine ise 2pc yi bağlarız.  1. Pc den gelen veriler 11 ve 12. Pinlerden 1. Cihaza ulaşır. 2.pcden gelen veriler 9. Ve 10. Pinlerden 2. Cihaza ulaşır.

Pinlerin isimleri aklınızı karıştırabilir. Pin isimleri bilgisayara göre değil cihazlara göre aklınızda tutarsanız unutmazsınız.

11 pini “t1 in” dir bu pine alıcının tx pini girer ve alıcıdan 11. Pine giren tx verisi 14. Pinden(t1out) çıkarak PC nin RX pinine(konnektörün 2. pinine) girer.

13. pin “r1in” pinidir. Cihazımızın rx pinine girecek veriyi buraya bağlarız. Yani pc nin tx’i bu pine girer, ordan da voltaj seviyesi ayarlanarak 12. Pinden cihazımızın rx’ine ulaşır.

7,8,9 ve 10 pinleride aynı şekilde düşünebilisiniz bu kısma size bırakıyorum.

Aşağıdaki şemada p3 ve p4 sadece alıcı durumundadır. TX pinleri bağlı olmadığından gönderme yapamazlar. TX pinleri bağlı olsa idi tx ler çakışırdı bu yüzden bağlanmazlar.

4-Usb –rs232 çevirici:

Artık laptoplarda rs232 portu bulunmamaktadır. Ancak bu bizim için bir engel değildir, USB portundan rs232 çeviren cihazlar vardır. Laptoplarda kullanılmak üzere USB/RS232 çevirici cihaz:

5-Rs232 nin pic lerde kullanımı için örnek kodlar(css c):

CCS C yazılımı(Yazan: Serdar Çiçek):

/******************************************************

PIC16F877 ile RS232 Seri İletişim Uygulaması

PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı

*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve

// TX,RX uçlarının hangi pinler olacağını tanımlıyor

// parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

char   klavye[80];  // klavye isminde 80 üyeli bir dizi tanımlanıyor

#int_rda   // RX ucuna veri gelince meydane gelen kesme

void serihaberlesme_kesmesi ()

{

disable_interrupts(int_rda); // int_rda kesmesini pasif yap

output_high(pin_c5);  // RC5 çıkışı lojik-1

gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.

printf("\n\rYazdiginiz Metin>  %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla

printf(lcd_putc,"\f%s",klavye);  //LCD'yi temizle ve klavye string ifadesini LCD'de göster

output_low(pin_c5); // RC5 çıkışı lojik-0

printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )

{

setup_psp(PSP_DISABLED);        // PSP birimi devre dışı

setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı

setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı

setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok

setup_adc(ADC_OFF);             // ADC birimi devre dışı

setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı

setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor

lcd_init();   // LCD'yi hazırla

printf("\r**************** Merhaba *********************"); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.

printf("\n\rKlavyeden girdiginiz bilgiler LCD'de gorunecektir\n\n"); // Satır atla, yeni satır, RS232 üzerinden belirtilen metni gönder

printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver

while(1) // Sonsuz döngü

{

enable_interrupts(int_rda); // int_rda kesmesi aktif

}

}

 

6- Tek uart ve çift uart donanımı bulunan MCU’lar

Tek UART’lı mcu için örnek  verecek olursak sıradan piclerden 16f84 olabilir.

Çift UART için 18f87k22 gibi gelişmiş PIC ler kullanılabilir. Tabi pic dedik ama ATMEL , ARM gibi mcu larında çift UART lıları vardır elbet.

Peki neden çift UART? RS232 ile haberleşmeniz gereken 2 adet cihaz var ise, çift uart kullanmanız gerekir. A cihazı ilehaberleşirken UART1’i, B cihazı ile haberleşirken UART2 yi kullanırsınız. Ancak illaki tek uart kullanmanız gerekirse, dipswitch ile kullanıcının seçim yapmasını sağlayabilirsiniz, olmadı master/slave ilişkisi kurabilirsiniz.

18F87k22’nin rs232 pinleri:

Not: 18f87k22 için hazırladığım dökümanı okumak için tıklayınız: http://gokhanbeken.com/?p=735

Dip switch:

Master/Slave ilişkisi:

7-Sanal seri port programları:

Tera Term programından bir görüntü:

İndirme linki: http://logmett.com/index.php?/download/tera-term-477-freeware.html

8-Rs232 ve rs485 in farkı:

1-Rs485 protokol değil haberleşme fiziksel arayüzüdür. Rs232 hem fiziksel olarak portu hem de protokolü anlatmakta kullanilir. Prokol: iki cihaz arasındaki haberleşme için ortak bir iletişim yöntemi demektir…

2-Rs485 sadece 2 kabloyla(tx ve rx) haberleşir, rs232 ise 3 kablo ile haberleşir(tx,rx ve gnd)

3-Rs485 rx ve tx üzerindeki gerilimler arasındaki farka bakılarak sinyal durumları hesaplandığından (yani her iki kablo birbirinin referansıdır) ve gürültü bu iki adet kabloya aynı miktarda bineceğinden gürültülü sinyal ile normal sinyal arasında taşıdığı bilgi açısından bir fark olmamaktadır. ancak rs232’de referans gnd (ground yani bildiğimiz sıfır voltaj temel referans) olduğundan gürültü kabloya bindiğinde sinyalin değerini artırıp azalttığında sinyalin taşıdığı bilgi değişim gösterebilmektedir.

4-Rs232 1200 metreye kadar haberleşme imkanı sağlar. Rs232 de bu 10metre civarıdır.

5-Rs485 ile 32 cihaz birbirine veri gönderip, birbirinden veri alabilir. Rs232 de hem veri gönderip hem very almak için sadece 2 cihaz kullanabilirsiniz. Ancak sadece 1 cihazın veri göndermesi yeterli ise diğer cihazların tümü alıcı olmak şartıyla çoklu iletişim kullanılabilir. Yani 1 sunucu olur çok sayıda alıcı olur. Alıcılar sadece okuma yapabilir very gönderemez. Çünkü sunucunun rx pinine sadece 1 adet tx pini bağlanabilir.

Gördüğünüz gibi 485 çok daha üstündür öğrenmekte fayda var. Rs485 hakkında daha fazla bilgi edinmek için dosyayı indiriniz: http://www12.zippyshare.com/v/65684380/file.html

9-Tx ve rx pinlerine bağlanan ledler(transistörler)

İletişimin gerçekleştiğini ledler ile göstermek için aşağıdaki şema veya benzer bir şema kullanabilirsiniz. Aşağıdaki şemada PNP transistör kullanıldığı için hat high olunca ledler yanar. NPN transistör kullanırsanız hat low olunca ledler yanar.

10-Pc de tx ve rx pinini birbirine bağlayarak test etmek:

Max232 veya max3232 devrenizi test etmek istiyorsunuz ancak elinizde pic yok. Ya da bir devre yaptınız sorun var, iletişim sağlanamıyor. Sorunun pic temi, çeviricidemi yoksa kullandığınız veya yazdığınız programda mı olduğunu bilmiyorsunuz. O halde ilk başta pcnin tx ve rx pinlerini hiç bir yere bağlamayın sadece birbirlerine kısa devre edin. Bu durumda pc den programla gönderdiğiniz verinin size size aynen geri gelmesi gerekir. Eğer gelmiyorsa programınızda sorun vardır. Bu aşamada sorun yoksa max232 den cihaza(pic olabilir) giden tx ve rx pinlerini kısa devre edip tekrar programdan veri gönderin eğer gönderdiğiniz veriler size tekrar geliyorsa çevirici entegre devrenizde de sorun yok demektir. Yani sorun pic teki yazdığınız programdadır.

11- Proteustaki connektörler, isisteki rs232 terminalin ayarları

Eğer isiste virtual terminalin ayarlarını yapmazsanız aşağıdaki gibi saçma değerler alabilirsiniz.

Ayarları yapmak için virtual terminal elemanına çift tıklayabilir veya sağ tıklayıp edit properties diyebilirsiniz.  Max232 kullandığımız için polarity’yi normal değil invert yani ters çevrilmiş seçmemiz gerekir. Baud rate yi de 9600 ayarlarız genelde, ancak istediğiniz gibi değiştirebilirsiniz burdan. Tabi cihazlarınızda da aynı hız ayarlı olmalı.

12-C# ta seriport veri görderme ve almak için kodlar:

Not: Projenize 1 adet buton, 1 adet textbox, 1 adet combobox ve en önemlisi 1 adet serialPort nesnesi ekleyiniz.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

namespace rs232_projesi

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

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;

/*

Textboxlar main thread'a bağlıdır, burada oluşan bir nesnedir.

Seriportun datareceived eventi kendine başka bir thread açar ve sürekli dinleme yapar ki böylece yeni data geldiğinde bunu alabilelim. Bu satırı yazmazsak: Event içinde datayı alıp, başka thread'a ait textboxa yazdırmaya çalıştığımız için derleyici "Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on." yani "Çapraz-iş parçacığı işlemi geçersiz ; hatası verir.

textbox1 bu thread üzerinde oluşturulmamış ki" mealinde birşeyler söylüyor, ee o zaman nasıl mümkün? Tabiki, bu denetimi aşağıdaki kodu form_load eventine veya form constructor'ının içine yazarak devre dışı bırakırsan.

CheckForIllegalCrossThreadCalls = false;

*/

}

void seri_port_baglan()

{

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);

}

}

}

public string trDuzelt(string a) //Türkçe karakerleri, ingilizce karakterlere çevirmek için kullanıyoruz

{

a = a.Replace("İ", "I");

a = a.Replace("Ü", "U");

a = a.Replace("Ç", "C");

a = a.Replace("Ş", "S");

a = a.Replace("Ö", "O");

a = a.Replace("Ğ", "G");

a = a.Replace("ı", "I");

a = a.Replace("ü", "U");

a = a.Replace("ş", "S");

a = a.Replace("ç", "C");

a = a.Replace("ğ", "G");

a = a.Replace("ö", "O");

return a;

}

private void seri_port_data_gonder(string gonderilecek_veri)

{

try

{

if (serialPort1.IsOpen)

{

serialPort1.Write(gonderilecek_veri);

System.Threading.Thread.Sleep(150);

//alıcı cihaza okuması için biraz süre tanımak gerek, kul yapısı sonuçta

}

}

catch (Exception)

{

MessageBox.Show("Sonuç: Başarısız !", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button3);

}

}

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

byte[] buffer;

buffer = new byte[1];

serialPort1.Read(buffer, 0, 0);

MessageBox.Show("Gelen veri:" serialPort1.ReadExisting());

// her gelen veriyi otomatik görmenize gerek yoksa bu satırın başına // koyunuz

}

private void button1_Click(object sender, EventArgs e) //veri gönderme butonu

{

seri_port_data_gonder(textbox1.text+(Char)13);

//textboxtaki veriyi, yazdığımız fonksiyon aracılığıyla rs232 den gönderiyoruz.

//char13, enterin ascii kodudur.

}

}

}

 

Yazan: M. Gökhan BEKEN

58 thoughts on “Seriport hakkında her şey

  1. gökhan textbox girilen veriyi misal olarak550 değerini int’e çevirdiğimizde bu 10 bitlik bir değer olmuş oluyor, bu değeri seirporttan nasıl gönderebilirim. 8 bit göderebiliyorum sorun yok. maskeleme ve bit kaydırma ile bu işilemin yapılabilğini öğrendim ama c# da yeniyim yardımcı olurmusun.

  2. Normal yollardan 16 bitlik veri gönderme yapılamıyor diye biliyorum. Biliğiniz üzere SPI protokolünde 16 bitlik veriler iki parça halinde göneriliyor, alıcı kısımda bu 8’er bitlik iki veriyi işliyor ve 16 bitlik tek bir veri yapıyor. Seri port için de aynısı yapılabilir.
    Örnek: 0xF1A7 gibi bir veriyi 0xF1 ve 0xA7 verilerine ayırarak gönderin bence.

  3. merhaba
    picten 4 adet bilgi (adc,sıcaklık) sürekli ekranda göstermek istiyorum.tek tek göstermede problem yok ama 4’ünü bir anda ve sürekli göstermeye çalışınca yapamıyorum nasıl bir kod yazmam gerekir.yardımcı olursanız sevinirim

  4. Merhaba @Behcet, dediğini yapmak kolay,

    picten verileri gönderirken her 4 kısmın başlarına “A=”,”B=”,”C=”,”D=” belirteçlerini koy, en sonuna da enter koy yani “\r”
    mesela: “A=50B=100C=150D=20\r”

    C# kısmına gelecek olursak
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    fonksiyonunun içine
    string mesaj = serialPort1.ReadLine();

    string bolum1 = mesaj .Substring(mesaj .IndexOf(“A=”) + 2, (mesaj .IndexOf(“B=”) – mesaj .IndexOf(“A=”)) – 2);

    string bolum2 = mesaj .Substring(mesaj .IndexOf(“B=”) + 2, (mesaj .IndexOf(“C=”) – mesaj .IndexOf(“B=”)) – 2);

    string bolum3 = mesaj .Substring(mesaj .IndexOf(“C=”) + 2, (mesaj .IndexOf(“D=”) – mesaj .IndexOf(“C=”)) – 2);

    string bolum4 = mesaj .Substring(mesaj .IndexOf(“D=”) + 2, (mesaj .IndexOf(“\r”) – mesaj .IndexOf(“D=”)) – 2);

    textbox1.text=bolum1 +” “+ bolum2 +” “+ bolum3 +” “+ bolum4 ;

    Bu sayede gelen veriyi otomatik yakalayarak, textbox1’e şunu yazacak “50 100 150 20” (tırnaklar hariç)

  5. uart1_write_text(“A=12”);
    uart1_write_text(“B=13”);
    uart1_write_text(“C=14”);
    uart1_write_text(“D=15”);
    uart1_write(10);
    picten gönderilenler,

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    string mesaj = serialPort1.ReadLine();

    string bolum1 = mesaj .Substring(mesaj .IndexOf(“A=”) + 2, (mesaj .IndexOf(“B=”) – mesaj .IndexOf(“A=”)) – 2);

    string bolum2 = mesaj .Substring(mesaj .IndexOf(“B=”) + 2, (mesaj .IndexOf(“C=”) – mesaj .IndexOf(“B=”)) – 2);

    string bolum3 = mesaj .Substring(mesaj .IndexOf(“C=”) + 2, (mesaj .IndexOf(“D=”) – mesaj .IndexOf(“C=”)) – 2);

    string bolum4 = mesaj .Substring(mesaj .IndexOf(“D=”) + 2, (mesaj .IndexOf(“/r”) – mesaj .IndexOf(“D=”)) – 2);

    textBox1.Text = bolum1 + ” ” + bolum2 + ” ” + bolum3 + ” ” + bolum4;

    }
    c# tarafı

    ama hata veriyor
    Uzunluk sıfırdan küçük olamaz.
    Parametre adı: length………

    sürekli değilde pic sorarak yani

    if(uart1_data_ready()){
    x=uart1_read();
    if (x==’A’) {
    uart1_write_text(“led0 yandi”);
    uart1_write(10);

    Led0=1;
    Led1=0;
    }
    if (x==’B’){

    uart1_write_text(“led1 yandi”);
    uart1_write(10);
    Led0=0;
    Led1=1;
    }
    c# tarafı nasıl olmalı..

    cevabın için teşekkürler..

  6. Hata veren kısımlar, yanlış gelen verilerden olabilir, çünkü biz her veriyi hep düzgün gelecekmiş gibi yazdık. try catch blokları arasına yazarsanız sorun olmaz.
    Bir dene , sonucu yaz sonra diğer sorunlarına bakalım.

    • private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {

      try
      {
      string mesaj = serialPort1.ReadLine();

      string bolum1 = mesaj .Substring(mesaj .IndexOf(“A=”) + 2, (mesaj .IndexOf(“B=”) – mesaj .IndexOf(“A=”)) – 2);

      string bolum2 = mesaj .Substring(mesaj .IndexOf(“B=”) + 2, (mesaj .IndexOf(“C=”) – mesaj .IndexOf(“B=”)) – 2);

      string bolum3 = mesaj .Substring(mesaj .IndexOf(“C=”) + 2, (mesaj .IndexOf(“D=”) – mesaj .IndexOf(“C=”)) – 2);

      string bolum4 = mesaj .Substring(mesaj .IndexOf(“D=”) + 2, (mesaj .IndexOf(“/r”) – mesaj .IndexOf(“D=”)) – 2);

      textBox1.Text = bolum1 + ” ” + bolum2 + ” ” + bolum3 + ” ” + bolum4;

      }
      catch (Exception)
      {
      label1.Text = (“mesaj hata”);
      }
      }

      c# fazla bilgim yok ama bunu demek istedin herhalde
      label1.Text = (“mesaj hata”); veriyor.

  7. Evet onu demek istedim, veri bazen düzgün gelmeye bilir, bunu önlemek için böyle birşey yaptık. Arada bir hatalı veri gelirse program çakılmasın diye…
    label kısmını silebilirsiniz. Ama program hiç düzgün çalışmıyorsa başka birşey düşünelim. Hiç mi çalışmıyor?

    • çalışmıyor.textboxt herhangi birşey çıkmıyor.
      string Gelen = string.Empty;
      private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {

      try
      {
      Gelen = serialPort1.ReadLine();

      }
      catch (Exception hata)
      {
      MessageBox.Show(“Hata:” + hata.Message);
      }
      }
      private void button3_Click(object sender, EventArgs e)
      {
      if (serialPort1.IsOpen == true)
      {
      serialPort1.Write(“A”);
      label2.Text = Gelen ;
      System.Threading.Thread.Sleep(75);

      serialPort1.Write(“D”);
      label3.Text = Gelen;
      System.Threading.Thread.Sleep(75);

      serialPort1.Write(“C”);
      label4.Text = Gelen;
      System.Threading.Thread.Sleep(75);

      }
      else
      {
      label1.Text = (“Bağlantı Açınız”);
      }

      söyle bişeyler yaptım.butona birkaç defa bastığımda label yazdırıyorum değerleri ama butonu birkac defa basarak sleep azaltığımda da label2 çıkacak olan değer label3 çıkıyor.
      benim yapmak istediğim
      seri portu açtıktan sonra bir butona basarak değerleri sürekli olarak göstermek(yukarıdaki kodda sürekli butona basmak gerekiyor.)

  8. Ben şu an sizin yazdıklarınızı tekrar okudum da, amacınız mı değişti anlamadım, benim söylediklerim ilk bahsettiğiniz 4 adet veri gönderme konusu içindi. Siz sonradan pic’e istek yaptıkça gibi birşey söylemişsiniz, yazdığınız kodları inceledim, zaten çalışması mümkün görükmüyor o şekilde.
    Şimdi ben amacınızdan ne anladığımı yazayım, doğru mu anlamışım siz söyleyin.
    PC arayüzünde, bir buton ve bir textbox olacak, siz butona bastığınızda, pic’e bir istekte bulunacak, ve pic ona 4 adet veri gönderecek, c# bu verileri ekranda gösterecek.

    • pic c#
      adc1 label1
      adc2 label2
      adc3 label3
      adc4 label4
      … ….

      bir kere butona basarak sürekli değerleri görmek istiyorum.umarım anlatabilmişimdir.

  9. c# daki butona basınca serialPort1.Write(“b”); gönderin, datareceived kısmı ilk mesajımda dediğim gibi olsun.

    pic tarafı:

    char bayrak=0;
    void UartKesmeFonksiyonu(void)
    {
    if(read==’b’)
    {
    bayrak=1;
    }
    }
    void main(void)
    {
    while(1)
    {
    if(bayrak==1)
    {
    uart1_write_text(“A=5B=10C=15D=20\r\n”);
    }
    }
    }

  10. pic tarafı

    if (x==’B’){
    UART1_write(“A=5B=10C=15D=20”);
    uart1_write(13);
    uart1_write(10);
    }

    c# tarafı
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

    try
    {
    string mesaj = serialPort1.ReadLine();

    string bolum1 = mesaj .Substring(mesaj .IndexOf(“A=”) + 2, (mesaj .IndexOf(“B=”) – mesaj .IndexOf(“A=”)) – 2);

    string bolum2 = mesaj .Substring(mesaj .IndexOf(“B=”) + 2, (mesaj .IndexOf(“C=”) – mesaj .IndexOf(“B=”)) – 2);

    string bolum3 = mesaj .Substring(mesaj .IndexOf(“C=”) + 2, (mesaj .IndexOf(“D=”) – mesaj .IndexOf(“C=”)) – 2);

    string bolum4 = mesaj .Substring(mesaj .IndexOf(“D=”) + 2, (mesaj .IndexOf(“/r”) – mesaj .IndexOf(“D=”)) – 2);

    label2.Text = bolum1;
    label3.Text = bolum2;
    label4.Text = bolum3;

    }
    catch (Exception)
    {

    }
    }

    private void button3_Click(object sender, EventArgs e)
    {
    serialPort1.Write(“B”);
    }

    }

    terminal programında denedim pic’e “B” harfini gönderdiğimde cevap olarak
    TX:B
    RX:A=5B=10C=15D=20 geliyor.

    terminal programında denedim c# “B” harfi gidiyor.

    problem label lere değerler gelmiyor.

  11. DataReceived fonksiyonunun çalıştığından emin misiniz?
    DataReceived fonksiyonun içine messagebox.show(“veri geldi”); yazın, eğer sürekli bir mesaj kutusu çıkmıyorsa veriler gelmiyor demektir. Ama fonksiyona girdiği halde bolum1 kısımları label’de görükmüyorsa başka bir sorun var demektir. Projeyi komple upload edin bir de ben bakayım.

    Bu arada bir hatanızı buldum \r yerine /r yapmışsınız, aldığınız “Uzunluk sıfırdan küçük olamaz.
    Parametre adı: length………” hatası da bundan kaynaklanıyor bence.

    Biraz alakasız olacak ama Pic tarafından veriler sadece 1 kere mi gönderiliyor? Sonsuz döngü içinde yapmanız lazım, bir de araya 20ms gibi bir delay koymalısınız. Bilgisayarın verileri yakalaması için biraz gecikme gerekiyor.

    • Bu arada bir hatanızı buldum \r yerine /r yapmışsınız, aldığınız “Uzunluk sıfırdan küçük olamaz.
      Parametre adı: length………” hatası da bundan kaynaklanıyor bence.
      (düzeltim beceremedim)..

      private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {

      label4.Invoke(new EventHandler(delegate
      {
      string s = serialPort1.ReadLine();
      if (s.IndexOf(‘C’) != -1)
      label2.Text = s;

      else if (s.IndexOf(‘V’) != -1)
      label3.Text = s;

      else if (s.IndexOf(‘D’) != -1)
      label4.Text = s;
      }));
      }

      nette söyle bir şey buldum kendimde bir şeyler ekledim şuan çalışıyor.
      yardımların için teşekkür ederim.

  12. Merhabalar Gökhan Bey, bir konuda büyük sıkıntı içerisindeyim, bir türlü çözemedim. Seri – Paralel Port konularında yeniyim. Yapmak istediğim şey şu: bir yazılımım var bu yazılıma smart kart okuyucu aracılığı ile bir bilgi geliyor ve ben bu bilgiyi okuyabiliyorum.Gelen bilgiye göre seri veya paralel porttan (hatta Usb bile olabilir) turnike sistemine bir bilgi gönderip turnikeyi aktif hale getirmek istiyorum.Seri porta bilgi göndermeye çalışıyorum , gidiyormu gitmiyormu onu dahi tespit edemiyorum.Bu bilgi gidiyorsa onu nasıl kullanacağım ondada tereddütlerim var. Acil olarak yardımınızı rica ediyorum.Saygılar

  13. Seriport’u kullanabilmeniz için bilgisayarınızda COM port’un donanımsal olarak mevcut olması gerekir, eğer yoksa “USB/RS232 converter” devresi kullanıp driver’ını yüklemeniz gerekir. Bunu yaparsanız usb portunuzu seriport gibi kullanabilirsiniz. Genelde FT232 kullanıyoruz(tabi başka üreticilerin de ürünleri var). FT232’yi burdan temin edebilirsiniz: http://www.direnc.net/FT232-HAZIR-MODUL,PR-19360.html

    Gönderdiğiniz verinin gidip gitmediğini anlamak için, “RealTerm” gibi bir terminal programı kullanın, TX ve RX pinlerini birbirine değdirirseniz gönderdiğiniz herşey olduğu gibi size geri dönder ve terminalde görürsünüz.
    Başka sorununuz varsa, sorun.

    • com portu mevcut. aslında zamanımda çok az. ne soracağımı ve nasıl yapacağımı tam olarak bulamıyorum. Şöyle söyleyeyim C# da butona basınca seri portta bir pine Voltaj değeri göndermem gerekiyor.Diğer zamanlara herhangi bir değer olmaması gerekiyor.Yani anahtarlama görevi yapmasını istiyorum.Ama bir türlü yapamadım. Öğrencilerimle bir proje üzerinde çalışıyoruz.Fakat bu sıkıntı yüzünden ilerleyemiyoruz.Saygılar

      • Hocam seriport ile bahsettiğiniz şekilde veri göndermek yerine, “DTR” ve “RTS” pinlerini HIGH/LOW yapmak mümkün.
        c# ile de yapılabilir ama önce bahsettiğim terminal programını açın, “Pins” kısmına gelin “RTS” başlıklı bir yer var, orda set clear yazıyor bunlara basarak 1 ve 0 yapabilirsiniz. Aynı şekilde “DTR” başlığında ki set clear ile de DTR pinini 1 ve 0 yapabilirsiniz. Bu sayede 2 adet ledi kontrol edebilirsiniz. Daha fazla pin lazım ise, ya paralel port kullanacaksınız, ya da seriport’a bir mikrodenetleyici bağlayacaksınız. Eğer imkanınız varsa mikrodenetleyici(örn: PIC) bağlayın, ama bunun için program yazmanız ve programı yüklemeniz gerekecek.

        • Pekala sayın hocam “DTR” ve “RTS” pinlerini HIGH/LOW yapma işini nasıl yapacağımız konusunda yardımcı olabilirmisiniz?yani c# ile…

    • hocam özür iliyerek sorularıma devam ediyorum.Seri portun GND ucuna leddin – bacağını DTR çıkışına da artı bacağını bağladım.Bir butona SerialPort1.DtrEnable = False diğer butona SerialPort1.DtrEnable = True yazdım. fakat ledi söndüremiyorum.Sorun ne olabilir.Bu konuda ne kadar az bilgiye sahip oldduğumu anlamışsınızdır.Bu kadar soruyla bunalttığım için özür diliyorum.Saygılar…

  14. Estağfirullah özür dilemenize gerek yok hocam, yardımcı olmak benim için zevk.
    Ledin sönmemesinin sebebini bilmiyorum gerçi, DTR yerine RTS ile deneyin bir de.
    Masaüstü bilgisayar kullanıyorsanız ve kasanın kendi COM portuna bağladıysanız voltaj seviyesi yüksektir, gerçi led bozulmadığına göre masaüstü değildir yüksek ihtimal. Bahsettiğim çiplerde yaşadıysanız sorunu, dediğim gibi RTS ile deneyin bakalım ne olacak.

    • masaüstü bilgisayar kullanıyorum.Ledin önünde direnç var.Acaba işlem gerçekleşiyorda çok hızlı olduğu içinmi göremiyorum.bu sıkıntıdan nasıl kurtulacağız bilemiyorum.

  15. Gökhan Bey Merhaba;
    Size ve arkadaşlara bir sorum olacak. Kullandığım elektronik teraziye etiket yazıcı bağlayıp ekranda gördüğüm kilogram bilgisini yazdırarak çıktı alabiliyorum. Dijital göstergede print tuşu var buna dokunarak çalışıyor. Bu bağlantıyı terazi ile yazıcının RS232 portundan kablo ile alıp yaptım. Şimdi bu kablo bağlantısı yerine piyasada satılan bluetooth modül (Örn. HC06) alıp taktığımda yazıcıyı kablosuz çalıştırabilirmiyim? veya bluetooth modül yerine 433mHz RF Modüller var ( alıcı + verici takım ) bunun bağlantısı daha kolay ve sağlıklı mı olacaktır. Bu bağlantılardan hangisini önerirsiniz ve bağlantıyı nasıl yapabilirim? Bilgi paylaşılırsa çok memnun olurum.

    Selamlar / ÖZHAN

    • Gökhan Bey Merhaba;
      Sanırım bluetooth daha sağlıklı olacak. Bu modülleri Master ve Slave olarak nasıl programlayabilirim ve nasıl birbirine tanıtabilirim? Bunun ile ilgili bir kaynak yazınız varmı bilgi verirseniz çok memnun olurum.

  16. Gökhan bey merhaba,
    Elimde bir terazi var bu teraziye R232 bilgi gönderilip terazi cevap veriyor ama ben beceremedim üretici firmayı ile görüştü m bana aşaığdaki kodları gönderdiler.

    1 BİLGİSAYARDAN TERAZİYE GÖNDERİLEN PAKETLER

    Paket 01:

    EOT STX ’01’ ESC D5 D4 D3 D2 D1 D0 ESC ETX

    Teraziye birim fiyat göndermek için kullanılan pakettir. D5…D0

    kısmına 5 yada 6 basamak olarak birim fiyat yazılır

    bu değerleri nasıl gönderebilirim,
    Yardımcı olursanız sevinirim.
    Kolay gelsin.

  17. Merhaba Ahmet bey,
    Bir terminal programı indirin. Ben RealTerm programını kullanıyorum, tavsiye ederim.
    Eğer bu veriler string olarak gönderilecekse, olduğu gibi gönderebilirsiniz. Ama bazı yerler string değil sanki. Datasheeti var mı, ya da modelini yazarsanız bir bakıyım, üretici firma tam olarak ne dedi yazarsanız daha iyi yardımcı olabilirim.
    EOT STX ’01’ ESC D5 D4 D3 D2 D1 D0 ESC ETX olarak demişler ama ESC dediği ESC tuşunun ascii kodu mu yoksa ‘E’ , ‘S’ ve ‘C’ karakterlerini tek tek göndermek mi anlamadım.
    ESC karakterinin ascii kodu 27’dir, EOT karakterinin ascii kodu ascii olarak 4’tür, burdan bakabilirsiniz: http://www.thealmightyguru.com/Pointless/Images/ASCII.gif
    D4-D0 kısmı da aynı şekilde, D4 yerine string olarak ‘1’ yazmakla sayı olarak 1 yazmak çok farkeder. Mesela 1 karakterinin karşılığı ascii olarak 49’dur, ama sayı olarak gönderilecekse direkt 1 gönderilebilir. Bu gibi anlaşılmayan kısımlar var, bunları net öğrenirseniz halledersiniz. Diğer yöntem de deneye deneye bulmak.

    • Gökhan bey tekrar merhaba,
      Öncelikle cevap verdiğiniz için ayrıca teşekkür ederim, benim anlayamadığım bu değerleri string ve ASCII olarak nasıl göndereceğiz.

      Üretici firmanın Gönderdiği döküman aşağıdaki gibidir.

      1 BİLGİSAYARDAN TERAZİYE GÖNDERİLEN PAKETLER

      Paket 01:

      EOT STX ’01’ ESC D5 D4 D3 D2 D1 D0 ESC ETX

      Teraziye birim fiyat göndermek için kullanılan pakettir. D5…D0

      kısmına 5 yada 6 basamak olarak birim fiyat yazılır

      Paket 03:

      EOT STX ’03’ ESC D5 D4 D3 D2 D1 D0 ESC T3 T2 T1 T0 ETX

      Teraziye birim fiyat ve dara bilgisi göndermek için kullanılan pakettir.

      Yine aynı şekilde D5…D0 birim fiyat T3..T0 dara bilgisini tutar. Dara bilgiside

      4 basamak olmak zorundadır.

      Paket 04:

      EOT STX ’04’ ESC D5 D4 D3 D2 D1 D0 ESC A A A .13 karakter

      Teraziye birim fiyat ve yazı göndermek için kullanılan pakettir. A..A

      13 karakterli yazı için ayrılan bölümdür.

      Paket 05:

      EOT STX ’05’ ESC D5 D4 D3 D2 D1 D0 ESC T3 T2 T1 T0 ESC A A A .13

      .. A ETX

      karakter

      Teraziye birim fiyat dara ve yazı göndermek için kullanılan pakettir.

      Paket içindeki bilgiler ve uzunlukları diğer paketlerde olduğu gibidir

      Paket 08:

      EOT STX ’08’ ETX

      Teraziden durum bilgisi (status Paket 09) alma isteği gönderen pakettir

      EOT STX ’81’ ETX

      Ekrandaki bilgileri silmek için kullanılan pakettir.

      Paket ENQ:

      EOT ENQ

      Teraziden ağırlık ölçüm bilgilerinin istenilmesi için kullanılan pakettir.

      Paket EOT:

      EOT

      Terazinin olçüm arayüzünü resetlemek için gönderilen pakettir.

      HABERLEŞME AKIŞI:

      Haberleşme bilgisayarın teraziye 01 03 04 yada 05 nolu paketlerden

      birini göndermesiyle başlar. Bu paketler başarı ile gönderilirse terazi ekranında

      gönderilen değerler görülür ve terminalde ACK mesajı gelir. Eğer hatalı bir

      paket gönderildiyse terazi bilgisayara NAK gönderir yada Checkout kontrolü

      yapma ihtiyacı varsa paket 11 gönderir. Gelen paket 11 isteğine bilgisayarın

      gerekli checksum bilgilerini hesaplayarak paket 10 ile cevap vermesi gerekir.

      Terazi aşağıdaki durumlarda bilgisayara checksum isteği gönderebilir.

      • terazi bilgisayardan önce açılmışsa

      • Daha önce herhangi bir hata oluşmuşsa

      • 50 tane hatasız ölçme işlemi gerçekleştirilmişse

      • paket 20 ile terazide versiyon numarası gösterildiyse

      gerekli ürün fiyat dara vs. bilgileri teraziye aktarıldıktan sonra terminale EOT

      ENQ paketi gönderilerek teraziden ölçüm sonuçları istenir. Eğer hatasız olarak

      ölçüm yapılabildiyse terazi bu isteğe paket 02 ile cevap verir. Eğer herhangi

      bir paket gönderimi sırasında hata oluştu ve NAK alındıysa paketin tekrar

      gönderilmesi gerekir. Checksum isteği gönderilirse de checksum gönderilip

      ACK alındıktan sonra da aynı paketin tekrar yollanması gerekmektedir. Eğer

      NAK alındığında sorunun ne olduğu öğrenmek istenilirse teraziye Paket

      08 yollayarak durum bilgisi istenebilir. Gelen hata koduna göre hatanın ne

      olduğuna karar verilir. Paket gönderimi sırasında dikkat edilecek husus paket

      içindeki fiyat dara açıklama gibi alanların uzunluklarının tam olarak istenildiği

      kadar olması gerekmektedir. Mesela fiyat için 6 basamaklık yer ayrıldığı halde

      daha kısa bir rakam gönderilirse teraziden NAK alınır.

    • Merhaba hocam bende gps gprs gsm özellikli uzaktan kontrollu role acma kapama devresi var kartın büyüklüğü 13 cm falan ozelligi cok yazılımı yok uart1 uart2 pinleri var rx tx dts dtr rst bircok pin var uzerinde iki adet uart dönüştürücü altım usb uart denetleyici yeni çıkanlardan kodunu hatırlayamıyorum bu kartı nasıl kontrol etcem terminal v1 den yazıyorum test amaçlı error yazıyor yardımcı olurmusunuz kartta hem sim9000 yazılımı lazım hemde gps bilgi kodları ne yapmalıyım

  18. String ve ascii göndermenin farkını anlamak için bahsettiğim realterm programını kurun.
    Şu resime bakın: http://s28.postimg.org/hh0rt5jal/Ads_z.png
    49 yazıp “Send Numbers” e basarsanız ascii karakter olarak 49 gönderir, 1 karakterinin ascii karşılığı 49 olduğu için, aslında 1 karakterini göndermiş olursunuz.
    1 yazıp “Send ASCII” butonuna basarsanız yazdığınız 1 karakteri, asciiye çevrilir ve 49 olarak gider.

    Bu kısmı anlamadan terazi ile iletişim kurmaya çalışmayın. Çünkü bunları iyice kafanızda oturtmadan yapamazsınız. Bunu anlamak için ikilik, onluk ve onaltılık sayı sistemlerini, ascii tablonun ne işe yaradığını bilmeniz ve bunlarla ilgili bir sürü örnek yaparak alışkanlık kazanmanız gerekiyor. Aslında çok basit bir konudur.

  19. Gökhan bey merhaba,
    2 Gündür gripten dolayı yatıyorum ancak bilgisayar başında geçebildim bugün işleri toparlayıp bakacağım.
    Teşekkür ederim Kolay gelsin,

  20. Gökhan bey Realterm i denedim ancak aşağıdaki örnekte olduğu gibi

    EOT STX ’01’ ESC D5 D4 D3 D2 D1 D0 ESC ETX ACSII caracteri gönderebiliyorum ancak ’01’ sayi olarak D5-D0 000100 olarak gönderemiyorum. bunarı ASCII karakterin yanında nasıl gönderebilirim birde Realterm teraziden gelen yanıtları okuya biliyormu ?
    buara da terazi markası METTLER TOLEDO bRite
    Yardımlarınızdan dolayı tekrar teşekkür ederim.

  21. sayıyı 16’lık sisteme çevirip, başına 0x koyup göndermek için send number butonunu kullanın
    Mesela: 00101011 sayısını göndermek için 0x2B yazın

    Teraziden yanıt gelirse, elbette ekranda gösterir. Tabi bağlantıda bir sorun yoksa.
    Test etmek için rx ve tx kablolarını teraziden sökün, bu iki kabloyu kısa devre yapın, gönderdiğiniz herşey size geri gelir. Gelen verilerin görünümünü de display menüsünden değiştirebilirsiniz. Default olarak ascii karakter seçilidir, sayı olarak görmek istiyorsanız, uint8 felan seçin.

  22. Gökhan Bey tekrar merhaba, EOT STX ’01’ 001000 ESC ETX yazamıyorum ortadaki 001000 6 karakter olan real terme yazdıramadım dolaysıyla teraziden bir cevap gelmiyor yardımlarınız bekliyorum.

  23. Merhaba,
    001000 sayısının başındaki sıfırlar önemli değildir, hesap makinesini açın, görünümden programcı moduna geçin, sol taraftan ikili’yi seçin o sayıyı yazın, sonra onaltılı’yı seçin size hex karşılığını verir. Verdiği sayı 8 olacaktır, tek haneli olduğu için başına 0 koyacaksınız, daha sonra o sayının 16 lık olduğunu belli etmek için başına 0x koyacaksınız
    kısaca ikilik tabandaki 1000 sayısının karşılığı 0x08’dir,
    O sayıyı realterm’den yollayabilirsiniz.
    Sayıyı 16’lık yollamak yerine onluk tabanda da yollayabilirsiniz, hesap makinesine sayıyı yazıp onlu’yu seçerseniz verdiği sayının başına birşey yazmadan realterm’den gönderirseniz onluk tabanda göndermiş olursunuz.

  24. Gökhan bey tekrar merhaba dediğiniz gibi yaptım ancak bir sonuç alamadım bir yerlerde yanlış yapıyorum sizden rica etsem EOT STX ’01’ ESC 001000 ESC ETX siz çevire bilirmsiniz.
    bu arada İthalatçı firma ile tekrar görüştüm Yazılmcıları bana Delphi örnek kolarını verdi bu kodları C# dönüştüre bilsek sanırım iş görür. ComPort1.WriteStr(Chr(4)+Chr(2)+’04’+Chr(27)+’000100’+Chr(27)+’WINSTON LIGHT’+Chr(3));
    ComPort1.WriteStr(Chr(4)+Chr(5)); //ağırlık iste
    Teşekkürler.

  25. ComPort1.WriteStr(Chr(4)+Chr(2)+’04’+Chr(27)+’000100’+Chr(27)+’WINSTON LIGHT’+Chr(3));
    Kısmını c# ile yazarsak şöyle birşey olur heralde:

    serialPort1.Write( (Char)4 + (Char)2 + “04” (Char)27 + “000100” + (Char)27 + “WINSTON LIGHT” + (Char)3);

    Dikkat etmeniz gereken şey, EOT STX ’01’ ESC 001000 ESC ETX göndermek için EOT’nin ascii kodu sonra STX’in ascii kodu sonra 0 karakteri, sonra 1 karakteri, sonra ESC’nin ascii kodu, sonra ETX’in asci kodunu gönderin.
    Bunları ascii kodları şöyle:
    ETX=0x03 yani 3 ,
    EOT=0x04 yani 4,
    ESC=0x1B yani 27,
    STX=0x02 yani 2

    zaten gönderdiğimiz char() şeklindeki şeyler bunlar. Görüldüğü gibi çok basit.

  26. Gökhan bey tekrar merhaba,
    sorun benim PC nin com portundaymış çözdüm sorunu, şimdi terazi den istediğim değerleri alabiliyorum.
    Emeğiniz geçti hakkınızı helal edin çok teşekkür ederim.

  27. hocam ben stm32 ve xbee pro s1 kullanarak adc verisini göndermek istiyorum ama micro c ile adc verisini verici kodunu yazamadım umarım yardımcı olursunuz . teşekkürler hocam

  28. Hocam, hiç bir xbee modelini kullanmadığım için xbee hakkında bilgim yok,
    Mikroc ile hiç arm programlamadım, bende kurulu da değil(kendinisini hiç sevmem).
    Bu yüzden yardımcı olamayacağım malesef.

  29. Merhaba. 2 pic arasında rf ile sıcaklık veri transferi (float cinsinden) yapmak istiyorum. Ama bunu bir türlü gerçekleştiremedim. Şu an tx-rx arasında tel ile bağlantı yaptım. Vericiden sıcaklık bilgisini char olarak gönderince küsürat hatası oluyor. Örneğin 26.8 derece iken alıcıda bu 26.0 derece olarak okunuyor. float gönderince de sürekli 131.0 değeri görüyorum. Sıkıntı neden olabilir? Henüz rf modüllerine geçemedim.

  30. Sayıyı ya string olarak gönderip sonuna \r ekleyin, ya da sayıyı 3 byte halinde gönderin, sayının başına bir paket başlangıcı koyun bu bir özel karakter olsun mesela ‘~’ yani tilda veya ‘$’ yani dolar olsun. 2.byte ise sayının tam kısmı olsun. 3. byte ise virgüllü kısım olsun.
    Örneğin 26,8 sayısı göndermek için,
    gonderilecek[3]={‘$’,26,8}
    yapın.

    Alırken ise $ karakterini kontrol edeceksiniz, bu karakteri gördüğünüz zaman peşinden gelen 2 byte’ın ilk byte’ı tam, ikincisini yazmadan önce virgül yazacaksınız.

  31. Hocam kodlarınızla pik’e veri gönderiyorum. mesela Convert.ToChar(255).ToString(); olarak göndermiyor. Fakar 125 i gönderiyor neden olabilir ?

  32. Merhaba Gökhan bey,ben C# dan bluetooth ile seri olarak bir led panele veri yazmak istiyorum,C#da nasil bluetooth icin kodlari yaza bilirim,HC05 bluetooth kullanmak istiyorum yardimci olursaniz cok sevinirim.

  33. ben şimdi c#’da bir otomasyon programı yazıyorum, her şey tamam gibi ancak bir noktada takıldım. Ben serialport1 ile haberleşip, porttan gelen her veri sonrası sayaç değerimi 1 arttırmak istiyorum. Sistem şu şekilde olacak, serial porttun 1 pini ve dış alana lehimlediğim kablo uçlarını iki plakaya bağlayayıp, bu plakaların birbirine değmesinden sonra oluşan kısa devre sonucu porta giden değer bana dönecek ve ben de sayaç değerini 1 arttıracağım. bunu yapmaya çok ihtiyacım var, lütfen bilgisi olan bir arkadaş varsa bana kısaca anlatabilir mi. Şimdiden çok teşekkür ediyorum. kolay gelsin.

    • c#’da serial port kullanırken “receive data” diye bir yakalama metodu var, yani interrupt özelliğinden bahsediyorum.
      Bu özelliğini açarsanız, ve kesmeye her girdiğinde kaç adet byte geldiğini port.BytesToRead ile öğrenirseniz, basit bir şekilde yapmış olursunuz.

      • gokhan bey merhabalar c# bır program yazıyorum ve bu programı delta marka plc ıle haberlestırmek ıstıyorum amacım plc nın Y bobın uclarını aktıf edebılmek veya pasıf etmek bu konu hakkında bana yardımcı olabılırmısınız

  34. hocam ben matlab ile seri port haberleşme ile led yakmak istiyorum bunu yaparken assembly ile bunu dinlemeliyim yardımcı olursanız sevinirim ..

  35. Gökhan bey Rs 232 ile haberleşme yapıyoruz mesafe 30 Mt civarında haberleşme bazen oluyor çoğunlukla olmuyor nasıl sağlaya biliriz selamlar

Bir Cevap Yazın