Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
UART dan anlamsız veri geliyor
#1
Merhaba

STM32F407VGT işlemcisinde Uart2 de interrupt ile veri alıp göndermek istiyorum.

Variable:
uint8_t com_gelen[11];
uint8_t com_giden[]="usart test\r\n";
İnitialize:
  /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_USART2_UART_Init();
 /* USER CODE BEGIN 2 */
 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);  //burda interupt başlıyor 
While :

HAL_UART_Transmit_IT(&huart2, (uint8_t*)& com_giden, 12);
          HAL_Delay(500);

Interrupt uniti ayarları:

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern uint8_t com_gelen[11];
/* USER CODE END PV */



void USART2_IRQHandler(void)
{
 /* USER CODE BEGIN USART2_IRQn 0 */
    HAL_UART_Receive_IT(&huart2, (uint8_t *) &com_gelen, 11);
 /* USER CODE END USART2_IRQn 0 */
 HAL_UART_IRQHandler(&huart2);
 /* USER CODE BEGIN USART2_IRQn 1 */
 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
 /* USER CODE END USART2_IRQn 1 */
}


Usart 2 interrupt ayarları
CPr9WI.png
Termite port dinleme programına gelen veri:

[00][00][00]àü[00][00]à[00]à[00][00][00][00]àü[1C][00]à[00]à[00]

Putty de aynı şekilde anlamsız veri geliyr.

Uart çeviricim CP2103 Silicon Labs:
eGiL9n.png

Arduino megadan aynı usb ttl çevirici cp2103 ile veri gönderdiğimde sorunsuz çalışıyor.
Sadeve arm geliştirme kartınd bu problemi yaşıyorum.
Bir türlü çözemedim. Cp2103 driverini yeniden yükledim prolific eski usb ttl çevircilerini 2008 yılı driver ile denedim.snuç aynı.
Genelde telefondan ingilizce klavye ile ileti gönderiyorum.
Cevapla
#2
Gönderme satırınızı aşağıdaki gibi düzenleyip tekrar denermisiniz.
Not: Baudrate, parity, doğru fiziksel bağlantı gibi hususları hatırlatmayı gerekli görmüyorum.

HAL_UART_Transmit(&huart2,(uint8_t*)com_giden,strlen(com_giden),10); 

strlen de hata alırsanız yukarıya
#include <string.h> i eklemeyi unutmayın.
Cevapla
#3
(09-03-2020, Saat: 08:11)frmman Adlı Kullanıcıdan Alıntı: Gönderme satırınızı aşağıdaki gibi düzenleyip tekrar denermisiniz.
Not: Baudrate, parity, doğru fiziksel bağlantı gibi hususları hatırlatmayı gerekli görmüyorum.

HAL_UART_Transmit(&huart2,(uint8_t*)com_giden,strlen(com_giden),10); 

strlen de hata alırsanız yukarıya
#include <string.h> i eklemeyi unutmayın.

Interrupt ile haberleşen UART içerisinde bu şekilde interrupt kullnmadan haberleşme yapmak mümkün mü ? Uygun mu?
(Eleştiri değil bilmediğim için soruyorum)

Bu kodu da denediim sonuç aynı. Aynı bilgisayarda farklı projenin sorunsuz bağlandığını gördüm.
Şaşkınım, anlam veremiyorum. Projeyi yeniden create edip deneyeceğim.

Bu sorundan farklı olarak şöyle bir sıkıntım var.
Interrupt ile gelen UART datasını uint_8 içinden char dizisine aktarıyorum.
Bilgisayardan şöyle bir komut dizisi gönderiyorum:

<10-8-0-1>
Bu komutu char dizisini atmak için < ve > işaretini arıyorum:

int bas,bit=0;
for (int k = 0; k < 12; ++k) {
 if (com_gelen[k]=='<') bas=k+1;   //< işaretinin yeri
 if (com_gelen[k]=='>') bit=k;     //> işaretinin yeri
char komut[12]  dizisini temizliyorum:

memset(komut, NULL, sizeof(komut));

uint_8 olarak gelen datayı komut char dizisini içine atıyorum:,
HAL_Delay(100);
    int kk=0;
    for (int k = bas; k < bit; ++k){
    komut[kk] = com_gelen[k];
    kk++;
                      }
ardından komut char dizsi üzerinde string parse işlemlerini yapıyorum.
Bu noktada normalde while içinde idöngü tamamlanınca döngü sonunda com_gelen i null yapıyorum:

memset(com_gelen, NULL, sizeof(com_gelen));

buraya kadar komut sorunsuz çalışırsa bir sonraki döngüde hatasız devam ediyor.
ANCAK;

eğer bir sıkıntı olursa işlem

memset(com_gelen, NULL, sizeof(com_gelen));

satırına ulşamadığından bu değişken null yapılamıyor ve bir sonraki uart datsı geldiğinde en sondaki boş karakterden itibaren yazmaya başlıyor, Şöyleki:
Sorunsuz çalışırsa uart dan gelen verinin görünümü
qDvKeo.png
Eğer sorun oluşursa gelen data en son boş byte dan itibaren yazılmaya başlıyor şöyle:
ZnP1be.png
sorunu çözmek için bu for döngüsünde bir çözüm bulmak yada gelen veriyi yeniden pare etmem gerekiyor.

 int bas,bit=0;
              for (int k = 0; k < 12; ++k) {
              if (com_gelen[k]=='<') bas=k+1;
              if (com_gelen[k]=='>') bit=k;

                    }

her zaman komut char dizisi içine < işaretinden > işaretine kadar olan kısım yazılmalı bi üstteki for döngüsünü yada
gelen datayı yeniden parse etmem gerekiyor.

kinci resimdeki gibi en son byte dan itibaren veriyi com_gelen uint_8
değişkenine yazdığı için için hemen üstteki < ve > iaretlerini arayan for döngüsü doğru < işaretinin dizi içerisindeki yerini > işaretinden sonra verdiğinden ben
<10-8-0-1>

şeklinde parse etmek için data beklerken
<10-8-

bu şekilde data alınca işleme devam edemiyorum. Her iki resimdede data gelmiş olsa da sorunsuz şekilde nasıl parse edebilirim?

uint8_t com_gelen[12];
Değişkenine her veri gelişinde verinin her zaman 0 indexden itibaren yazılması mümkün mü?

Tecrübe ve tavsiyenizi duymayı çok isterim.
Genelde telefondan ingilizce klavye ile ileti gönderiyorum.
Cevapla
#4
(09-03-2020, Saat: 19:14)41linea41 Adlı Kullanıcıdan Alıntı: Interrupt ile haberleşen UART içerisinde bu şekilde interrupt kullnmadan haberleşme yapmak mümkün mü ? Uygun mu?
(Eleştiri değil bilmediğim için soruyorum)

Bu kodu da denediim sonuç aynı. Aynı bilgisayarda farklı projenin sorunsuz bağlandığını gördüm.
Şaşkınım, anlam veremiyorum. Projeyi yeniden create edip deneyeceğim.

MCU tarafından veri alma için INT kullanmak mantıklı ve performanslı bir tercih olacaktır. 

Aşama aşama gidelim. Önce MCU dan pc ye veri gönderme kısmını halledelim. Sonra INT ile veri almadaki sorunları çözmeye çalışırız.

Öncelikle yeni bir proje oluşturun.

Veri göndermek istediğiniz yere şunu yazın.

.....
char com_giden[50];
int ix = 0;
....
sprintf(com_giden,"merhaba dunya : %d\r\n",ix++);
HAL_UART_Transmit(&huart2,(uint8_t*)com_giden,strlen(com_giden),10);
HAL_Delay(500);
.....
.....
void USART2_IRQHandler(void)
{
 // içerisinde değişiklik yapmayın 
}


Cevapla
#5
(10-03-2020, Saat: 16:14)frmman Adlı Kullanıcıdan Alıntı:
(09-03-2020, Saat: 19:14)41linea41 Adlı Kullanıcıdan Alıntı: Interrupt ile haberleşen UART içerisinde bu şekilde interrupt kullnmadan haberleşme yapmak mümkün mü ? Uygun mu?
(Eleştiri değil bilmediğim için soruyorum)

Bu kodu da denediim sonuç aynı. Aynı bilgisayarda farklı projenin sorunsuz bağlandığını gördüm.
Şaşkınım, anlam veremiyorum. Projeyi yeniden create edip deneyeceğim.

MCU tarafından veri alma için INT kullanmak mantıklı ve performanslı bir tercih olacaktır. 

Aşama aşama gidelim. Önce MCU dan pc ye veri gönderme kısmını halledelim. Sonra INT ile veri almadaki sorunları çözmeye çalışırız.

Öncelikle yeni bir proje oluşturun.

Veri göndermek istediğiniz yere şunu yazın.

.....
char com_giden[50];
int ix = 0;
....
sprintf(com_giden,"merhaba dunya : %d\r\n",ix++);
HAL_UART_Transmit(&huart2,(uint8_t*)com_giden,strlen(com_giden),10);
HAL_Delay(500);
.....
.....
void USART2_IRQHandler(void)
{
 // içerisinde değişiklik yapmayın 
}


Malesef sonuç aynı Interrupt ile yada interrupt sız veriyi gönderdiğinde Termite ya putty de anlamsız karakterler geliyor.

Yeni proje de deneme yaptım.
Genelde telefondan ingilizce klavye ile ileti gönderiyorum.
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi