Stm32串口计算器

文章描述了一个使用C语言编写的函数,通过UART接口实现四则运算,并在接收中断时计算表达式结果。主要内容包括处理不同运算符、中断回调函数以及重定向标准输入输出功能。
摘要由CSDN通过智能技术生成
int calculate_expression(const char *expression) {
   uint8_t i;
	int result = 0;		//结果
	int num=0;			//记录数值
	int sign = 1;		//符号位
	char op ='+';		//操作符
	
	for( i=0;expression[i] != '\0';i++)
	{
		char ch = expression[i];
		if(isdigit(ch))					//判断是否为数字
		{
			num = num*10 +(ch-'0');
		}
		else if(ch=='+'||ch=='-')		//符号为'+'或'-'
		{
			result += sign*num;
			num=0;
			sign=(ch=='+')?1:-1;
		}
		else if(ch=='*'||ch=='/')		//符号为'*'或'/'
		{
			result += sign*num;
			num=0;
			op=ch;
		}
		else							//其他符号
			break;
	}
	
	if(op=='+'||op=='-')
	{
		result += sign*num;					//符号为'+'或'-' 在这算出结果
	}
	else if(op=='*')							//符号为'*'
	{
		result *=num;
	}
	else if(op=='/')						//符号为''
	{
		if(num==0)
		{
			printf("除数不能为零\r\n");
			return -1;
		}
		result /= num;
	}
	
	return result;
}

四则运算

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收回调函数,产生接收中断后执行里边的操作
{

	if(huart==&huart1)//判断是否串口2
	{	
		int result_ISR;
		uint8_t i;
		UartRxData[UartRxIndex]=aRxBuffer;		//将接收到的数据从缓冲区传到接收数组里
		if(UartRxData[UartRxIndex]=='\n')			//判断收的最后一位是不是回车,如果是即为最后以为
		{
			result_ISR=calculate_expression(UartRxData); //接收到数据进行四则运算,然后存入结果
			//sprintf(result_str,"%d",result_ISR);         //将
			for(i=0;UartRxData[i]!='\r';i++)    //循环存入,筛选出/r/n
				a[i]=UartRxData[i];     //将接收到的数据存入新数组
				printf("%s=%d\r\n",a,result_ISR);   //例如2+2=4
				//memset(a,0,sizeof(a));   //将各个数组的数据全部置0
				//memset(result_str,0,sizeof(result_str));
				memset(UartRxData,0,sizeof(UartRxData));
				UartRxIndex=0;
			
		}
		else
			UartRxIndex++;
	}
		HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);//继续接收下一字节
 }

中断回调函数触发接收中断执行代码

int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
    return ch;
}
 
/**
  * @brief 重定向c库函数getchar,scanf到USARTx
  * @retval None
  */
int fgetc(FILE *f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
    return ch;

重定向发送和接收函数

char UartRxData[1024];
uint8_t UartTxbuf[100]="helloworld";
uint8_t UartRxIndex=0;
char a[100];
uint8_t aRxBuffer;

定义变量

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_USART1_UART_Init();
	OLED_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Transmit(&huart1, (uint8_t *)UartTxbuf, 10,1000);//发送helloworld
  HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);//接收中断打开
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		

		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

主函数

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32上实现串口通信的计算器,可以通过以下步骤来实现: 1. 首先,需要在电脑端使用C++编写一个上位机程序,负责按键和显示操作界面。可以使用QT进行界面开发,并通过串口STM32进行通信。 2. 在STM32端,使用C语言编写计算功能的代码。需要使用keil5进行开发,并实现串口通信功能。 3. 在STM32中,需要进行串口的初始化。具体步骤如下: - 使能串口时钟和GPIO时钟。 - 复位串口。 - 设置GPIO端口模。 - 初始化串口参数,包括波特率、数据位、停止位等。 - 初始化中断设置。 - 使能串口。 4. 在STM32中,实现数据的收发操作。可以通过串口接收上位机发送的按键信息,并进行相应的计算操作。然后将计算结果通过串口发送给上位机,以便显示在界面上。 下面是一个简单的示例代码,用于在STM32上实现串口通信的计算器: ```c #include "stm32f10x.h" void USART1_Init(void) { // 使能串口时钟和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 复位串口 RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); // 设置GPIO端口模 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化串口参数 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能串口 USART_Cmd(USART1, ENABLE); } int main(void) { // 初始化串口 USART1_Init(); while (1) { // 接收上位机发送的按键信息 if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint16_t data = USART_ReceiveData(USART1); // 进行相应的计算操作 // 将计算结果发送给上位机 USART_SendData(USART1, result); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值