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 */
}
主函数