STM32 USART ile PC(C# Rx Interrupt)

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

baran123

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."

Gökhan BEKEN

Baran, ne zaman kesme içinde işlem yapmaktan vazgeçeceğini söyler misin?
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123


ceyhanan

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.

Gökhan BEKEN

Bilgisayarda mı alamıyorsun, MCU'dan mı?
Özel mesaj okumuyorum, lütfen göndermeyin.

ceyhanan

bilgisayardan alamıyorum, kilitleniyor daha doğrusu baranınki gibi. geçiştirdim hep işimi gördüm ama halledemedim bir türlü.

baran123

MCU dan alamıyorum hocam C#tarafında problem var galiba

Hadi

Kardeş serial port komponenti başta sp adını vermişsin ama kesme de serialPort olarak adlandırılmış. Onu bi kontrol et.

Gökhan BEKEN

Hem bilgisayardan almak için hem de stm'den almak için bir örnek paylaşırım bu gece bi aksilik olmazsa.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

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ı :)

Hadi

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]));
        }

fatih6761

CheckForIllegalCrossThreadCalls = false

baran123

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.

Gökhan BEKEN

threadlar arasında çapraz çalışmaya izin veriyor, daha önce forumda bahsi geçmişti.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

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);
}