总结一下关于串口的一些点,个人学习的总结,欢迎交流指正.
原子和野火的视频都看了些.
一.串口通信协议
通信方式
串口通信是一种串行异步的通信方式.
总线
实现方法简单只有三根线:
RXD:发送线.
TXD:接收线.
GND:直连共地.
数据帧格式
起始位固定为一位低电平,停止位可以是0.5/1/1.5/2位高电平.
校验位的校验方法
- 奇校验:保证数据为和校验位中的1的个数为奇数个
- 偶校验:保证数据位和校验位中的1的个数为偶数个
- 1校验:固定为1
- 0校验:固定为0
- 无校验:不进行校验
二.功能框图
我觉得的话,这个功能框图主要了解这一部分就行了
发数据时,先写入发送数据寄存器,再由发送数据寄存器转入发送位移寄存器.
收数据时,数据先存入接收移位寄存器,再由接受移位寄存器转入j接受数据寄存器.
三.软件实现
初始化结构体
波特率:调试助手波特率需要与串口初始化中的一致,这也是异步通信中保持数据准确的一个方法.
字长:可以是8位可以是16位(包含校验位)
停止位:设置停止位的位数
校验位:校验方式
模式:选择USART模式即可
硬件流:不使能硬件流控制
重要标志位
结合功能狂徒来看,串口里面比较重要的标志位就是这三个了
RXNE:接受数据寄存器不为空,代表数据来了,可以接受了
TC:发送完成
TXE:发送数据寄存器中的数据以及转入发送移位寄存器,代表有数据要发送出去
串口中断
串口的接受,发送都可以引起中断,按照需要编写.
改写fputc()函数
改写之后,可以直接通过printf再串口调试助手中打印出数据.
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
将printf中的内容传入到usart的数据寄存器中将数据通过串口发送出来
自定义的关于单个字节和多个字节的打印方式
void single_data(uint8_t data)
{
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void str_data(char * str)
{
uint8_t k = 0;
while(*(str+k)!= '\0')
{
single_data(*(str+k));
k++;
}
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
多个字节的发送方式起始就是多次发送单个字节而已.这里传入的参数都是8位的,如果再初始化的时候配置字长为16位的话,这里就改成16位.