rs232 integer göndermek

Başlatan bigfish, 09 Ocak 2011, 01:54:43

bigfish

Hocam burda cmdBuffer ın tanımını göremedim.Kod eksik çıkmış olabilir mi?

Alıntı yapılan: iyildirim - 09 Ocak 2011, 13:56:20
unsigned char s[5];
unsigned int i;

char = "1234";
i = atol(char);

Buna benzer birşeyin çalışması gerekli. String'in sonu 0x00 ile bitsin. hem string hemde integer declarasyonlarını kontrol edin. Eğer library den sadece Atol fonksiyonu kullanmanız gerekli ve bellek sorunlarınız oluşursa alttakine benzer birşey de kullanılabilir.  Tavsiyem olabildiğince standart fonksiyonları, kütüphaneleri kullanmanız. Sorun devam ederse string doğru aldığınızdan emin olun.
signed long getval()
{
	signed char signVal = 1; 
	signed long cmdVal = 0; 
	signed char exitLoop = 0;
	unsigned char BufferPtr = 0;
	
	while (exitLoop == 0)
	{
		switch(cmdBuffer[BufferPtr])
		{
		case '-': 	
			signVal = -1;
			BufferPtr++;
			break;
			
		case '+':
			signVal = 1;
			BufferPtr++;
			break;
			 
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			cmdVal = cmdVal * 10 + cmdBuffer[BufferPtr]-48; 
			BufferPtr++;
			break;

		default:
			exitLoop = 1;
			break;
		}
	}

	cmdVal = signVal * cmdVal;

	return(cmdVal);
}


iyildirim

Unutmuşum ...
cmdBuffer' ı fonksiyon dışında genel olarak tanımlarsan sorun çıkmaması gerekli.

bigfish

Hocam kodla ilgili 1-2 sorum var :
*Bellek sorunu olursa ' dan kastınız sadece atol fonksiyonu için .h dosyasını eklemek lüks olur anlamında mı?
*Sizin verdiginiz kodu anladım ama orada tanımladıgımız fonksiyon input argumanı almıyor,stringin sayı degerini hesaplayıp çağrıldıgı yere geri döndürüyor.Dışarda tanımla demiştiniz bu durumda cmdBuffer=gets() işimizi görür mü? Ya da bunun dışında nasıl okuyabiliriz?Çünkü esas sorun elimde olan bi stringi çevirmekten ziyade PC tarafından gelen sayıyı alıp (string olarak) sayı tipine çevirmek.
*Bir de son olarak şu kod için stringin sonu 0X00 ile bitsin demişsiniz.Onu nasıl ekleyebilirim?Ascii karakteri olarak mı?
unsigned char s[5];
unsigned int i;

char = "1234";
i = atol(char);

Tşkrler tekrar

iyildirim

Evet, Sadece atol için bellek de kısıtlıysa lüks olur anlamında. Ekteki kodu da topu topu 8 k belleği olan bir mcu için çok önceleri yazmıştım. Library ye yer kalmadığı için.  Eğer bellek sorunun yoksa standart kütüphane fonksiyonlarını kullanmayı tercih ediyorum, öneririm.

Kodu anladı isen kendine göre istediğin gibi düzenleyebilirsin. Fonksiyon dediğin gibi dışarıda tanımlanan bir string üzerinde işlem yapıyor.
gets() eğer standart IN doğru tanımlandı ise iş görmeli.
Bunun dışında direkt olarak UART modülünden kendin okuyabilirsin. Basit anlatımla; bir sayac-pointer-indis kullan, bunu sıfırla, UART RX kesmelerinde gelen datayı  sayacı da kullanarak buffera at sayacı arttır. CR (ASCII 13)  gibi bir karakter geldiğinde sona 0x00 ekle atol veya diğer fonksiyona yolla. 
C de stringlerin sonunu 0x00 karakteri ile anlıyoruz.
Özel olarak 16F ve CCS için UART okuma ile ilgili bir elimde bir şey yok. Derleyiciden bağımsız konuların dışında yardımım maalesef olmaz.
Olası hatalardan biri de baut hızlarının hatalı olmasıdır. Test etmek için önce PIC den PC ye birşeyler yolla. PC de doğru olduğunu gördükten sonra PC'den PIC'e veri gönderme kısmına geçmeni öneririm.
Kolay gelsin.

bigfish

Peki çok teşekkürler.UART ı başka forumlarda da tavsiye ettiler biraz araştırsam iyi olucak..