- can总线, i2c, isp,串口通信,这些通信相比较都有什么优缺点?
- 请问CAN是串口吗?
- stm32can通信和串口的区别
- can总线为什么比串口快?就是说各种总线速度不一样,是由什么决定的,最关键的地方?
can与串口的区别(can与串口的区别是什么)
大家好!今天让创意岭的小编来大家介绍下关于can与串口的区别的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,有小程序、在线网页版、PC客户端和批量生成器
问友Ai官网:https://ai.de1919.com。
本文目录:
can总线, i2c, isp,串口通信,这些通信相比较都有什么优缺点?
最大区别:CAN-bus、串行通讯用于设备之间的通讯,IIC、SPI用于元件之间的通讯。请问CAN是串口吗?
CAN是一种工业现场总线的名称。一般普通计算机上没有这个接口。它是串行通信方式,但不是一般说的串口。接口外观可以是15针D型口,也可以RJ45接口,看用在什么场合了。
CAN的特点:
1、网络各节点之间的数据通信实时性强:
CAN控制器工作于多种方式,网络中的各节点都可根据总线访问优先权采用无损结构的逐位仲裁的方式竞争向总线发送数据。
且CAN协议废除了站地址编码,而代之以对通信数据进行编码,这可使不同的节点同时接收到相同的数据,这些特点使得CAN总线构成的网络各节点之间的数据通信实时性强,并且容易构成冗余结构,提高系统的可靠性和系统的灵活性。
2、开发周期短:
CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现像在网络中,因个别节点出现问题,使得总线处于“死锁”状态。
而且,CAN具有的完善的通信协议可由CAN控制器芯片及其接口芯片来实现,从而大大降低系统开发难度,缩短了开发周期,这些是仅有电气协议的RS-485所无法比拟的。
3、已形成国际标准的现场总线:
与其它现场总线比较而言,CAN总线是具有通信速率高、容易实现、且性价比高等诸多特点的一种已形成国际标准的现场总线。这些也是CAN总线应用于众多领域,具有强劲的市场竞争力的重要原因。
扩展资料:
与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。它在汽车领域上的应用是最广泛的,世界上一些著名的汽车制造厂商都采用了CAN总线来实现汽车内部控制系统与各检测和执行机构间的数据通信。
同时,由于CAN总线本身的特点,其应用范围已不再局限于汽车行业,而向自动控制、航空航天、航海、过程工业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械及传感器等领域发展。CAN已经形成国际标准,并已被公认为几种最有前途的现场总线之一。
参考资料:百度百科-CAN总线
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("nrUSART Printf Example: retarget the C library printf function to the USARTnr");
while (1)
{
if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判断是否有数据要接收
{
i = USART_ReceiveData(USARTx); //接收数据
printf("%cnr",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
can总线为什么比串口快?就是说各种总线速度不一样,是由什么决定的,最关键的地方?
CAN总线在汽车上目前使用的比较多的有500K和250K的高速CAN、125K和62.5K的低速CAN,最高可做到1M,但这个1M是理论上的,实际上很难实现,在工业上用的速率不太清楚。一楼的回答个人觉得不妥。
首先,在大多数情况下(总不能拿25K的CAN跟56K的串口进行比较吧),CAN总线笔串口要快。CAN总线的出于安全性方面的额外开销约占总数据的50%左右,即每发8个数据字节,可能会同时产生8~9字节的额外开销。
串口的最高速率为56k,额外开销占30%多,及没传1个数据字节至少需要4个位的额外开销。
所以,单纯论点对点的通讯速率,串口是远不及CAN的。
各种总线的产生的历史背景不一样及所解决的需求不同导致了总线速度的不尽相同,因此总线的速率是由设计需求所决定的,最关键的地方从大的方面来说也是设计需求,从小的方面来说由不同总线的数据链路层决定的。
以上就是关于can与串口的区别相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: