Hal Lib - Usart Koduyla Alakalı

Başlatan E-x8, 16 Temmuz 2017, 14:02:40

E-x8

Merhaba

Hal Lib ile stm32f103 kartı üzerinde denemeler yapıyorum. Usart kullanımı ile alakalı bir sorum var. Sorunum dinamik olarak sürekli olarak değişen string bilgisini şimdilik bilgisayara göndermek. Kendi çözümüm aşağıda fakat yavaş olduğunu düşünüyorum. Bunu ne kadar optimize edebiliriz?

int pointer_uzunlugu(char* str){ //string ifadesinin kaç karakter uzunluğunda olduğunu hesaplıyor
	int sayac = 0;
	while(*str++ != 0){
		sayac++;
	}
	return sayac;
}

void yazdir(char* str){ //Usart1 ile gönderim yapılıyor
	HAL_UART_Transmit_IT(&huart1, (uint8_t*)str, pointer_uzunlugu(str));
}


İnternette örnek kullanımlarda " sizeof(char*) " gibi bir şey kullanılıyor ama bir türlü sizeof ile "dsjkfghdgdgfgd" şöyle bir string ifadesini göndermeyi başaramadım. Ya hep yarısı gitti ya da ilk 3 harfi.


Not : Paylaştığım kod tamamiyle hızlıca çalışıyor fakat, profesyonel gözükmüyor. sizeof vs gibi hazır yapıları kullanmak istiyorum. Amacım Arduinodaki Serial.println("abcxyz"); kolaylığını kendi Arm projeme taşımak.


Teşekkürler.

Zoroaster

String degiskenin icerigini degil adresini yolla.
Seytan deliginden kacti.

E-x8


skara1214

pointer kullanımını araştırın
Herkes ölür ama herkes gerçekten yaşamaz

E-x8

Pointer kullanımı ile alakalı şöyle bir şey buldum.

USART1->DR=*str;

Böylelikle çok daha hızlı yollanılacak gibi geliyor.

Ayrıca referans kitapçığında sayfa 823'te şunlar yazıyor:

Bit 7 TXE: Transmit data register empty
This bit is set by hardware when the content of the TDR register has been transferred into
the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It
is cleared by a write to the USART_DR register.
0: Data is not transferred to the shift register
1: Data is transferred to the shift register)
Note: This bit is used during single buffer transmission.


Bit 6 TC: Transmission complete
This bit is set by hardware if the transmission of a frame containing data is complete and if
TXE is set. An interrupt is generated if TCIE=1 in the USART_CR1 register. It is cleared by a
software sequence (a read from the USART_SR register followed by a write to the
USART_DR register). The TC bit can also be cleared by writing a '0' to it. This clearing
sequence is recommended only for multibuffer communication.
0: Transmission is not complete
1: Transmission is complete


İlk başta yazdığım kodu STM32 usart ile gönderirken TXE ile beklemek[Bu biti kontrol etmek] mantıklı gibi gözüküyor. Hatta denedim onu beklemeyince veriler gönderilemiyor.
USART1->DR=*str;


Fakat TC yi beklemek mantıklı mı acaba? Beklemeden gönderim yaptım çalıştı, bekledim gönderim kısmı yine çalıştı.

Yardımcı olabilir misiniz?

baran123

Bekleme şart gibi. TC beklemeyince bazen problem oluyor. Dün bizzat denedim.