一、RS-232串口通信协议
1.串口通讯协议
串口通讯 (SerialCommunication)是一种设备间非常常用的串行通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
2.协议层
串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD
接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。
- 波特率
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号 ( 如前面讲解的 DB9接口中是没有时钟信号的) ,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图 21-6 中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、 9600 、 115200 等。 - 通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5 、 1 、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。 - 有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5 、 6 、 7 或 8 位长。 - 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验 (even) 、 0 校验 (space) 、 1 校验 (mark) 以及无校验 (noparity) 。
奇校验要求有效数据和校验位中“ 1 ”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“ 1 ”,为达到奇校验效果,校验位为“ 1 ”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。
偶校验与奇校验要求刚好相反,要求帧数据和校验位中“ 1 ”的个数为偶数,比如数据帧:11001010 ,此时数据帧“ 1 ”的个数为 4 个,所以偶校验位为“ 0 ”。0 校验是不管有效数据中的内容是什么,校验位总为“ 0 ”, 1 校验是校验位总为“ 1 ”。
二、RS232电平与TTL电平转换
1 载波检测 DCD
2 接收数据 RXD
3 发送数据 TXD
4 数据终端准备好 DTR
5 信号地 SG
6 数据准备好 DSR
7 请求发送 RTS
8 清除发送 CTS
9 振铃提示
接口电平
RS232采用负逻辑电平
-15~-3:逻辑1;
+15~+3:逻辑0;
电压值通常在7V左右
三、任务目标
完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
四、使用HAL库完成
选择STM32F103C8
开发板,双击配置
配置时钟,使用外部高速时钟:
设置USART2:
点击Clock Configuration
选择HSE
和PLLCLK
设置中断:
为创建的项目起个名,并选择MDK,之后打包下载
打开项目之后在main.c中的while循环中添加代码:
char data[]="hello windows!\n";
HAL_UART_Transmit(&huart2, (uint8_t *)data, 15, 0xffff);
//高电平点亮A12
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
HAL_Delay(100);
//低电平熄灭A12
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_Delay(900);
编译成功后利用串口烧录程序
打开串口调试助手:
可以看到我们只是再main
函数里面调用了HAL_UART_Transmit
函数,就实现了串口通信