Ynt: rs232 den sayı yollamak

Başlatan Emre MERMİ, 21 Kasım 2015, 15:31:53

Emre MERMİ

merhaba hocalarım.

rf termometre devresi yapmaya çalışıyorum. Vericide ds18b20 den ölçtüğüm sıcaklığı 628a ile okuyorum oradan alıcıya yollayıp 877a ya bağlı lcd ekrana yazdıracağım. Devrenin sadece simülasyonda çalışması yeter.

Ölçümü yapıyorum seri porta yolluyorum virtual terminalden güzel güzel görünüyor. Burada sorun yok. Alıcı değerleri yanlış alıyor ekrana yanlış değer yazıyor. Sensörün değeriyle oynayınca  lcd deki değer de değişiyor ama çok saçma değişiyor. Bunun nedeni ne olabilir ? Alıcıda yollanan integer değeri hangi fonksiyon ile almam lazım ? Yardımcı olursanız çok sevinirim.

Şimdiden çok teşekkür ederim.

mesaj birleştirme:: 21 Kasım 2015, 15:53:37

mesela verici 24 yolluyor alıcı 52 alıyor gibi sanırım char  int dönüşünü yapmam lazım ama nasıl olacak ?

baran123

Kodun gönderme ve alma kısmını paylaşır mısın ?

Emre MERMİ

@Baran Ekrem hocam

alıcı;

char c;
#INT_RDA
void  RDA_isr(void) 
{

c=getc();

}


verici;

sicaklik = ds1820_read();
 printf("%d",sicaklik);


sicaklik int olarak tanımlı

baran123

#3
Ben bluetooth projemde string alma işlemini şöyle yaptım.

#define HC06BUFFER_LENGHT   (21) // 21 karakter uzunluğunda

static bool ReceivedFlag = false;
static unsigned char HC06_Buffer[HC06BUFFER_LENGHT];
static unsigned char HC06_WriteIndex=0;

// kesme içinde
#INT_RDA
void  RDA_isr(void) 
{
if(getc() != '\n' && getc()!= '\r') {
                HC06_Buffer[HC06_WriteIndex] = RCREG;
                HC06_WriteIndex++;
            }
            else
                ReceivedFlag = true;
}

//main
int main()
{
for(;;) {
        if(ReceivedFlag) {
            lcd_putc(HC06_Buffer);
            Clear_RxBuffer();
            ReceivedFlag = false;
        }
}

//buffer temizlemek için
/***********************************************************
* Function Name  : Clear_RxBuffer
* Description    : Buffer clear.
* Input          : None
* Return         : None
***********************************************************/
static void Clear_RxBuffer(void) {
    static unsigned char i;

    for(i=0; i<HC06BUFFER_LENGHT; i++)
        HC06_Buffer[i] = 0;

    HC06_WriteIndex=0;
}


daha ne yapayım ? :)
sen başına ve sonuna güvenlik karakterlerini ekle - gelmişse almaya başla taki + gelene kadar
gibi...

mesaj birleştirme:: 21 Kasım 2015, 18:04:19

Hatan ise string gönderip karakter olarak almaya çalışman.Printf string yolluyor sen tek bir karakter almaya çalışmıssın.

berat23

gömülü sistemden pc ye data aktarıken string kullanmak ve bunu olduğu gibi göndermek doğru bir yaklaşım değil.

doğru metod frame oluşturmak ve sayı olarak göndermektir. öncelikle frame başlangıcı için bir karakter seti kullanman lazım. mesela 0xAA,0x55 olabilir(biri 10 diğeri 01), bu karakterlerin data içinde gelmeyecek birşeyler olması lazım. sonra göndereceğin datayı byte byte okuduğun formatta gönderirsin. ds18b20  den okuduğun sıcaklık verisi 2 byte bir veri. mesaja bu iki byte'ı eklersin. son byte ise checksum olur ki bu da 2 data byte'nın 8 bitlik toplamıdır. böylece güvenli veri iletirsin. ayrıca gömülü kodda gerçekten gerekli değilse string çalışmak büyük kıroluk. garibim pic ile sprintf vs. kullanacağına pc de tırıvırı bir kodla o çevrimi halledersin.

alıcı tarafında da önce o iki karakteri arar, sonra mesajı dinler ve checksum kontrolü yaparsan doğru veriyi aldığından emin olursun.

örnek paket şöyle olmalı;
byte 0  0xAA
byte 1  0x55
byte 2  tempLowByte
byte 3  tempHighByte
byte 4  checksum

aliveli

Alıntı yapılan: berat23 - 21 Kasım 2015, 18:30:47
gömülü sistemden pc ye data aktarıken string kullanmak ve bunu olduğu gibi göndermek doğru bir yaklaşım değil.

ayrıca gömülü kodda gerçekten gerekli değilse string çalışmak büyük kıroluk.

garibim pic ile sprintf vs. kullanacağına pc de tırıvırı bir kodla o çevrimi halledersin.

çok faydalı bilgiler teşekkürler.