STM32 USART ile PC(C# Rx Interrupt)

Başlatan baran123, 09 Haziran 2015, 21:25:40

Gökhan BEKEN

stm32 için bir örnek
unsigned char aldik=0;
unsigned int rxSayac=0;
volatile unsigned char RxTampon[100];

void USART1_IRQHandler(uint8_t c){
	RxTampon[rxSayac]=USART1->DR;
	rxSayac++;
	if(RxTampon[rxSayac-1]=='\r' && RxTampon[rxSayac]=='\n') {
		rxSayac=0;
		aldik=1;	
	}
}
void main(void){
    while(1){
	if(aldik) {
		rxSayac=0;
		aldik=0;	
		USART_SendString(USART1,&RxTampon[0]); //gelen veriyi geri gönder
	}
    }
}
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan

geldim, ;)
çapraz iş falan filan demesinin sebebi ; (cross-thread operation not valid)
seriportu dinlerken başka işlemlerde yapması gerekir tabi biz bunu anlatmadığımızdan bu hatayı alırsınız.

Arayınca bu yazıyı buldum http://www.serkanayaz.com/kategoriler/programlama/cross-thread-operation-not-valid-hatasi/

ama bu uygun bir yöntem değildir. invoke ve delegate ile ilgili çalışma yapılması gerekir.

http://blog.ahmetbutun.net/index.php/2009/04/07/cross-thread-operation-not-valid/

aha oda burada.

baran123

Evet bende delegate ile yaptım.
Teşekkürler Gökhan hocam :)

Gökhan BEKEN

Bahsettiğiniz yöntem ile bir örnek yazarsanız istifade ederiz.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Şu an kullandığım örnek de şöyle yaptım.

internal delegate void SerialDataReceivedEventHandlerDelegate(object sender, SerialDataReceivedEventArgs e);
delegate void SetTextCallback(string text);
string InputData = String.Empty; 
SerialPort SP = new SerialPort();
//yukarısı global 

private void SetText(string text)
        {
            this.txtDataRx.AppendText(text);
        }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (SP.IsOpen)
            {
                InputData = SP.ReadExisting();
                if (InputData != String.Empty)
                    this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
            }
            else
                MessageBox.Show("", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

baran123

Hocam usarttan gelenleri alıp daha sonra bir string ile nasıl karşılaştırabilirim ? C deki string işini bir türlü anlamadım.Diziye alma veya pointer ile yapılıyor sanırım .

muhittin_kaplan

@Baran
"Usarttan aldığım", bu alım işlemi PC demi MCU damı

baran123

Pc den gönderdiğim stringi mcu ile alıp mcu içerisinde sabit bir string ile karşılaştırmak istiyorum hocam.

Gökhan BEKEN

#23
stringi karşılaştırmak demek iki adet dizinin birebir aynı olup olmadığına bakmak demek. Yani bir döngü kuracaksın, enter karakterini görene kadar devam edecek ama her adımda iki dizi ilemanını if ile karşılaştıracaksın, eğer farklı ise return false; diyeceksin, enter'a kadar return yapmadan ulaşabildiyse return true'yi hakediyor demektir. Çok basit anlayacağın.

mesaj birleştirme:: 10 Haziran 2015, 23:28:13

char katarKarsilastir(char *katar1, char *katar2) 
{
    while(*katar1!=0){
            if (*katar1 != *katar2) {
                return (0);
            }
            katar1++;
            katar2++;
    }     
    return (1);
}
Özel mesaj okumuyorum, lütfen göndermeyin.

z

Üzerinde biraz daha oynanması lazım.

Str1='1234',0
Str2='12345',0

Birbirine eşit değildir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

standard C library icinde soyle yazilmis:

int strcmp(const char* s1, const char* s2)
{
    while(*s1 && (*s1==*s2))
        s1++,s2++;
    return *(const unsigned char*)s1-*(const unsigned char*)s2;
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.