Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual C# => Konuyu başlatan: baran123 - 09 Haziran 2015, 21:25:40

Başlık: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 09 Haziran 2015, 21:25:40
Bilgisayardan usart ile veri gönderebiliyorum fakat alma da problem var.Önce sadece 1 karakter alıp değerlendireceğim.Şöyle bir deneme yaptım.
Bağlantı

SP.BaudRate = Convert.ToInt32(cmbBaud.SelectedItem);
                    SP.PortName = Convert.ToString(cmbPort.SelectedItem);
                    SP.DataBits = 8;
                    SP.Parity = Parity.None;
                    SP.StopBits = StopBits.One;
                    SP.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
                    SP.Open();


Kesme

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] RxData = new byte[1];
            SP.Read(RxData, 0, 1);

            txtDataRx.AppendText(Convert.ToString(RxData[0]));
        }


STM32

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        if((char)USART_ReceiveData(USART1) == '1')
        {
            LED_Blue_State = 1;
            USART_SendData(USART1, 'A');
        }

        if((char)USART_ReceiveData(USART1) == '0')
        {
            LED_Blue_State = 0;
            USART_SendData(USART1, 'B');
        }
    }
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}


STM ile veri gönderdim anda PC arayüz kilitleniyor ve şu hatayı gösteriyor.

"Additional information: Çapraz iş parçacığı işlemi geçerli değil: 'txtDataRx' denetimine oluşturulduğu iş parçacığı dışında başka bir iş parçacığından erişildi."
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 09 Haziran 2015, 21:35:27
Baran, ne zaman kesme içinde işlem yapmaktan vazgeçeceğini söyler misin?
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 09 Haziran 2015, 22:11:02
Hocam denemek için öyle yaptım. :)
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: ceyhanan - 09 Haziran 2015, 22:38:08
Bu işi ben de bir türlü beceremedim. Göndermeyi yaptım ama almada hep sıkıntı yaşadım, çok da üzerinde durmadım. Alma işini farklı bir thread içerisinde yapmaktan bahsediliyordu ama net bir bilgim yok. istersen bir araştır.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 09 Haziran 2015, 22:46:00
Bilgisayarda mı alamıyorsun, MCU'dan mı?
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: ceyhanan - 09 Haziran 2015, 22:53:04
bilgisayardan alamıyorum, kilitleniyor daha doğrusu baranınki gibi. geçiştirdim hep işimi gördüm ama halledemedim bir türlü.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 09 Haziran 2015, 22:53:12
MCU dan alamıyorum hocam C#tarafında problem var galiba
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Hadi - 09 Haziran 2015, 22:59:37
Kardeş serial port komponenti başta sp adını vermişsin ama kesme de serialPort olarak adlandırılmış. Onu bi kontrol et.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 09 Haziran 2015, 23:17:10
Hem bilgisayardan almak için hem de stm'den almak için bir örnek paylaşırım bu gece bi aksilik olmazsa.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 09 Haziran 2015, 23:27:27
Alıntı yapılan: Hadi - 09 Haziran 2015, 22:59:37
Kardeş serial port komponenti başta sp adını vermişsin ama kesme de serialPort olarak adlandırılmış. Onu bi kontrol et.
O kesme methodunun adı :)
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Hadi - 09 Haziran 2015, 23:33:37
Alıntı yapılan: Baran Ekrem - 09 Haziran 2015, 23:27:27
O kesme methodunun adı :)

Tamam da sp adlı komponentin kesmesi ama. Sen bi böyle yap bi dene baktın değişen bisey yok geri düzelt.



private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] RxData = new byte[1];
            SP.Read(RxData, 0, 1);

            txtDataRx.AppendText(Convert.ToString(RxData[0]));
        }

Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: fatih6761 - 09 Haziran 2015, 23:33:45
CheckForIllegalCrossThreadCalls = false
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 09 Haziran 2015, 23:38:55

public MainForm()
{
   InitializeComponent();
   CheckForIllegalCrossThreadCalls = false;
}

Ekleyerek oldu.Teşekkür ederim.Ne işe yarıyor onu öğrenmek gerek.USB HIDde de vardı aynı kod.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 09 Haziran 2015, 23:58:37
threadlar arasında çapraz çalışmaya izin veriyor, daha önce forumda bahsi geçmişti.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 10 Haziran 2015, 00:14:54
PC ye şöyle string atabiliriz.Denedim.


/***********************************************************
* Function Name  : USART_SendString
* Description       : USART dan string yollanır.
* Input                : USARTx, char*
* Return              : void
***********************************************************/
void USART_SendString(USART_TypeDef* USARTx, char* USART_Data)
{
   while(*USART_Data)
   {
        while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE));
        USART_SendData(USARTx, *USART_Data);
        USART_Data++;
   }
}

//mesela
USART_SendString(USART1, "LED On\r\n");


C# da

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string RxData;

   RxData = SP.ReadLine() + "\r\n";
   txtDataRx.AppendText(RxData);
}
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 10 Haziran 2015, 10:38:22
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
}
    }
}
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: muhittin_kaplan - 10 Haziran 2015, 13:42:05
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/ (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/ (http://blog.ahmetbutun.net/index.php/2009/04/07/cross-thread-operation-not-valid/)

aha oda burada.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 10 Haziran 2015, 17:57:42
Evet bende delegate ile yaptım.
Teşekkürler Gökhan hocam :)
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 10 Haziran 2015, 18:00:05
Bahsettiğiniz yöntem ile bir örnek yazarsanız istifade ederiz.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 10 Haziran 2015, 18:12:41
Ş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);
        }
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 10 Haziran 2015, 22:06:43
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 .
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: muhittin_kaplan - 10 Haziran 2015, 22:09:26
@Baran
"Usarttan aldığım", bu alım işlemi PC demi MCU damı
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: baran123 - 10 Haziran 2015, 22:12:05
Pc den gönderdiğim stringi mcu ile alıp mcu içerisinde sabit bir string ile karşılaştırmak istiyorum hocam.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: Gökhan BEKEN - 10 Haziran 2015, 23:22:07
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);
}
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: z - 11 Haziran 2015, 09:08:00
Üzerinde biraz daha oynanması lazım.

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

Birbirine eşit değildir.
Başlık: Ynt: STM32 USART ile PC(C# Rx Interrupt)
Gönderen: mufitsozen - 11 Haziran 2015, 10:51:36
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;
}