第一步,配置cubemx
配置好点右上角生成
第二步,串口方式
阻塞式发送
英文、中文正常、浮点有口
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();//配置完自动生成的
发送到串口助手上
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//等想发的数据都发完了才会结束
//5为字符串长度,0xFFFF为超时时间超过这个时间其余的数据就不发了
HAL_UART_Transmit(&huart1,(uint8_t*)"Hello",5,0xFFFF);
//&huart1是串口句柄 huart1存了串口的所有数据
//(uint8_t*)"Hello"【字符串常量】需要传uint8_t*
HAL_Delay(1000);
}
从串口助手上发到单片机,再发回串口助手
while(1){
uint8_t buf[5];//缓存一下
//接收数据,并返回到串口助手
HAL_UART_Receive(&huart1,(uint8_t*)buf,3,0xFFFF);
HAL_UART_Transmit(&huart1,(uint8_t*)buf,3,0xFFFF);
}
printf函数进行串口发送
#include <stdio.h>//引入标准库头文件
//重写fputc,printf內部是通过它调用的
int fputc(int c,FILE*stream)
{
uint8_t ch[1]={c};
HAL_UART_Transmit(&huart1,ch,5,0xFFFF);
return c;
}
//重写fgetc,scanf內部是通过它调用的
int fputc(FILE*stream)
{
uint8_t ch[1];
HAL_UART_Receive(&huart1,ch,1,0xFFFF);
return ch[0];
}
while(1){
int val=0;
scanf("%d",&val);
printf("%d\r\n",val);//回车并换行
}
使用中断方式(每个字节都会进入一次中断)
不需要等待就能发送完毕
先去NVIC使能中断,调优先级(编号越大优先级越低)
uint8_t buffer[5];//定义成全局变量防止被销毁
int main()
{
//第一次触发中断接收语句
HAL_UART_Receive_IT(&huart1,buffer,3);
while(1){
}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//每发一个字节都会进入中断
HAL_UART_Transmit_IT(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
//接收数据,并返回到串口助手
HAL_UART_Receive_IT(&huart1,buffer,3);
}
DMA(搬运数据)方式(固定数据够了才发)
固定长度数据
uint8_t buffer[5];//定义成全局变量防止被销毁
int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);
while(1){
}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//不用每发一个字节都会进入中断
HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
//接收数据,并返回到串口助手
HAL_UART_Receive_DMA(&huart1,buffer,3);
}
空闲中断*
不定长接收,基于DMA的修改
uint8_t buffer[5];//定义成全局变量防止被销毁
int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
while(1){
}
return 0;
}
若不是0就是空闲中断了
extern uint8_t buffer[5];//it.c文件里得声明一下
3-用来获取DMA计数值
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{//当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//不用每发一个字节都会进入中断
HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
//接收数据,并返回到串口助手
HAL_UART_Receive_DMA(&huart1,buffer,3);
}
第三步,串口调试助手
串口接线A10RX接TX,A9TX接RX
需要下USB转TTL的串口驱动,下正点原子的XCOM
保证波特率、数据位....都一致,(该串口助手是GB2312编码)
keil中应该也得设置成GB2312编码才能正常传输中文