#include "uart.h"
int fputc(int ch, FILE* stream);
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
int fputc(int ch, FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);//huart1需要根据你的配置修改
return ch;
}
//下面是串口传参和接受多个字符与字符串比对用
#define REC_LENGTH 1
#define MAX_REC_LENGTH 1024
static unsigned char UART1_Rx_Buf[MAX_REC_LENGTH] = {0}; //USART1存储接收数据
static unsigned char UART1_Rx_flg=0; //USART1接收完成标志
static unsigned int UART1_Rx_cnt=0; //USART1接受数据计数器
static unsigned char UART1_temp[1] = {0}; //USART1接收数据缓存
double res=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果触发USART1中断
{
UART1_Rx_Buf[UART1_Rx_cnt] = UART1_temp[0];
UART1_Rx_cnt++;
if(0x0a == UART1_temp[0])//如果接收到回车键
{
UART1_Rx_flg = 1;//接收结束了
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)UART1_temp,REC_LENGTH);//打开中断,等待下一次中断的到来
}
}
//上面是串口传参和接受多个字符与字符串比对用
////串口控制32(16进制发送)
//uint8_t Tx_str1[] ="hello world!\r\n"; //开始发送的字符数组
//uint8_t Tx_str2[] ="ok\r\n";
//uint8_t Rx_dat = 0;
//int n=100;
//char i=0;
//char j=0;//接收到的字符数据
//uint8_t dat[100];
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //回调函数,UART_HandleTypeDef为hal_uart中定义的结构体,
//{
// if (huart->Instance == USART1) //Instance为实例(你所创建的对象),如果是串口1就把msp初始化
// {
// if (Rx_dat == 0xa1) //上位机向从机发送a1后,如果从机接收到的数据为a1
// {
// printf("hello word!\r\n");
// HAL_UART_Transmit(&huart1, Tx_str1, sizeof(Tx_str1), 10000);
// HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);
// }
// else if (Rx_dat == 0xa2) //上位机向从机发送a2后,如果从机接收到的数据为a2
// {
// printf("%d\r\n",n);//向上位机发送转换为10进制的字符
// HAL_UART_Transmit(&huart1, Tx_str2, sizeof(Tx_str2), 10000);
// HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);
// }
// else if (Rx_dat == 0xa3) //上位机向从机发送a2后,如果从机接收到的数据为a2
// {
// printf("%x\r\n",n);//向上位机发送转换为16进制的字符
// HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);
// }
// else if (Rx_dat == 0xa4) //上位机向从机发送a2后,如果从机接收到的数据为a2
// {
// printf("%d\r\n",i);//向上位机发送转换为16进制的字符
// HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);
// }
// if(Rx_dat!=RESET&&Rx_dat!=0X0d)
// {
// while(Rx_dat==0X0d)
// {dat[i++]=Rx_dat;}
// while(Rx_dat==0X0d)
// {printf("%d \r\n",dat[j++]);}//向上位机发送转换为16进制的字符
// }
// }
//}
//void loop(void)
//{
// HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);//串口控制单片机(16进制发送)
//}
//串口接收多个字符与字符串比对
int fla=0;//字符串比对标志
char c[]="abcd1234\r\n";//串口发送时带\r\n因此自定义的字符串也得加上,与串口接收的字符串比对的字符串
void loop(void)
{
if(UART1_Rx_flg)
{
char *a;//动态分配内存
a=(char*)malloc(sizeof(a)+6);//清空字符串a的缓存,字符数组与字符串的区别是字符串最后末尾自带空格
strncpy(a,(char*)UART1_Rx_Buf,sizeof((char*)UART1_Rx_Buf)+6);//将接收的数组转换为字符串
fla=strcmp(c,a);
free(a);//注意使用malloc后一定要free不然会造成内存泄漏
if(fla==0)
{printf("ok\r\n");}
else
{printf("error\r\n");}
for(int i = 0;i<UART1_Rx_cnt;i++)
{UART1_Rx_Buf[i] = 0;}
UART1_Rx_cnt=0;
UART1_Rx_flg=0;
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)UART1_temp,REC_LENGTH);
}
//串口传参
//uint8_t str[20];//静态分配内存,不用free掉,范围0.000000~999.999999
//void loop(void)
//{
// sprintf((char*)str,"%f",res);
// printf("%.6lf\r\n",res);
// if(UART1_Rx_flg)
// {
// char *a;
// a=(char*)malloc(sizeof(a)+6);//清空字符串a的缓存,字符数组与字符串的区别是字符串最后末尾自带空格
// strncpy(a,(char*)UART1_Rx_Buf,sizeof((char*)UART1_Rx_Buf)+6);//将接收的数组转换为字符串
// res=atof(a);//将字符串转化为浮点类型数
// free(a);//注意使用malloc后一定要free不然会造成内存泄漏
// for(int i = 0;i<UART1_Rx_cnt;i++)
// {UART1_Rx_Buf[i] = 0;}
// UART1_Rx_cnt=0;
// UART1_Rx_flg=0;}
//
// HAL_UART_Receive_IT(&huart1,(uint8_t *)UART1_temp,REC_LENGTH);
//}
评论0