UART1_Read_Text

Başlatan myalvac, 12 Mayıs 2015, 11:44:19

myalvac

Merhabalar. UART1_Read_Text komutunun UART1_Read() komutundan farkı nedir acaba? Help kısmına baktım ancak pek birşey anlamadım.

void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

Description   
Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

Output: received text
Delimiter: sequence of characters that identifies the end of a received string
Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence.


Requires
UART HW module must be initialized and communication established before using this function. See UARTx_Init.


Example
Read text until the sequence "OK" is received, and send back what's been received:

UART1_Init(4800);                         // initialize UART1 module
Delay_ms(100);

while (1) {
  if (UART1_Data_Ready() == 1) {          // if data is received
    UART1_Read_Text(output, "OK", 10);    // reads text until 'OK' is found
    UART1_Write_Text(output);             // sends back text
}
}


Örnekte OK bilgisi okuyunca kadar 10 defa okuma yap mı demek istiyor?

Yardımcı olursanız sevinirim..

myalvac

ETE Hocamın bir konuda yazmış olduğu aşağıdaki yazısı sanırım microc içinde geçerli. deneyeceğim..

Alıcıyı her seferinde tek veri alacak şekilde ayarla ve vericiden de her seferinde tek veri yolla olsun bitsin.
Bu olmaz se bir sonlandırma karekteri ile işini halledebilirsin. Verici birden fazla veri yollar ama bu sınırsız olmaz. Örneğin en fazla 10 veri birden yollanabilsin. Veri sonuna bir 254 gibi nadir olabilecek bir karekter ekle.
Alıcıda gelen bilgiyi bir dizi değişkenine aktar.
HSERIN [STR DiziVar\n\c]  şeklindeki komut dizisinde,
-DiziVar bir dizi değişken adı olacak
-n adet veri almayı hedefleyeceksin ama
-c karekteri geldiğinde alma işi sona erecek. 
HSERIN [STR VERI\10\254] gibi halledebilirsin.
Daha sonra gelen verileri kendi değişkenlerine aktarabilirsin.
Ete

kartal_0689

Merhaba,

"Uart_Read_Text" komutu oldukça kullanışlı bir koddur.

Burada ilk gelen, texti hangi değişkene kaydedeceği, sonrasında Gelen textin data sonu ve en son gelen textin karakter uzunluğu anlatılmaktadır.

Örneğin Verici yazılımdan,

Uart1_Write_Text("ismail/");

gönderilsin.

Alıcı kısmında ise,

Uart1_Read_Text(ReadText, "/", 7); 

Burada ReadText içerisinde "/" karakterine kadar olan bütün karakterler alınır.

TURKEY/ANK

myalvac

Teşekkür ederim Hocam bilgi için. Acaba hattan gelen bilgileri hex olarak görebilmek için LCD Display kullanmak mantıklı olur mu pic'te?

kartal_0689

#4
Tabiki olabilir.

Yalnız siz sadece alıcı mı yapıyorsunuz?
Gelen veriler text olarak gelmiyorsa bu komut hiçbir işe yaramaz.
Yani datasonu (son karakter) bilinmiyorsa uart_Read_Text çalışmaz.
TURKEY/ANK

myalvac

Evet Hocam sadece alıcı olacak. Yani aracın haberleşme hattından gelen verileri PIC ne olarak görüyor onun için yapayım istedim ve gelen verileri LCD de görebilmeyi başardım. Kodlar aşağıda. Yalnız hattın baud rate değerini bir türlü tutturamadım  :(  Elimdeki logic analyzer lar da farklı değerler söylüyor. O değerlerde tutarlı değil.. Halen uğraşıyorum...

unsigned char GeldiginiVarsaydigimizVeriDizisi[10] = {0xAC, 0xA9, 0x28, 0x26, 0x23, 0xA7, 0x56, 0xFF, 0xFE, 0x45};
unsigned char deger;
char hex[3];
int i;


void main(){
LCD_Init();

for (i=0; i<11; i++)
{

deger = GeldiginiVarsaydigimizVeriDizisi;

BytetoHex(degeri hex);

Lcd_Out_Cp(hex);
Lcd_Out_Cp("");
}

}

has_artvin_li

#6


Alıntı yapılan: kartal_0689 - 13 Mayıs 2015, 11:56:48Merhaba,

"Uart_Read_Text" komutu oldukça kullanışlı bir koddur.

Burada ilk gelen, texti hangi değişkene kaydedeceği, sonrasında Gelen textin data sonu ve en son gelen textin karakter uzunluğu anlatılmaktadır.

Örneğin Verici yazılımdan,

Uart1_Write_Text("ismail/");

gönderilsin.

Alıcı kısmında ise,

Uart1_Read_Text(ReadText, "/", 7); 

Burada ReadText içerisinde "/" karakterine kadar olan bütün karakterler alınır.



Hocam inancın olsun süpersin Çok teşekkür ederim.

Konuyu biraz hortlatmak gibi olacak ama aklıma takılan bir soruyu da ben sormak istiyorum...

Bu sıralar gps ile konum bulmak için deli gibi uğraşıyorum strtok fonksiyonundan bir çok fonksiyona kadar inceleme yapmam gerekiyor ama bu biraz daha mantıklı gelidi...

ReadText isminde bir alan oluşturmuşsunuz :

Soru a : Bu ReadText değişkeninin türü nedir ( int,char,long ) Bence string alacağı için Char olması lazım doğru mu ?

Soru b : Diyelim ki siz "ismail/" verisini yolladınız ve 7 adet string karakterden oluşuyor ReadText değişkeni char tipinde olsa bu 7 harflik string veriyi içinde tutabilecek mi ?

Yoksa Char ReadText[]; şeklinde belirsiz boyutlu bir değişken mi oluyor ?

kartal_0689

NMEA kodlarının alınması ve işlenmesi ile ilgili aşağıdaki linkler sana yardımcı olur.
Bu arada benim kullandığım derleyici MikroPascal, dolayısıyla bunları kendi derleyicin için
düzenlemen gerekebilir.

https://etepic.com/index.php?topic=4018.0

http://www.picproje.org/index.php?topic=76409.0
TURKEY/ANK

has_artvin_li

Alıntı yapılan: kartal_0689 - 20 Aralık 2019, 11:13:03NMEA kodlarının alınması ve işlenmesi ile ilgili aşağıdaki linkler sana yardımcı olur.
Bu arada benim kullandığım derleyici MikroPascal, dolayısıyla bunları kendi derleyicin için
düzenlemen gerekebilir.

https://etepic.com/index.php?topic=4018.0

http://www.picproje.org/index.php?topic=76409.0

Evet konuyu orda da açtım ( www.picproje.org ) hepisini tek tek inceledim gece vardiyesinde zaman buldukça da inceliyor okuyorum ama kötü bir huyum var mantığını anlayana kadar uğraşıyorum...

İşte tamamen bu yüzden bu soruyu sordum...


Hocam inancın olsun süpersin Çok teşekkür ederim.

Konuyu biraz hortlatmak gibi olacak ama aklıma takılan bir soruyu da ben sormak istiyorum...

Bu sıralar gps ile konum bulmak için deli gibi uğraşıyorum strtok fonksiyonundan bir çok fonksiyona kadar inceleme yapmam gerekiyor ama bu biraz daha mantıklı gelidi...

ReadText isminde bir alan oluşturmuşsunuz :

Soru a : Bu ReadText değişkeninin türü nedir ( int,char,long ) Bence string alacağı için Char olması lazım doğru mu ?

Soru b : Diyelim ki siz "ismail/" verisini yolladınız ve 7 adet string karakterden oluşuyor ReadText değişkeni char tipinde olsa bu 7 harflik string veriyi içinde tutabilecek mi ?

Yoksa Char ReadText[]; şeklinde belirsiz boyutlu bir değişken mi oluyor ?

kartal_0689

#9
benim kullandığım derleyici ve dil için söylüyorum.
Fonksiyonun kullanma şekli;
procedure UARTx_Read_Text(var output, delimiter : string; Attempts : byte);

burada "output" değişkeni, ReadText olarak belirttiğim değişken. Türü ise string. yani karakter dizisi.
bunun boyutu özellikle c' de [] tanımsız yazılabiliyor.Ancak MikroPascal' da tanımsız yazamadığım için
dizi boyutu kadar (5 karakter ise [5]) yazıyorum.

Diğer sorun ise; gelen karakter sayısı örneğin 25 dizi, fakat sen bu dizi içinde 7 karakter alacaksın.
ReadText değişkenin boyutunu alacağın karakter kadar yazabilirsin. Ancak bu tavsiye edilen bir durum değil.
Bunun yerine bu boyutu maksimumda tutmak en iyisi. Zaten farklı bir fonsiyonla boş karakterleri silebiliyorsun.

Örnek:

var ReadText : string[20];
// gelen text dizisi 20 karakter ; 'Hello World/ 123456*'
Uart1_Read_Text(ReadText,'/',20);

Yukarıdaki örnekte "Hello World" ReadText dizisi içine aktarılır.
TURKEY/ANK

Powered by EzPortal