Appearance
通讯原理
- 串行通讯并行通讯
串行通讯使用的数据线比较少, 一般是8根以下, 地线以及控制线, 按照数据位形式一位一位的进行传输
并行通讯使用8, 16, 32, 64以及更多的数据线进行通讯
串行的通讯距离比较远, 抗干扰能力强, 并行的速率快, 但是成本高
- 全双工半双工单工
是否可以同时发送信息, 以及发送信息的时候是否只是一个方向进行区分
- 同步, 异步
根据数据的同步方式, 根据是否有时钟信号
通讯速率
一般使用比特率作为通讯速率的参数, 单位是bit/s
波特率: 每秒钟有多少个码元, 码元是通讯信号调制的概念, 一个码元可以有多个二进制位, 等价的时候默认使用1bit为一个码元
串口
UART: 通用异步收发器
USART: 添加了同步功能
主要通过产生RS232/RS485等串行接口标准协议发送数据
主要是通过tx, rx两根线进行通讯, stm32与PC通过RS-232进行通讯, 标准规定了连接电缆和机械, 电气特性信号功能以及发送过程
使用的电平不同
通讯标准 | 电平标准 |
---|---|
5V TTL | 逻辑1: 2.4 ~ 5V 逻辑0: 0 ~ 0.5V |
RS-232 | 逻辑1: -15V ~ 3V 逻辑0: +3 ~ +15 |
需要一个芯片对电平进行转化,这个电平主要是为了进行抗干扰
但是在使用的时候一般会进行裁剪, 使用RXD, TXD, GND三根线
- 协议层
有一个起始位, 8位数据从位0-7, 一个校验位, 一个停止位
使用异步通讯, 需要提前约定好通讯使用的波特率, 即每一个码元的长度, 常见的波特率是4800, 9600, 115200
起始位是一个0, 停止信号为0.5, 1, 1.0或者2个逻辑数字1表示, 有效数据传输的个数也可以进行约定
校验有奇校验, 偶校验, 0校验, 1校验, 这个也是可选的
可以使用CPU或者DMA的形式进行读取或写入,
H7使用两个时钟, 对功能进行分区, 添加了FIFO的功能, 可以设置一个阈值, 之后进行一次性读出
实际使用
现在一般使用USB转串口来达到串口通讯的功能
- 配置时钟
- 调试为串行调试
- 设置usart
c
void Usart_SendString(uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
使用者一个函数进行发送数据, 要使用printf的话需要重定义fputc函数
c//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口DEBUG_USART */ HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000); return (ch); } //重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { int ch; HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000); return (ch); }