Delphi Can

Orjinalini görmek için tıklayınız: UART dan anlamsız veri geliyor
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
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 :

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

Interrupt uniti ayarları:

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



Kod:
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:

Kod:
[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ı.
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.
(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:

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

Kod:
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:

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

uint_8 olarak gelen datayı komut char dizisini içine atıyorum:,
Kod:
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:

Kod:
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

Kod:
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.

Kod:
 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
Kod:
<10-8-0-1>

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

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

Kod:
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.
(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 
}


(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.
(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 
}


Merhaba

Aynı sorunla tekrar karşılaştım ve sorunun clock ayarlarını yanlış yapmamdan kaynaklandığını uzun ve hayal kırıklığı dolu bir araştırma sonucu farkettim.

Konuya hakim hocalarımız , arkadaşlarımız clock configuration nasıl olmalı basit bir örnekle anlatabilir mi?

Burdaki videoda 00:50 de STM32F103C8T6 işlemcisi için clock ayarını HSE > PLLCLK olrak yapıyor.  Video : Video
00:42 de sadece HSE aktiv ediliyor. Ben aynısını STM32F4DISCO için yaptığımda UART dan anlamsız veri geliyor. Saat ayarı CUBEMx üzerinde hata vermesede hatalı çalıştığından gelen UART verisi anlamsız karakterler. Kullandığım USB TTL çevirici Silicon labs CP210x ve Win 10 64 bit digital imzalı olarak görüyor.

Videodaki örnek ayar fakat eski versiyon CubeMx kullanılmış şimdi bu ayar maenüsü farklı:
kamF9I.png

Bu ayar UART dan anlamsız veri gelmesine sebep oluyor:

RAjROR.png

Fakat bu ayarda HSE yerine HSI seçtiğimde UART düzgün çalışıyor:
Anlamadığım ben HSI aktif etmiorum RCC ayarlarında sadece HSE aktif ediyorum. Niye böyle oluyor?
Çalışan ayarlardır:
AsW7vJ.png


STM32F407VGT6 işlemcisini 100 Mhz de Harici RCC kullanarak çalıştırmak için olması gerek ayar nedir?

Basit bir örnek verirseniz çok makbule geçer.

Bu ayarları hem STMCubeIDe hemde Arm Keil 5.30 denediğimde aynı sonuçlar aldım.

Sağlıklı Günler dilerim.
3 şeye dikkat etmenizi öneririm.
1) Saat ayarları
2) Baudrate değeri
3) Yollanan değerin/metnin karakter seti

Ayrıca denemelerinizde şu yolu izlemeyi öneririm.
PC'den karta bir değer yollayın ve bunu tekrar PC'ye yollayın.
Ayrıca karta tek karakterli bir değer yollayın ve bunu koşula bağlı geri yollar yada yollamazsanız karta verinin düzgün gidip gitmediğini de görürsünüz.
(06-06-2020, Saat: 12:59)engerex Adlı Kullanıcıdan Alıntı: [ -> ]3 şeye dikkat etmenizi öneririm.
1) Saat ayarları
2) Baudrate değeri
3) Yollanan değerin/metnin karakter seti

Ayrıca denemelerinizde şu yolu izlemeyi öneririm.
PC'den karta bir değer yollayın ve bunu tekrar PC'ye yollayın.
Ayrıca karta tek karakterli bir değer yollayın ve bunu koşula bağlı geri yollar yada yollamazsanız karta verinin düzgün gidip gitmediğini de görürsünüz.

Sn engerex

Son resimdeki şekilde ayarladığımda sorunsuz çalıştığını gördüm. Fakat Clock configuration özellikle PLL konusunda bilgi eksikliğim var.
Değer gönderemeyişimin sebebi de buymuş PLL source Mux kısmında HSE yerine neden HSI tercih edildiğinde çalıştığını anlamaya çalışıyorum . Halbuki, System Core RCC altında HSE aktif edilmiş durumda. Burdaki ayrıntıyı çözemedim / anlayamadım.
W1oqTX.png

Clock Configuration ayarı hakkında bilgi eksikliğim var.
Geliştirme kartınız nedir? STM32F4DISCO ?
(07-06-2020, Saat: 10:39)engerex Adlı Kullanıcıdan Alıntı: [ -> ]Geliştirme kartınız nedir? STM32F4DISCO ?

Evet stm32fdisco fakat proje olustururken stm32fvgt6 islemcisini secerek olusturuyorum.
Sayfalar: 1 2