stm32can通信和串口的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32can通信和串口的区别相关的知识,希望对你有一定的参考价值。

一、简介
STM32F103ZET6有3个USART(通用同步和异步收发器) + 2个UART(通用异步收发器)
分别是USART1,USART2,USART3
和UART4,UART5

二、USART和UART有什么区别呢?
当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能,同步通信需要STM32提供时钟来同步的,
这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步通信的连接示例图:

其中RX,TX,SCLK引脚的定义,在数据手册上都可以找到:百为stm32开发板光盘\\芯片数据手册\\数据手册STM32F103xC STM32F103xD STM32F103xE.pdf

这个区别在初学STM32的时候我们不需要去深入研究,只要知道USART有很多功能,除了全双工异步通信之外,还包括支持同步通信和单线半双工通信,支持LIN(局部互连网),智能卡协议和IrDA红外通信,以及调制解调器(CTS/RTS)等操作。

三、数据通信格式
我们用得最多的是全双工异步通信功能,下面我们来研究下怎么通过串口1(USART1)来收发信息,和printf功能的实现。

通常串口通信的数据格式如下图:

我们需要设置的数据有通信速率,数据字长,奇偶检验位,停止位。一个典型的设置是115200波特率,8位数据,无奇偶校验,1位停止位。
这个设置在固件函数库里面,我们是通过设置USART_InitStructure结构体,然后调用USART_Init函数来实现的:

USART_InitStructure.USART_BaudRate = 115200; //设置通信波特率为115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置通信数据格式为8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位为1位
USART_InitStructure.USART_Parity = USART_Parity_No ; //设置为无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置为无硬件流控制,即无CTS/RTS控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置发送使能,接收使能

USART_Init(USART1, &USART_InitStructure); //调用USART_Init,把上面的参数分别设置进USART的控制寄存器USART1->CR1,USART1->CR2,USART1->CR3

USART_Cmd(USART1, ENABLE); //使能串口

大家发现,在2.0固件库的USART例程里并没有看到USART1,因为是它用USARTx宏代替的,
其中USARTx是platform_config.h里定义的,大概是这个样子:
#ifdef USE_USART1
#define USARTx USART1
#define GPIOx GPIOA
#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA
#define GPIO_RxPin GPIO_Pin_10
#define GPIO_TxPin GPIO_Pin_9
#endif

只有定义了USE_USART1,上面的#ifdef USE_USART1和#endif之间的内容才会被编译,所以在platform_config.h里也需要定义USE_USART1:
#define USE_USART1

这里GPIO_Pin_9是串口1的发送引脚,GPIO_Pin_10是串口1的接收引脚,也可以从百为STM32开发板的电路图上看出来:

四、串口引脚配置
上面USART_Init函数配置了USART1的数据通信格式,但串口能工作的前提是需要配置相应的TX,RX的引脚,这个是通过GPIO_Configuration函数来配置的:
void GPIO_Configuration(void)

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开AFIO时钟
/* 配置 USARTx_Tx 为复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOx, &GPIO_InitStructure);
/* 配置 USARTx_Rx 为输入悬空 */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOx, &GPIO_InitStructure);


五、收发数据
配置好USART1使用的引脚,数据通信格式,下面就可以收发数据了,
USART_GetFlagStatus函数可以读取收发状态等,读取状态标志可以是以下几个:

发送数据示例:
USART_SendData(USART1, \'a\'); //发送一个字符a

接收数据示例:
u16 RxData;
RxData = USART_ReceiveData(USART1); //从USART1接收数据到RxData变量

下面是串口通信printf程序里的主要功能,上电打印一串信息,把接收到的数据回显到PC上:
/* 用printf打印一串信息到PC的超级终端或串口调试软件上 */
printf("\\n\\rUSART Printf Example: retarget the C library printf function to the USART\\n\\r");
while (1)

if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判断是否有数据要接收

i = USART_ReceiveData(USARTx); //接收数据
printf("%c\\n\\r",i&0xff); //回显到PC的超级终端或串口调试软件上



六、printf的实现
上面的printf是怎么实现的呢,这个是C标准库里定义的函数,我们是怎样把它的输出重定向到串口的呢?

我们知道printf是调用fputc函数来打印的,所以我们只要把fputc函数重定义就可以了:
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

PUTCHAR_PROTOTYPE

/* 调用USARTx发送一个字符*/
USART_SendData(USARTx, (u8) ch);
/* 等待发送完成 */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)


return ch;


另外还要加上头文件
#include "stdio.h"

还要注意的是,在工程里要勾上USE MicroLIB
参考技术A 关注这个问题

(嵌入式系统开发)stm32串口通信与RS-232

本篇主要叙述串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

目录

一、串口协议与RS-232标准

1.串口通信协议

2. RS-232标准

1.  RS232电平与TTL电平的区别 

2.RS-232串口简介

二、CH340 USB转串口 

1.简介

2.基本原理

 3.接线简介

三、参考网站


一、串口协议与RS-232标准

1.串口通信协议

      串口通讯 (Serial Communication)是一种设备间非常常用的串行通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

    串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

一般情况下,设备之间的通信方式分为串行通信和并行通信。

并行通信串行通信
传输原理数据各个位同时传输数据按位顺序传输
优点速度快占用引脚资源少
缺点占用引脚资源多速度相对较慢

按照数据的传输方向,串口通信分为:

单工:数据传输只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口;
全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

按照通信方式,分为

  • 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。
  • 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线

串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

串口通信协议层:

串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。

 

2. RS-232标准

 使用RS-232标准的串口设备间常见的通讯结构见图

在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

1.  RS232电平与TTL电平的区别 

根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准,见表 。

通讯标准

电平标准(发送端)

5V TTL

逻辑1:2.4V-5V

逻辑0:0~0.5V

RS-232

逻辑1:-15V~-3V

逻辑0:+3V~+15V

                                    表 TTL电平标准与RS232电平标准

       我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,RS232使用-15V表示逻辑1,+15V表示逻辑0。使用RS232与TTL电平校准表示同一个信号时的对比见图。

                                 图 RS-232与TTL电平标准下表示同一个信号

因为控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-232电平的信号进行互相转换。

2.RS-232串口简介

在最初的应用中,RS-232串口标准常用于计算机、路由与调制调解器(MODEN,俗称"猫")之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。

在旧式的台式计算机中一般会有RS-232标准的COM口(也称DB9接口),见图 。

                                      图  电脑主板上的COM口及串口线

其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232标准调制的。

在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见图

                                 DB9标准的公头及母头接法

RS232接口(封装D89)      

序号

名称

符号

数据方向

说明

1

载波检测

DCD

DTEàDCE

Data Carrier Detect,数据载波检测,用于DTE告知对方,本机是否收到对方的载波信号

2

接收数据

RXD

DTEßDCE

Receive Data,数据接收信号,即输入。

3

发送数据

TXD

DTEàDCE

Transmit Data,数据发送信号,即输出。两个设备之间的TXD与RXD应交叉相连

4

数据终端(DTE) 就绪

DTR

DTEàDCE

Data Terminal Ready,数据终端就绪,用于DTE向对方告知本机是否已准备好

5

信号地

GND

-

地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。

6

数据设备(DCE)就绪

DSR

DTEßDCE

Data Set Ready,数据发送就绪,用于DCE告知对方本机是否处于待命状态

7

请求发送

RTS

DTEàDCE

Request To Send,请求发送, DTE 请求 DCE 本设备向DCE端发送数据

8

允许发送

CTS

DTEßDCE

Clear To Send,允许发送,DCE回应对方的RTS发送请求,告知对方是否可以发送数据

9

响铃指示

RI

DTEßDCE

Ring Indicator,响铃指示,表示DCE端与线路已接通

上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可,见图 205。

                                             图 计算机与调制调解器的信号线连接

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

如果没有RS232接口 只有USB接口,则需要买转换器~。

二、CH340 USB转串口 

1.简介

CH340是一个USB总线的转接芯片,实现USB转串口或者USB转打印口。
在串口方式下,CH340提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB总线。

常用于MCU的自动下载电路中,驱动稳定性和通信速率都有不错的保障。

具体关于CH340的介绍可以看

http://www.wch.cn/product/CH340.html

2.基本原理

 3.接线简介

USB转串口模块可以使用3.3V或者5V电压供电,需要将跳线帽按下图进行安装

  

可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。

 

然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。

下图是USB转串口模块的一些功能模块的标示,USB转串口电路板背后还预留了一些全信号输出的接口,可以将电线直接焊接在这些引脚上来使用预留的功能。

 

 

三、参考网站

https://blog.csdn.net/cool9932/article/details/79419990?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%B8%B2%E5%8F%A3%E5%8D%8F%E8%AE%AE&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-79419990.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187https://blog.csdn.net/cool9932/article/details/79419990?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%B8%B2%E5%8F%A3%E5%8D%8F%E8%AE%AE&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-79419990.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

https://blog.csdn.net/johnwillwin/article/details/108615422?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163497228816780357245244%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163497228816780357245244&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-108615422.first_rank_v2_pc_rank_v29&utm_term=%E4%B8%B2%E5%8F%A3%E5%8D%8F%E8%AE%AE%E5%92%8CRS-232%E6%A0%87%E5%87%86&spm=1018.2226.3001.4187 https://blog.csdn.net/wangjiaweiwei/article/details/49612207?ops_request_misc=&request_id=&biz_id=102&utm_term=USB/TTL%E8%BD%AC232%22%E6%A8%A1%E5%9D%97%EF%BC%88%E4%BB%A5CH340%E8%8A%AF%E7%89%87%E6%A8%A1%E5%9D%97%E4%B8%BA%E4%BE%8B%EF%BC%89%E7%9A%84%E5%B7%A5&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-49612207.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

以上是关于stm32can通信和串口的区别的主要内容,如果未能解决你的问题,请参考以下文章

can口和串口区别?

STM32CAN总线接口发送和接收数据

STM32下调试CAN通信

stm32的can发送时序不准

STM32之CAN通信

STM32之CAN通信