برد STM سخت افزار

آموزش میکروکنترلرهای STM32 بخش چهارم دریافت اطلاعات از USART

نوشته شده توسط علی زاهدی

پیش از این ۳ قسمت از مجموعه آموزش های میکروکنترلر STM32 منتشر شده است. که با کلیک بر روی این لینک می‌توانید لیست آموزش‌ها را مشاهده نمایید. پیشنهاد میکنم در صورتی که آموزش‌های قبلی را مطالعه نکرده‌اید. ابتدا قسمت های قبلی این مجموعه آموزشی را مطالعه کرده و سپس مطالعه ی این آموزش را ادامه دهید. در این پست قصد داریم تا نحوه دریافت اطلاعات از طریق ارتباط USART یا همان ارتباط سریال (USART) میکروکنترلرهای STM32 را آموزش دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


اتصالات برد STM32


برد میکروکنترلر STM32 یا همان Bluepill برای پروگرام کردن به مبدل نیاز دارد. در این آموزش با استفاده از یک مبدل USB to TTL میکروکنترلر STM32 را به کامپیوتر متصل می‌کنیم. همانطور که در تصویر مشاهده می‌کنید. پایه RX مبدل USB to TTL به پایه شماره ۹ میکروکنترلر متصل شده است. و پایه TX مبدل به پایه شماره ۱۰ میکروکنترلر متصل شده است.

اتصالات برد STM32 به usb to ttl - دیجی اسپارک

 


پیکربندی درگاه ارتباط USART


در صورتی که آشنایی کافی با میکروکنترلرهای ARM را ندارید. و یا نحوه ساخت پروژه جدید در نرم افزار STM32CubeMX را نمی‌دانید. قسمت های قبلی این آموزش را مطالعه کنید. پس از انتخاب میکروکنترلر مورد نظر در نرم افزار STM32CubeMX ابتدا مطابق آموزش های قبل قسمت های SYS و RCC را تنظیم نمایید. بایستی از منو سمت چپ در قسمت A->Z  ابتدا همانند بخش اول این مجموعه آموزشی PC13 را با نام LED به صورت خروجی تعریف کنید.

نرم افزار STM32CubeMX - دیجی اسپارک

 

سپس بر روی گزینه USART1 کلیک کنید. و گزینه Mode را بر روی Asynchronous سپس در قسمت Parameter Setting می‌توانید تنظیماتی از جمله تنظیم Baud Rate ، Parity و … را انجام دهید. در این آموزش تنها بخش Baud Rate را بر روی مقدار ۹۶۰۰ تنظیم می‌کنیم. پس از آن همانند تصویر زیر مشاهده می‌کنید که پایه‌ PA10 بعنوان RX و پایه PA9 بعنوان TX تعریف شده است.مشاهده می‌کنید که با اتصال مبدل USB to TTL به این پایه ها میتوان انواع دیتا های مختلف را به سمت کامپیوتر ارسال نمود.

تنظیمات نرم افزار STM32CubeMX - دیجی اسپارک

 

سپس بایستی وارد بخش NVIC Settings شده و بخش مربوط به فعال کردن وقفه USART را فعال کنید. به تصویر زیر توجه کنید.

فعال سازی USART در نرم افزار STM32CubeMX - دیجی اسپارک

 

همانطور که در تصویر بالا مشاهده می‌کنید. پایه های مربوط به USART1 که در بخش اتصالات برد معرفی شدند. بر روی میکروکنترلر به رنگ سبز درآمده اند. در ادامه همانند آموزش های قبل به صفحه Clock Configuration رفته و قسمت HCLK را به ۷۲ مگاهرتز تغییر دهید.

تنطیمات قسمت HCLK به ۷۲ مگاهرتز - دیجی اسپارک

سپس بایستی به صفحه Project Manager رفته و مطابق آموزش های قبلی این قسمت را نیز تنظیم نمایید. سپس پس از انجام کامل تنظیمات بر روی گزینه GENERATE CODE کلیک کنید تا پروژه ساخته شود. بر روی پس از ورود به نرم افزار KEIL فایل main.c را باز کنید. در ادامه توابع HAL مربوط به این بخش را با استفاده از مثال بصورت کامل توضیح خواهیم داد.

 


کد نویسی پروژه STM32


برای دریافت اطلاعات از USART میکروکنترلرها دو روش وجود دارد. که این روش ها عبارتند از؛ روش polling و روش interrupt

  • روش Polling

در روش polling در این روش کاربر توسط برنامه نویسی با فواصل زمانی مشخص و دائما رویداد مورد نظر را بررسی می کند تا به آن پاسخ دهد. در این روش CPU دائما درگیر بررسی شرط مربوط به دریافت اطلاعات از USART است. برای مثال به کد زیر توجه کنید. توجه داشته باشید برای این که از دستور printf خطا دریافت نکنید. بایستی کد مربوط به این دستور که در قسمت قبلی این مجموعه آموزشی نوشته شده است را به ابتدای برنامه خود اضافه نمایید. همچنین بایستی کتابخانه stdio.h را نیز به کد خد اضافه کنید.

//کد های زیر باید قبل از حلقه نوشته شوند.
uint8_t NewData;
HAL_StatusTypeDef Status;
//کد های زیر بایستی داخل حلقه قرار گیرند.
Status=HAL_UART_Receive(&huart1,&NewData,1,100);
if(Status == HAL_OK)
{
	printf("NewData:%c\r\n",NewData);
	if(NewData[0]=='S')
	{
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
		printf("LED ON\r\n");
	}
	if(NewData[0]=='R')
	{
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
		printf("LED OFF\r\n");
	}
}
HAL_Delay(10);

عملکرد کد بالا (که منبع آن این لینک است) به این صورت است که داخل نرم‌افزار سریال مانیتور کامپیوتر با ارسال کاراکتر S بزرگ LED موجود بر روی برد Blue Pill روشن می‌شود. و گزارش روشن شدن LED به سمت کامپیتر ارسال شده و داخل سریال مانیتور نمایش داده می‌شود. همچنین با ارسال کاراکتر R بزرگ LED موجود بر روی برد Blue Pill خاموش می‌شود. و گزارش خاموش شدن LED به سمت کامپیتر ارسال شده و داخل سریال مانیتور نمایش داده می‌شود. همانطور که پیش از این گفته شد استفاده از این روش برای دریافت اطلاعات مناسب نیست. برای رفع عیب های این برنامه از روش interrupt استفاده می‌کنیم.

 

  • روش interrupt

در این روش CPU درگیر بررسی شرط دریافت اطلاعات از USART نمی باشد. عملکرد این روش به این صورت است که پس از دریافت اطلاعات از USART ، بخش CPU مطلع می‌شود که اطلاعات دریافت شده  است و باید آن را بررسی کند. پس همانند بخش دوم این مجموعه آموزشی CPU برنامه را در قسمتی که هست، رها می‌کند و به سراغ روتین وقفه USART خواهد رفت تا دستورات آن بخش را یک بار اجرا کند. و دروباره به سراغ برنامه اصلی آید. با استفاده از این روش سرعت کار CPU بسیار بیشتر خواهد. در ادامه قصد داریم تا با استفاده از این روش کد بالا را بازنویسی کنیم. با این تفاوت که در این بخش جای دریافت کاراکتر قصد دریافت رشته از USART را داریم.

//این قسمت کاملا بایستی قبل از تابع main نوشته شود.
uint8_t RXBuffer[40];
uint8_t RXBufferCount=0;
uint8_t NewDataInt;
uint8_t NewDataLineCount=0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		RXBuffer[RXBufferCount++]=NewDataInt;
		RXBuffer[RXBufferCount]=0;
		if((NewDataInt=='\n')&&(RXBufferCount>0))
		{
			NewDataLineCount=RXBufferCount;
			RXBufferCount=0;
		}
		
		HAL_UART_Receive_IT(&huart1,&NewDataInt,1);
	}	
}

همانطور که در بخش دوم این مجموعه آموزشی گفته شد. توابع مربوط به روتین وقفه میکروکنترلرهای STM32 داخل فایل stm32f1xx_it.c قرار دارد. برای انتقال این تابع به فایل main بایستی از تابع callback استفاده شود. همانطور که در کد بالا مشاهده می‌کنید. از تابع HAL_UART_RxCpltCallback برای وقفه USART استفاده شده است. عملکرد این قسمت برنامه به این صورت است که پس از دریافت اطلاعات از USART مقدار متغیر RXBufferCount برابر طور رشته ارسالی خواهد شد. با استفاده از این متغیر اطلاعات داخل رشته RXBuffer ذخیره می‌شود. سپس متغیر NewDataLineCount همانند flag عمل می‌کند. و داخل برنامه اصلی دریافت شدن اطلاعات از USART را مشخص می‌کند. ادامه کد بالا داخل تابع main نوشته میشود که کد آن را می‌توانید در زیر مشاهده کنید.

// این قسمت داخل تابع main قبل از حلقه نوشته می‌شود.
if(HAL_UART_Receive_IT(&huart2, (uint8_t *)&NewDataInt, 1) != HAL_OK);
//این قسمت بایستی داخل حلقه اصلی قرار گیرد.
if(strstr((char*)Data,"LED:1")!=0)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);
               printf("LED ON\r\n");
	}
	if(strstr((char*)Data,"LED:0")!=0)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);
         printf("LED OFF\r\n");
	}

عملکرد کد به این تریتیب است که همانند کد قبل با ارسال عبارت LED:1 از سمت کامپیوتر LED موجود بر روی PC13 روشن خواهد شد و گزارش روشن شدن آن نیز به سمت کامپیوتر ارسال خواهد شد. همچنین با ارسال عبارت LED:0 از کامپیوتر LED موجود بر روی برد خاموش خواهد شدو و گزارش خاموش شدن به سمت کامپیوتر ارسال خواهد شد. نحوه پروگرام کردن برنامه بر روی میکروکنترلر در قسمت قبلی آموزش توضیح داده شده است. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول این آموزش را مطالعه نمایید.

 


لوازم مورد نیاز


 

چنانچه در مراحل راه اندازی میکروکنترلرهای stm32 با مشکل مواجه شدید. بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های #دیجی_اسپارک ،  #دانشجوکیت ،  digispark#  و  daneshjookit# منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۵ دیدگاه

    • با سلام
      توجه داشته باشید که پروژه توسط نرم افزار CubeMX ساخته می‌شود. و کد های اولیه توط این نرم افزار در فایل های مختلف پروژه قرار می‌گیرد. شما بایستی بخش هایی که نیاز دارید را به پروژه ساخته شده توسط CubeMX اضافه کنید.

  • سلام من میخوام از یوزارت دیتای هگز دریافت کنم ولی به مشکل برخوردم.این دیتا از سمت درگاه RS485 پی ال سی با پروتوکل مدباس دریافت میشه چون مد RTUهست و دیتای ارسالیش هگز هست من توی میکرو خودم فقط چرت وپرت دریافت میکنم.بینشون هم رابط rs485 to ttlگذاشتم.

    • باسلام
      ابتدا بایستی باودریت و دیگر تنظیمات که دستگاه ارسال کننده داده در آن حالت تنظیم شده را پیدا کرده و USART میکروکنترلر را همانند آن تنظیم کنید. در صورتی که این مقادیر برابر باشند میتوان موقع نمایش داده های دریافتی میکروکنترلر آنها را به صورت هگز نمایش داد.

  • با سلام و عرض ادب ببخشید کد شما برای خواندن و بررسی یک رشته است،اگر بخواهیم یک عدد را خوانده و مقایسه کنیم و بر اساس مقادیر ۱ تا ۴ ورودی توسط برنامه docklight توابعی را فراخوانی کنیم کد را چگونه باید تغییر داد

    • با سلام
      تفاوتی نمیکند. شما میتوانید عدد مورد نظر را دریافت کرده و آن را شرط بزارید. اما اگر میخواهید فرمولی برای این کار داشته باشید. کافیست خانه اول بافر که عدد در آن قرار میگیرد را بر ۴۸ تفریق کنید. در صورتی که عدد بین ۰ تا ۹ را داخل سریال ارسال کرده باشید. همین عدد حاصل معادله ای خواهد بود.

      • ببخشید من طبق کد شما عمل کردم ولی متاسفانه در خروجی سریال نرم افزار هرکولس وقتی دیتا را میفرستم اصلا نمی خواند و حتی پیام های بعدی را هم نمی فرستد و کد تابع کال بک رو هم به سه روش مختلف تغییر دادم اما اصلا وارد کال بک نمیشه یا نمیشناستش و مجبورم کال بک و بیارم توی main یا کد و تو خود main و قبل ویا بعد while بنویسم که البته این سه روش و هر بار یکیش و از کامنت در آوردم و بقیه کامنت بودن تا ببینم کدومش درست کار میکنه که جایی ام که نه ارور میداد نه warnng بازم توی هرکولس چیزی نشون نمیداد ، من هر روشی که سرچ کردم یا به ذهنم رسید امتحان کردم و همشو الان تو ی فابل برنامه ام دارم البته هربار یکیو از کامنت در میارم که ببینم کار میکنه یا نه لطفا راهنمایی کنید:(برخی توابع در فایل های دیگر تعریف شده اند که برای خلاصه کردن اینجا نیوردم) با سپاس از لطفتان
        درون USART.C
        void HAL_UART_RxCpltCallback (UART_HandleTypeDef *huart)
        // {
        // if(huart->Instance==USART2)
        // {
        // HAL_UART_Receive_IT(&huart2, RX_Buffer, sizeof(RX_Buffer));
        // }

        //HAL_UART_Transmit(&huart2, “Hello “, 12, 0xFFFF);
        // uint8_t Test[12];
        // HAL_UART_Transmit(&huart2, Test, 12, 0xFFFF);
        // HAL_UART_Receive_IT(&huart2, Rx_data, 4);

        // HAL_UART_Transmit(&huart2, Str, 20, 0xFFFF);
        // HAL_UART_Receive_IT(&huart2, Str, 20);
        // HAL_UART_Transmit(&huart2, Rx_Done, 30, 0xFFFF);
        // HAL_UART_Receive_IT(&huart2, Rx_data, 1);
        // HAL_UART_Receive_IT(&huart2,Rx_data, 1);
        // uint8_t RXBuffer[1];//data stored in this
        // uint8_t RXBufferCount=0;//Lenght of Number sent
        // uint8_t Message;
        // uint8_t Flag=0;//Flag

        // if(huart->Instance==USART2)
        // {
        // HAL_UART_Receive_IT(&huart2, RX_Buffer, 1);

        // HAL_UART_Transmit(&huart2, RX_Buffer, 1, 0xFFFF);
        // RX_Buffer[RXBufferCount++]=Message;
        // RX_Buffer[RXBufferCount]=0;
        // if((0<Message0))
        // {
        // Flag=RXBufferCount;
        // RXBufferCount=0;
        // }
        // if(RX_Buffer == “1”)
        // {
        // memset(RX_Buffer, 0, sizeof(RX_Buffer));
        // HAL_UART_Transmit(&huart2,”ACCESS ALLOWED” , 40, 0xFFFF);
        // Access_Allowed();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == “2”)
        // {
        // memset(RX_Buffer, 0, sizeof(RX_Buffer));
        // HAL_UART_Transmit(&huart2,”ACCESS DENIED” , 40, 0xFFFF);
        // Access_Denied();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == “3”)
        // {
        // memset(RX_Buffer, 0, sizeof(RX_Buffer));
        // HAL_UART_Transmit(&huart2,”NO ANSWER” , 40, 0xFFFF);
        // No_Answer();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == “4”)
        // {
        // memset(RX_Buffer, 0, sizeof(RX_Buffer));
        // HAL_UART_Transmit(&huart2,”SAME CARD” , 40, 0xFFFF);
        // Same_Card();
        // HAL_Delay(400);
        // }
        // HAL_UART_Receive_IT(&huart2, &RX_Buffer, 1);
        // }
        //HAL_UART_Receive_IT(&huart2, &Message, 1);
        // HAL_UART_Receive_IT(&huart2, RXBuffer, 1);
        // if(RXBuffer == 1)
        // {
        // Access_Allowed();
        // HAL_Delay(400);
        // }
        // if(RXBuffer == 2)
        // {
        // Access_Denied();
        // HAL_Delay(400);
        // }
        // if(RXBuffer == 3)
        // {
        // No_Answer();
        // HAL_Delay(400);
        // }
        // if(RXBuffer == 4)
        // {
        // Same_Card();
        // HAL_Delay(400);
        // }
        // HAL_UART_Transmit(&huart2, Str, 20, 0xFFFF);
        // HAL_UART_Receive_IT(&huart2, RX_Buffer, 1);
        // if(RX_Buffer == 1)
        // {
        // Access_Allowed();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 2)
        // {
        // Access_Denied();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 3)
        // {
        // No_Answer();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 4)
        // {
        // Same_Card();
        // HAL_Delay(400);
        // }

        // }

        void RX_Reset(void)
        {
        memset(RX.Packet, 0, sizeof(RX.Packet));
        RX.Index = 0;
        }
        void Access_Granted(void)
        {
        char Test[40];
        memset(Test, 0, sizeof(Test));
        sprintf(Test,”Allowed\r\n”);//data to send
        HAL_UART_Transmit(&huart2,(uint8_t*) Test, sizeof(Test), 0xFFFF);
        HAL_Delay(80);
        }

        void Uart_Recieve(void)
        {
        char Test[40];
        memset(Test, 0, sizeof(Test));
        HAL_UART_Receive_IT(&huart2, Test, 12);

        }
        void Usart_Receive_IT(void)
        {
        uint8_t Str[20];
        HAL_UART_Receive_IT(&huart2, Str, 20);

        }

        //void AccessAllow(void)
        //{
        // LEDG_On();
        // Buzzer_On();
        // HAL_delay(600);
        // Buzzer_Off();
        // HAL_Delay(2000);
        // LEDG_Off();
        //}
        //void AccessDenie(void)
        //{
        // LEDR_Toggle();
        // Buzzer_Toggle();
        // HAL_Delay(3000);
        // LEDR_Off();
        // Buzzer_Off();
        //
        //}
        //void NoAnswer(void)
        //{
        // LEDR_Toggle();
        // Buzzer_On();
        // HAL_Delay(3000);
        //}
        //void SameCard(void)
        //{
        // LEDR_Toggle();
        // HAL_Delay(3000);
        //}

        درون main.c :

        //HAL_UART_Receive_IT(&huart2, Rx_data, 1);
        // HAL_UART_Receive_IT(&huart2, RX_Buffer, 1);
        //Buzzer_On();
        // HAL_Delay(4000);

        /* USER CODE END 2 */

        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
        // HAL_TIM_Base_Start_IT(&htim1);
        //HAL_UART_Receive_IT(&huart2, (uint8_t*)& RX_Buffer, sizeof(RX_Buffer));
        // HAL_UART_Transmit(&huart2, “please input number 1 or 2:\r\n”,30 , 0xFFFF);
        // HAL_UART_Receive_IT(&huart2, input, sizeof(input));
        // scanf(“%c”,&input);
        // if(input == “1”)
        // {
        // char Test[10];
        // memset(Test, 0, sizeof(Test));
        // sprintf(Test,”Allowed\r\n”);//data to send
        // HAL_UART_Transmit(&huart2,(uint8_t*) Test, sizeof(Test), 0xFFFF);
        // Delay();
        // }
        // else if(input == “2”)
        // {
        // char Test[10];
        // memset(Test, 0, sizeof(Test));
        // sprintf(Test,”Denied\r\n”);//data to send
        // HAL_UART_Transmit(&huart2,(uint8_t*) Test, sizeof(Test), 0xFFFF);
        // Delay();
        // }

        while (1)
        {
        // LED_On();
        //Delay();
        // LEDG_Off();
        State();
        LED_Toggle();

        // LED_On();
        // Delay();
        // LED_Off();
        // Buzzer_Off();
        // HAL_UART_Transmit(&huart2, “Hello \n”, 40, 0xFFFF);
        //if(HAL_UART_Receive_IT(&huart2,(uint8_t*)& Message, 1)!=HAL_OK){
        // HAL_UART_Receive_IT(&huart2, RX_Buffer, 1);
        // if(RX_Buffer== “1”)
        // {
        // HAL_UART_Transmit(&huart2, Message, 40, 0xFFFF);
        //
        // }
        // if(RX_Buffer == 1)
        // {
        // Access_Allowed();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 2)
        // {
        // Access_Denied();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 3)
        // {
        // No_Answer();
        // HAL_Delay(400);
        // }
        // if(RX_Buffer == 4)
        // {
        // Same_Card();
        // HAL_Delay(400);
        // }
        // HAL_UART_Receive_IT(&huart2, Rx_data, 12);
        // HAL_TIM_Base_Start_IT(&htim1);
        // LED_Toggle();
        // HAL_Delay(800);
        // Access_Granted();
        // Usart_Receive_IT();
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        // Uart_Recieve() ;
        // Access_Denied();

        // switch ( Card_State)
        // {
        // case AccessAllowed:
        // Access_Allowed();
        // HAL_Delay(400);
        // break;
        // case AccessDenied:
        // Access_Denied();
        // HAL_Delay(400);
        // break;
        // case NoAnswer:
        // No_Answer();
        // HAL_Delay(400);
        // break;
        // case SameCard:
        // Same_Card();
        // HAL_Delay(400);
        // break;
        // }
        // }
        }
        /* USER CODE END 3 */
        }
        درون Function.c:

        /*
        * functions.cpp
        *
        * Created on: Jul 25, 2023
        * Author: DigitalGroup1 Mphammad Ali Feiz
        */
        #include “../Inc/Functions.h”

        #include “Variables.h”
        #include
        #include “usart.h”
        #include “tim.h”
        #include “EEPROM.h”

        //MFRC522 MFRC522_Chip(&hspi2, SPI2_CS_GPIO_Port, SPI2_CS_Pin, SPI2_RST_GPIO_Port, SPI2_RST_Pin);
        char Rx_Allowed[30]=”ACCESS ALLOWED”;
        char Rx_Denied[30]=”ACCESS DENIED”;
        char Rx_NoAnswer[30]=”NO ANSWER”;
        char Rx_SameCard[30]=”SAME CARD”;

        /********************************************************************************************/
        /* ۰٫ AccessAllowed */
        /********************************************************************************************/
        void Access_Allowed(void)
        {

        LEDG_On();
        Buzzer_On();
        HAL_Delay(800);
        Buzzer_Off();
        HAL_Delay(1000);
        LEDG_Off();
        //HAL_UART_Receive_IT(&huart2,Rx_data, 1);
        memset(Rx_Allowed, 0, sizeof(Rx_Allowed));
        HAL_UART_Transmit(&huart2, Rx_Allowed, 30, 0xFFFF);
        Relay_On();
        HAL_Delay(600);
        Relay_Off();

        }
        /********************************************************************************************/
        /* ۱٫ AccessDenied */
        /********************************************************************************************/
        void Access_Denied(void)
        {
        LEDR_Toggle();
        Buzzer_Toggle();
        HAL_Delay(1000);
        LEDR_Off();
        Buzzer_Off();
        //HAL_UART_Receive_IT(&huart2,Rx_data, 1);
        memset(Rx_Denied, 0, sizeof(Rx_Denied));
        HAL_UART_Transmit(&huart2, Rx_Denied, 30, 0xFFFF);

        }
        /********************************************************************************************/
        /* ۲٫ NoAnswer */
        /********************************************************************************************/
        void No_Answer(void)
        {
        LEDR_Toggle();
        Buzzer_On();
        HAL_Delay(1500);
        Buzzer_Off();
        LEDR_Off();
        //HAL_UART_Receive_IT(&huart2,Rx_data, 1);
        HAL_UART_Transmit(&huart2, Rx_NoAnswer, 30, 0xFFFF);
        }
        /********************************************************************************************/
        /* ۳٫ SameCard */
        /********************************************************************************************/
        void Same_Card(void)
        {
        LEDR_Toggle();
        HAL_Delay(2500);
        LEDR_Off();
        //HAL_UART_Receive_IT(&huart2,Rx_data, 1);
        HAL_UART_Transmit(&huart2, Rx_SameCard, 30, 0xFFFF);
        }

      • باسلام
        ببخشید من واقعا به مشکل برخوردم الان با سخت افزار شرکت که تست میکنم برای یک دستگاه احراز کارتخوان هست.
        وقتی میخوام با سریال نوشته یا رشته بفرستم از HAL_UART_TRANSMIT استفاده میکنم و خوب توی هرکولس نمایش میده اما وقتی میخوام با HAL_UART_Recieve_IT ارسال کنم یه مقدار رو که از کاربر توی هرکولس بگیره و بعد بررسی کنه که آیا از یک تا ۴ کدومه وتوابع مربوطه رو فراخوانی و چاپ در خروجی کنه هیچ خروجی توی هرکولس بهم نمیده و یا حتی متون ارسالی و هم نمایش نمی دهد با سپاس اگر به ایمیلم پیام دهید تا فایل main و usart و function و براتون بفرستم تا دقیقتر بررسی نمایید سپاسگزارم ویا راهنمایی نمایید

  • با سلام و عرض ادب ببخشید من برای یک پروژه ی ماژول کارت خوان باید با استفاده از UART اظلاعات و انتقال بدم و دریافت کنم به این صورت که با دریافت یک مقدار(عدد یا کاراکتر از ورودی) و بررسی آن درون شرط اگر عدد برابر ۱ باشد(یا یک رشته ی هگز معادل کد باز کردن در) پیغام باز شدن در را بر روی uart ارسال کند و اگر عدد ۲ باشد (یا یک رشته ی هگز معادل کد بستن در) پیغام بسته شدن در را بر روی uart ارسال کند.
    لطفا کمکم کنید فوری است اگر ایمیل تان را هم بدهید تا فایل کامل را بفرستم سپاسگزارم.