一、USART解释

USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备,相互独立的接收数据和发送数据;任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。为什么三种通讯方式一起学习呢?因为单片机最后都是要用到UASRT这个功能与外界通讯的。由于UART规定只是规定了数据(信号的时序)的格式,并没有规定接口的电气特性,这样导致了他们在物理层无法实现互联。

UART通讯时一般直接用处理器自己的TTL电平,(高电平表示1,低电平代表0)STM32自己的TTL电平是3.3V  51单片机的TTL电平是5V的 所以不能互连。RS232电平规定:逻辑“1”的电平是-5V~ -15V之间,逻辑“0”的电平是+5v~+15V之间,这么高的电压当然需要芯片转换后才能通讯了。232通讯程序和UART通讯程序都是一样的。

STM32F103LQFP48集成有3个UASRT控制器:编号及引脚定义如下:

名称 引脚
USART1

PA9(30脚_TX)  PA10(31脚_RX)可复用给42 43脚

USART2 PA1(11脚_RTS)  PA2(12脚_TX)
USART3 PA1(21脚_TX)  PA2(22脚_RX)

数据线端口是高电平状态①(红色线表示),如果开始发送数据了,那么总线将高电平拉低成低电平,然后开始发送数据,发送数据的顺序是先发数据的低位,然后发送到高位。一般是8位数据位(也可以是7位),然后是校验位(校验位可有可无),最后一位是停止位(停止位是必须有的)停止位可以是1位,1.5位,2位。

发送方这样不停的发送数据,接收方怎么知道发送的的0还是1呢?如果要发送0x00,和0xFF数据,这样总线是不是一直在高电平或者低电平,我们约定一个节拍(如:波特率9600指的是每秒可以传输9600个二进制位,传送一个位需要1/9600秒)双方共同遵守,这个节拍持续的时间长短,来换算成发送了多少个0或者多少个1了。尽管设置了相同的波特率,设备双方的时钟基准可能不太一样,为了防止累计误差出现,每次发完一个字节后又重新开始发送下一个字节,时间重新开始计时。

控制器内部结构图如下

初始化端口库函数

void USART1_Init(u32 bound){ //串口1初始化并启动//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟//USART1_TX   PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);  //USART1_RX   PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;     //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器 //USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启ENABLE/关闭DISABLE中断USART_Cmd(USART1, ENABLE);                    //使能串口
}
/*
USART1专用的printf函数
当同时开启2个以上串口时,printf函数只能用于其中之一,其他串口要自创独立的printf函数
调用方法:USART1_printf("123"); //向USART2发送字符123
*/
void USART1_printf (char *fmt, ...){ char buffer[USART1_REC_LEN+1];  // 数据长度u8 i = 0; va_list arg_ptr;va_start(arg_ptr, fmt);  vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);while ((i < USART1_REC_LEN) && (i < strlen(buffer))){USART_SendData(USART1, (u8) buffer[i++]);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); }va_end(arg_ptr);
}

RS485总线标准规定采用差分信号进行数据传输,两根线电压差+2V~+6V 表示逻辑1;两根线电压差-2V~-6V 表示逻辑0;使用差分信号能有效的减少工模干扰,2根线之间没有地。RS485的通讯距离可以达到1500m。电压低了也不会损坏电路接口。485采用总线式拓扑结构,数据的发送和接收要占用2根线,所以发送时候就不能接收,接收时候不能发,所以只能采用半双工的发送和接收数据,在软件编程时候注意区分。

虽然处理器集成了UART控制器,产生的一般是TTL电平,该电平并不符合RS485标准,所以一般我们还要外加电路将TTL信号转换为差分的485信号。常用的芯片有(MAX485、SN75LBC184、SP3485) 磁隔离的高速芯片有AD公司的 ADM2582E/ADM2587E,光隔离的芯片有国产的金升阳公司的TD301D485H 不同的芯片要看厂家的推荐参考电路和最大速度以及使用环境。

典型电路如下

一起学习交流群:QQ群号码:255864236

STM32之UART、RS232、RS485通讯相关推荐

  1. 串口---UART RS232 RS485 TTL

    什么是串口? 串口通信分同步串口通信USRT,异步串口通信UART, 串口主流的电气(电平)标准 RS232 RS485 RS422 TTL 相关芯片 PL2303.CP2102芯片都是常用的USB转 ...

  2. 总线协议一(UART/RS232/RS485/IIC/SPI)

    目录 基础概述: 一.UART(为串口通信方式) 二.RS232协议 三.RS485协议 四.I2C总线协议 五.SPI总线 六.I2C和SPI的区别 基础概述: 总线的本质就是一根导线,传递的是电信 ...

  3. RS232\RS485\TTL接口\UART

    一 uart rs232 rs485功能 UART是cpu中的控制器实现数据的串并转换(其中cpu使用并行数据,外部通信使用串行数据):控制数据的波特率 校验机制等工作:cpu直接控制的是这个控制器的 ...

  4. UART和RS232/RS485的关系是什么?

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  5. UART和RS232/RS485的关系是什么?RS485在linux下的调试 ubuntu串口调试工具

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  6. UART和RS232/RS485/RS422的关系

    转: http://www.elecfans.com/emb/jiekou/20180418663969.html https://blog.csdn.net/u013178472/article/d ...

  7. STM中USART串口通讯:RS232,RS485

    作为单片机开发,经常使用的协议,进行程序的正确性的测试使用.但其实I2C,SPI(串行通信使用最多)在各个器件中使用最多,后面再复习.8位,16位并行通讯也使用多.USART使用也多,蓝牙转串口,wi ...

  8. java 串口 dtr rts_串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解

    串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 先贴出缩写的含义: DTR – Data Terminal Ready DSR – Data Set Ready RTS ...

  9. 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!

    5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...

  10. D-MNSV6-X8|D-MNSV7-X16磁导航传感器RS232/RS485(MODBUS-RTU)通讯协议说明

    D-MNSV6-X8|D-MNSV7-X16磁导航传感器是一款支持RS232/RS485(MODBUS-RTU)通讯协议的传感设备,利用集磁道钉的磁场特性研究磁信号检测.车辆与磁道钉之间相对运动于一体 ...

最新文章

  1. 设置php-fpm使用socket文件
  2. 软考经过 之 天助自助者
  3. 共享可写节包含重定位_PE结构学习01-DOS头-NT头-节表头
  4. EntityFramework Core 3.x上下文构造函数可以注入实例呢?
  5. Vue.js说说组件
  6. C++map容器-构造和赋值
  7. CString LPCTSTR LPTSTR 类型的相互转化
  8. 设计模式之单例模式8种实现方式,其一:饿汉式-静态常量饿汉式
  9. spring-boot-1.4x后@ConfigurationProperties注解舍弃location
  10. react-native ES5与ES6写法对照表
  11. C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序
  12. 关于random的多种用法
  13. android camera 拍照流程图
  14. 啊哈C语言 第三章 【代码】【习题答案】
  15. 图形图像处理案例4——彩色勾线画生成器,彩色绕线画生成器,绕线画生成器
  16. 人群密度检测-MCNN
  17. 数学建模:地貌图的完成
  18. 微信小程序 之wxml保留小数点后两位数的方法及转化为字符串的方法
  19. 【Anki 牌组+Markdown笔记分享】汇编语言
  20. 公司合伙人股权的进入和退出机制

热门文章

  1. android 动态壁纸 时钟,Android自定义动态壁纸开发(时钟)
  2. endnotex8使用教程_「endnote教程」EndNote x8基础使用教程(一) - seo实验室
  3. 《人工智能:一种现代的方法》读书笔记之 智能Agent
  4. html5svg在线编辑器,HTML5 SVG简介
  5. 密码学系列之:PEM和PKCS7,PKCS8,PKCS12
  6. TeamViewer 远程连接一直显示正在初始化显示参数的解决方案
  7. OA考勤打卡系统功能点
  8. OSI七层参考模型与5G协议
  9. 数据库和SQL基本知识点
  10. 教你win10原版镜像怎么安装