15200波特率_为了搞清楚串口通信为啥设置波特率

串口通信为什么要设置波特率?好奇然后查了一下资料,看见博主小小哈密瓜这么解释。

想要知道这个答案,首先我们先了解一下什么是波特率:

什么是波特率?

波特率(Baud Rate)单位 bps – 每秒传送的字节数 Byte Per Second。

波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示,其单位是波特(Baud)。
在这里插入图片描述
串口通信为什么要设置波特率?
有两种比较可靠的说法:
1、根据电、传输介质等的物理特性结合串口设备使用的要求

为了保证有效通讯,根据电、传输介质等的物理特性结合串口设备使用的要求,确定RS232最大传输速率只能是115200,然后逐级二分得到57600,28800,19200……为适应这些速率,设计相应的晶振频率。
在这里插入图片描述
2、这是由电信线路特性决定的

电话线路的带通是300–3KHz,当时hayes先搞的modem,所以用的2400HZ信号,对应波特率是2400。由于基本频率确定了,以后采用的提高通讯速率的方法都是在2400基础上倍频的,所以形成了9600.19200……

不管哪种说法,都是先有波特率再有晶振频率。
在这里插入图片描述
单片机串口通信波特率计算
在模式0和模式2下,串口波特率固定,模式0为Fosc/12。模式2为Fosc/32或Fosc/64,具体由PCON寄存器的SMOD位决定。

在模式1和模式3下,波特率是一个可变值,波特率可以由定时器1产生(8052可以由定时2产生),那么波特率到底为多少呢?

波特率由定时器1的溢出率来决定:
Baud Rate = (2SMOD/32)*(Timer 1 Overflow Rate)

注意:2SMOD这里的SMOD是指数,SMOD为波特率双倍波特率位,该位在PCON寄存器中。

当使用timer 1作为波特率产生器时,通常需要将timer 1配置成8位自动重装的工作模式下,同时还要禁止timer 1中断,那么timer 1的溢出率是怎样计算的呢?溢出率即溢出的频率,假设晶振频率为12MHz,TH1值为0xFE,则只需要两个时钟脉冲就会溢出,溢出的周期为2us,那么溢出的频率就为500KHz。
在这里插入图片描述
根据定时器一节,定时时间有如下计算公式:

定时时间=(最大计数值-计数器初值)机器周期=(最大计数值-计数器初值)(12/晶振频率(Hz))(s)=(256-TH1)*(12/OSC_FREQ(Hz))(s)。
那么溢出频率自然就为:
*OSC_FREQ(Hz)/((256-TH1)12)。
所以最后推导出波特率为:
*(2SMOD/32)*(OSC_FREQ(Hz)/((256-TH1)12))。
在这里插入图片描述
波特率的计算公式有了,那自然就可以根据波特率推导出TH1的初值了:

BAUD_RATE=(2SMOD/32)(OSC_FREQ(Hz)/((256-TH1)12))

3212(256-TH1)=(2SMOD*OSC_FREQ(Hz))/BAUD_RATE

256-TH1=(2SMODOSC_FREQ(Hz))/(BAUD_RATE32*12)

TH1=256-(2SMODOSC_FREQ(Hz))/(BAUD_RATE32*12)
在这里插入图片描述
假设晶振频率为11.0592MHz,波特率为9600,SMOD=0,TH1初值应该为多少呢?根据上面公式可以计算得TH1=256-11059200/(96003212)=0xFD。

波特率和字节的关系
1GB=1024MB

1MB=1024KB

1KB=1024B(字节)

我们需要串口接收的数据数每秒512字节,串口的波特率是115200位/秒

波特率115200=115200(位/秒)

如果没有校验位,就应该除以10,得到的是每秒字节数:波特率115200=115200(位/秒)=11520(字节/秒)

再除以1024,就是每秒KB数:波特率115200=115200(位/秒)=11.25(KB/秒)也就是满足每秒可以接收512字节。

原文链接:https://blog.csdn.net/weixin_36372610/article/details/113039945

<think>好的,用户之前问过如何在不使用物理FPGA的情况下验证程序,现在他们想知道怎么详细设置虚拟串口。我需要先回顾之前的对话,确保回答连贯。用户可能是开发者或工程师,可能在开发或测试阶段遇到硬件限制,想通过虚拟串口模拟通信。他们的真实需求可能是需要具体的步骤和工具推荐,来搭建测试环境。可能还担心不同操作系统的兼容性,或者如何集成到现有的测试流程中。 首先,我应该分步骤讲解虚拟串口的创建方法,包括Windows和Linux的不同工具,比如VSPE、com0com、socat等。要给出具体的安装和使用示例,比如命令行操作或者软件界面截图。可能用户还需要知道如何与仿真工具或测试脚本配合使用,比如如何让Modbus Poll和仿真程序通过虚拟串口通信。此外,需要提醒注意事项,比如权限问题、波特率设置、数据监控方法,以及自动化测试的可能性。 用户可能对虚拟串口的工作原理不太清楚,是否需要简要解释?或者他们更关注实际操作步骤?根据之前的回答,用户可能更倾向于实用步骤,所以保持步骤清晰,附带示例代码和命令会更合适。同时,要确保推荐的工具是当前常用且容易获取的,比如免费或开源软件。可能还需要提到调试工具,如串口监视器,帮助用户验证数据是否正确传输。最后,总结常见问题,帮助用户避免典型错误,比如虚拟串口配对错误或配置不一致。</think>以下是虚拟串口的详细配置方法,涵盖 **Windows/Linux 系统工具**和 **应用场景示例**: --- ### 一、虚拟串口的核心原理 通过软件模拟一对互联的虚拟串口(如 `COM1↔COM2` 或 `/dev/ttyFPGA↔/dev/ttyTEST`),使两个程序(如 Modbus 主站软件和 FPGA 仿真程序)通过虚拟端口通信,**无需真实硬件**。 --- ### 二、Windows 系统配置方法 #### 1. **工具推荐** - **VSPE (Virtual Serial Port Emulator)**:[官网下载](https://www.eterlogic.com/Products.VSPE.html) - **com0com**(开源):[GitHub 仓库](https://sourceforge.net/projects/com0com/) #### 2. **VSPE 使用步骤** - **步骤1**:安装并启动 VSPE,点击 `Create device` → 选择 `Connector` 类型。 - **步骤2**:创建一对虚拟串口(如 `COM1` 和 `COM2`): ![VSPE 配置](https://www.eterlogic.com/img/vspe-connector.png) - **步骤3**:在 Modbus Poll 软件中选择 `COM1`,在 FPGA 仿真程序中选择 `COM2`,双方即可通过虚拟端口通信。 #### 3. **com0com 使用步骤** - **步骤1**:安装后打开 `Setupc.exe`,点击 `Add pair` 生成虚拟串口对(如 `COM3<->COM4`)。 - **步骤2**:在设备管理器中确认虚拟串口已生成: ![com0com 设备管理器](https://www.mathworks.com/help/supportpkg/arduinoio/ug/com0com_serial_ports.png) --- ### 三、Linux 系统配置方法 #### 1. **使用 `socat` 工具** ```bash # 创建一对虚拟串口(生成 /tmp/ttyFPGA 和 /tmp/ttyTEST) socat -d -d PTY,raw,echo=0,link=/tmp/ttyFPGA PTY,raw,echo=0,link=/tmp/ttyTEST ``` - **参数说明**: - `PTY`:模拟伪终端 - `link=/tmp/ttyXXX`:创建符号链接(方便程序访问) - `echo=0`:关闭回显,避免数据干扰 #### 2. **验证虚拟串口** ```bash # 在终端1监听 /tmp/ttyFPGA cat /tmp/ttyFPGA # 在终端2向 /tmp/ttyTEST 发送数据 echo "Hello" > /tmp/ttyTEST ``` - 若终端1显示 `Hello`,则虚拟串口工作正常。 --- ### 四、虚拟串口的实际应用场景 #### 场景1:**FPGA仿真程序 + Modbus主站测试** - **配置**: - FPGA仿真程序绑定 `COM2`(通过 Testbench 模拟 UART 收发) - Modbus Poll 软件绑定 `COM1` - **数据流**: ``` Modbus Poll (COM1) → 虚拟串口 → FPGA仿真程序 (COM2) ``` #### 场景2:**Python脚本自动化测试** ```python # Python 示例:通过虚拟串口发送Modbus请求 import serial from pymodbus.client import ModbusSerialClient # 连接虚拟串口COM1 client = ModbusSerialClient( method='rtu', port='COM1', baudrate=9600, timeout=1 ) # 发送读保持寄存器请求(地址0,数量1) response = client.read_holding_registers(address=0, count=1, slave=1) print("响应数据:", response.registers) ``` --- ### 五、注意事项 1. **权限问题(Linux)**: - 使用 `sudo chmod 777 /tmp/tty*` 赋予普通用户访问权限。 2. **波特率一致性**: - 虚拟串口两端程序需设置相同波特率(如9600/115200),但**无需考虑物理信号时序**。 3. **数据监控**: - 使用 **AccessPort**(Windows)或 **CuteCom**(Linux)监控虚拟串口数据流。 4. **自动化测试集成**: - 结合 `Python pytest` 或 `Shell 脚本` 实现批量测试。 --- ### 六、常见问题 - **Q1:虚拟串口无法通信?** - 检查串口号是否匹配,关闭占用端口的程序(如重复打开的串口监视器)。 - **Q2:Linux 下提示“设备不存在”?** - 确认已加载内核模块:`sudo modprobe pty`。 --- 通过虚拟串口,可完全脱离硬件完成协议栈调试,显著提升开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值