hal kütüphanesi seri port

Başlatan görkem, 04 Ekim 2017, 00:35:22

görkem

Arkadaşlar merhaba seri porttan terminale veri gördermek istiyorum fakat nedenini anlayamadığım şekilde terminale veri ulaşmıyor usb rs232 çeviriciye ,rs232 to TTL çevirici bağlı uçlarını tx-rx bağladığımda terminalden gönderdiğim veri dönüyor fakat stm32 ye bağladığımda tepki yok

#include "main.h"
#include "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */
uint8_t buffer=0x45;
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
 HAL_UART_Transmit(&huart2,(uint8_t *)&buffer,1,1000);
		HAL_Delay(1000);
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Configure the main internal regulator output voltage 
    */
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USART2 init function */
static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

görkem

Lojik analizör ile baktığımda 1 byte lık gönderdiğim veriyi görüyorum windows 10 olduğu için usb -rs232 uyumsuzlukmu yapıyor dicem ama rx-tx i kendi içinde bağladığımda veri iletimi sağlanıyor

MC_Skywalker

Kullandığın terninal programında sıkıntı olabilir. TerraTerm kullanıyordum benzer soruın yaşadım. Daha sonra RealTerm diye başka bir programla deneyince sorunsuz verileri gördüm.

Stm32F0 için

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t tampon[100];
int len;
/* USER CODE END PV */


while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    sprintf(tampon, "Merhaba Dunya");
    len=strlen(tampon);        
    HAL_UART_Transmit(&huart1, tampon, len, 1000);
    HAL_Delay(500);
  }
  /* USER CODE END 3 */


/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

yasin_arsln

Kod bloğunda bir problem göremedim. Bende terminal.exe adında bir program kullanıyorum bende bunu da deneyebilirsin. Bağlantılarını da kontrol etmekte fayda var. RX --> RX e, TX-->TX'e  denk gelmiş ise bundanda kaynaklanıyor olabilir.

uardal

Bende yaşadığım sorunu yazayım, pc ile arduinoyu seri portla haberleştiriyorum usb to rs232 ve ttl dönüştürücü yaptım. fakat devre usb kablo bağlı olmadan haberleşmiyor. rs232 nin 5 nolu (-) ucunu ortak kullanmama rağmen arada izole olduğu için usb program kablosundan (-) alıyor anladığım kadarıyla. Böyle bir sorununuz olabilirmi?

MC_Skywalker


görkem

önerdiğiniz usb dönüştürücü den aldım ilk etapda yine çalışmadı çıkarıp taktım birden çalışmaya başladı anlayamadım ne olduğunu çevirici de kullanılan çip ile eski kullandığım seriport dönüştürücüde aynıydı sadece kablolu olan versiyondu bu çipin driver ı sorunlu sanırım

MC_Skywalker

Sorun sizdeki sürücünün klon PL2303 vb. çipli dönüştürücüleri tanımaması gibi duruyor.

görkem

diğer bilgisayarımda sorunsuz kullanabiliyordum klon değildi bu pc de saçmaladı driver problemi muhtemelen

Hattusa

#9
slm arkadaşlar;

uint_16 veriler[25];
uint_8 buffer[50];
uint_8 sayac =0;

veriler adlı 25 adet int tipi verim var ve ben usart üzerinden  göndermek istiyorum. bu int tipi verileri tek tek
8 bitlik verilere dönüştürüpte mi yollamalıyım? yoksa başka bir teknik varmıdır?
sayac =0;
for(int x=0;x<50;x=x+2){
buffer[x] =veriler[sayac] /255;
buffer[x+1] =veriler[sayac]%255;
sayac++;
}
HAL_UART_Transmit(&huart2,(uint8_t *)&buffer,50,1000);
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

tekosis

#10
uint16_t adc_veri_16bit[500];

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
 bayrakDmaUsartTransferBittimi=1;
 HAL_UART_DMAStop(&huart1);
}

adc_verisi_oku(){
adc okuma işlemi.......  }

adc_verisi_yolla()
{
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)adc_veri_16bit,1000);
 while(bayrakDmaUsartTransferBittimi==0){}
 bayrakDmaUsartTransferBittimi=0;
}

Yukarıdaki kodla dma kullanarak 16bitlik dizinin 500 adet verisini gönderiyorum. HAL_UART_Transmit_DMA 8bit veri transfer ediyor. ondan dolayı 500 adet veri için 1000 değerini girdim. göndereceğiniz veri 8 bit ise 1000 yerine istediğiniz sayıyı yazabilirsiniz. Aşağıda da cubemx kullanarak dma ile usart veri transferi anlatılıyor.

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Hattusa

slm arkadaşlar;
stm32 dden gönderdiğim datalar sanırım gidiyor, yalnız aklıma takılan konu ise;

java arayüzünde almış olduğum dataları byte den tekrar integer değere çevirmem lazım, yanlış bir mantık mı kullanıyorum bilmiyorum. lütfen bir inceleyebilirmisiniz?
şimdi
byte[]buffer=SerialPort.readBytes(52);

komutu ile stmden gelen 26 datamın byte dönüştürülmüş hali değil mi? yani stmden gelen 2 bytelik 26 verim byte byte olarak 52 adet byte olarak java programıma geliyor.
şimdi ben bu 52 byte i 26 tane integer değere nasıl dönüştürmeliyim?

int datam[0]=(buffer[0]*255)+buffer[1]
şeklinde mi olmalı yoksa daha basit bir teknik varmıdır?
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

Hattusa

Alıntı yapılan: pro-TR - 04 Mayıs 2019, 12:36:20slm arkadaşlar;
stm32 dden gönderdiğim datalar sanırım gidiyor, yalnız aklıma takılan konu ise;

java arayüzünde almış olduğum dataları byte den tekrar integer değere çevirmem lazım, yanlış bir mantık mı kullanıyorum bilmiyorum. lütfen bir inceleyebilirmisiniz?
şimdi
byte[]buffer=SerialPort.readBytes(52);

komutu ile stmden gelen 26 datamın byte dönüştürülmüş hali değil mi? yani stmden gelen 2 bytelik 26 verim byte byte olarak 52 adet byte olarak java programıma geliyor.
şimdi ben bu 52 byte i 26 tane integer değere nasıl dönüştürmeliyim?

int datam[0]=(buffer[0]*255)+buffer[1]
şeklinde mi olmalı yoksa daha basit bir teknik varmıdır?


sanırım java platformunda byte değeri -128 +128 arasında kalıyor. benim seri porttan okuma yaptırdığım zamanlarda eğer gelen data - değere düşüyor olmalı ki dönüştürdüğüm integer değer saçmalıyor.
seri porttan gelen datayı integer değere dönüştürmeden önce 0 dan küçük mü diye sorgulamam lazım, eğer düşükse elimdeki - değeri +256 ile toplarsam doğru sonuca ulaşabilirim. yanlışmıyım?

sıkıntım şu 15 yıldır mcu lara program yazmaya çalışıyorum ve geçirdiğim bu süre ne yazıkki basic diliydi, işlemler C de olunca huyu suyu değişiyor işlerin. her ne kadar yazılım lagoritması aynı olsa da...
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

yasin_arsln

Alıntı yapılan: pro-TR - 04 Mayıs 2019, 22:01:33sanırım java platformunda byte değeri -128 +128 arasında kalıyor. benim seri porttan okuma yaptırdığım zamanlarda eğer gelen data - değere düşüyor olmalı ki dönüştürdüğüm integer değer saçmalıyor.
seri porttan gelen datayı integer değere dönüştürmeden önce 0 dan küçük mü diye sorgulamam lazım, eğer düşükse elimdeki - değeri +256 ile toplarsam doğru sonuca ulaşabilirim. yanlışmıyım?

sıkıntım şu 15 yıldır mcu lara program yazmaya çalışıyorum ve geçirdiğim bu süre ne yazıkki basic diliydi, işlemler C de olunca huyu suyu değişiyor işlerin. her ne kadar yazılım lagoritması aynı olsa da...
Hocam merhaba,
Burada senin java da tanımladığın değişkeni unsigned yapmak gerekli java da böyle bir tanımlama yok. istersen byte array'ini short olarak tanımla 2byte'lık verilere eşitlersin. işlem yaparkende
short[]buffer=SerialPort.readBytes(52);

int datam[0]=((buffer[0]&0x00FF)<<8)+(buffer[1]&0x00FF)
şeklinde alabilirsin.
Java da uzman değilim ama işini bu çözebilir.

devrecii

#14
söyle yapabilirsin.


byte[] gelen ;
short yada int aaa;


  aaa=gelen[xx];

  aaa&=0xff;
 
  ...=aaa;

Direk söyle de olablir     

=((short) (gelen[xx]))&0xff;