(嵌入式系统开发)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.4187icon-default.png?t=L9C2https://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

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的嵌入式STM32 RS232通讯程序示例: ```c #include "stm32f10x.h" void USART1_Init(void); void USART1_SendChar(char ch); void USART1_SendString(char* str); int main(void) { USART1_Init(); while (1) { USART1_SendString("Hello, world!\r\n"); for (int i = 0; i < 500000; i++); } } void USART1_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, ch); } void USART1_SendString(char* str) { while (*str) { USART1_SendChar(*str++); } } ``` 此示例代码使用USART1配置为9600波特率的RS232串口。USART1使用GPIOA的Pin9和Pin10。主函数在循环发送字符串“Hello, world!”,每次发送完成后延迟一定时间。USART1_Init()函数用于初始化USART1和GPIOA的引脚。USART1_SendChar()和USART1_SendString()函数用于发送单个字符和字符串。在发送之前,需要检查USART1的TXE标志是否为RESET。如果是,则发送数据,否则等待TXE标志被设置为RESET。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值