通信
常用的有限无线的通信方式
有限(RS-232、RS-485、CAN)
无线(蓝牙、433M、Zigbee、Wifi、GSM)
这里简单的总结串口通信
串口通信基础原理
1. 串口通信定义
串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
2. 串口通信原理
串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。
3. 串口通行的分类
单工:数据传输只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输。半就意味着单,只允许数据在一个方向上传输数据。不需要独立的接收端和发送端,两者可以合并在一个端口,总的来说就是单工的重复使用;
全双工:允许数据在两个方向上传输。全双工需要独立的接收端和发送端。是单工的双方向同时使用;
(按照数据传送方向分类)
同步通信:带时钟同步信号传输(SPI,IIC通信接口)要建立发送方的时钟对接收方的时钟直接控制,使双方达到完全的同步。
异步通信:不带时钟同步信号(UART,单总线)不要求收发时钟严格一致,要求每个字符要附加2-3位起止位,各个字符之间还有间隔,因此传输效率不高。
(按照通信方式分类)
4. 串口通信协议
分为物理层和协议层(我一直不太懂,这里百度解释一下)
物理层(或称物理层,Physical Layer)是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据可在各种物理媒体上传输。局域网与广域网皆属第1、2层。
物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”。
OSI采纳了各种现成的协议,其中有RS-232、RS-449、X.21、V.35、ISDN、以及FDDI、IEEE802.3、IEEE802.4、和IEEE802.5的物理层协议。
(我理解为其实就是机械、电子功能部分的特性,确保原始数据在物理媒介的传输。其实就是硬件部分。)
协议层(这个在百度上也没有找到,不过根据以上我理解为其实协议层就是通讯逻辑,统一收发双方的数据打包、解包标准。)
5. 有线通信
(1)RS-232
逻辑1:-15v——-3v;逻辑0:+3v——+15v(低电平为-15v,高电平为15v峰值差别不大,不以0为低电平),采用150PF/M的通信电缆(电汽化境)最大通信距离为15m;全双工,实行点对点通信。
(2)RS-485
逻辑1:2v——6v;逻辑0:-2v——-6v最大通信距离约为1200m;半双工,使用32台驱动器或32台接收器。
(3)CAN(车轴上)
逻辑1:0v;逻辑0:2.5v;通信距离最远可达10KM(速率低于5klops)半双工,最多可达110个设备。
6. 串口硬件
嵌入式中的串口,指的是UART口,UART,COM指的是物理接口形式(硬件)而TTL、RS232是指的是电平标准(电信号)。
UART有4个引脚(VCC、GND、RX、TX)用的TTL电平,低电平为0,高电平为1(3.3v或以上)。PL2303、CP2102芯片是USB转TTL串口的芯片,用USB来扩展串口(TTL电平)。
7. 串口的波特率设置 (数据手册中写的非常清楚,虽然可以通过串口小助手设置固定的波特率,但波特率是串口通信的关键)
一、方法0的波特率
方法0时,移位时钟脉冲由56给出,即每个机械周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一;计算公式为波特率=fosc/12。
二、方式2的波特率
方式2时与方式0时不相同,即输入时钟源的频率不同,方式2的波特率取决于PCON中的SMOD位的值,当SMOD位的值为0时,波特率fosc的六十四分之一;若SMOD为1时波特率为fosc的三十二分之一;计算公式为波特率=2smod次方/64fosc。
三、方式1和方式3的波特率。
方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,故波特率由定时器T1的溢出率与SMOD值同时决定,;计算公式为波特率=2smod/32T1溢出率。
小熊派串口通信
1.查看端口号
步骤
<连接小熊派开发板
<选择“我的电脑
<右击
<选择管理
<选择设备管理器
如图查看端口如图
便可从串口助手中检索到相应串口
2. 查看开发板上的串口如图
图中3为串行接口
3. 配置引脚
4.设置系统时钟
5. 配置串口参数
6. 串口代码编写
(1)keil uVision4
#include<reg52.h>
sfr AUXR = 0x8e;
void main()
{
SCON = 0x40;
TMOD = 0x20;
TH1 = 0xfd ;
TL1 = 0xfd ;
TR1 = 1;
SBUF = 0x0a;
while(TI == 0);
TI = 0;
while(1);
}
(2)keil uVision5
#ifdef UART1
//HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
//HAL_Delay(300);
if(HAL_UART_Receive(&huart1,&Rdata,1,0)==HAL_O K)
{HAL_UART_Transmit(&huart1,&Rdata,1,0); }
#endif
#ifdef UART1_IRQ
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_P in);
printf("UART1_IRQ Test!\r\n");
HAL_Delay(2000);
#endif
#ifdef UART1_DMA
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_P in);
printf("UART1_DMA Test!\r\n");
HAL_Delay(2000);
#endif
7、代码编写说明
(1)串口模式实现有: 普通模式,在主函数中接收函数。 中断模式,产生的不影响主程序运行。 DMA模式,与主函数互不影响,独立运行。
(2)在函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)回调的办法处理中断程 序和DMA程序。
(3)在主程序运行请,要先触发中断或DMA,即运行 HAL_UART_Receive_IT(&huart1,&Rdata,1); 或HAL_UART_Receive_DMA(&huart1,&Rdata,1); 在HAL_UART_RxCpltCallback函数里面再次运行以上中断接收函数,即可实现连续触发中断。
(4)实现通过printf打印串口信息,则需要添加stdio.h头文件。
参考链接
https://wenku.baidu.com/view/c8f4a340be1e650e52ea99f2.html