单片机IO模拟串口协议

2023-11-02

一、前言

        嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题,但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况,这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果,但是要用逻辑分析仪抓线逐个看波形比较费劲。既然都IO抖线了,干脆抖个串口协议出来算了,通过控制IO口电平变化模拟串口协议。

二、串口协议

1、协议介绍

UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其中每一位(Bit)的意义如下:

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。

2、传输过程

发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。

接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。

由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART对RX线上的数据采样时通常取中间的采样值或者是从中间取多个点的值然后取出现次数最多的电平值,以保证采样不会滑码或误码。

之前也写过一篇FPGA实现串口协议的文章《FPGA专题——串口通信》

三、代码实现

       基于STM32实现代码如下

#define sw_tx_io_high GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define sw_tx_io_low GPIO_ResetBits(GPIOB, GPIO_Pin_1)

void delay(u32 i)	  
{
	while(i--)
	{
		__NOP();
	}
}

void sw_uart_init(void)
{
	sw_tx_io_high;
}

void sw_uart_putchar(u8 ch)
{
	u8 dat[10];  // 1 start bit + 8 data bit + 1 stop bit
	u8 i;

	// start bit
	dat[0] = 0;  

	// data bit
	for (i = 0; i < 8; i++)
	{
		if (ch & 0x01)
		{
			dat[i + 1] = 1;
		}
		else
		{
			dat[i + 1] = 0;
		}

		ch >>= 1;
	}

	// stop bit
	dat[9] = 1;

	for (i = 0; i < 10; i++)
	{
		if (dat[i])
		{
			sw_tx_io_high;
		}
		else
		{
			sw_tx_io_low;
		}

		delay(64);  // 8.68 us, 115200 baudrate
	}
}

void sw_uart_putStr(u8* str)
{
	while (*str != 0)
	{
		sw_uart_putchar(*str);
		str++;
	}
}

sw_uart_putchar 控制单次输出一个字符,测试中定波特率为115200,那么停止位(即最小脉冲宽度)为1 / 115200 = 8.68us,使用逻辑分析仪或者示波器,调整delay函数传入的参数,我这边测试是给64的时候可以调整到8.68us左右,当然大概调到这个时间就行了不需要很准,串口协议本身可以容忍一定的误差。

delay函数使用MCU空等待来实现延时效果。

最后使用 sw_uart_putStr("Hello CSDN \r\n"); 可以在串口助手上显示“Hello CSDN”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机IO模拟串口协议 的相关文章

  • Mysql的SQL语句优化和事务隔离级别

    文章目录 安装步骤 mysql连接命令 优化 事务4种特性和4种级别 脏读 不可重复读 幻读 安装步骤 我的文章 https blog csdn net UnicornRe article details 117657298 mysql连接
  • Python读取Access数据库基本操作

    接上篇 python操作Access mdb数据库环境配置 配置好的环境 进行Access数据库基本的操作 导入模块 import pypyodbc import win32com client path r C Users Adminis
  • Parasoft Jtest 2023.1版本-全新的Jtest让你的Java测试更加容易

    测试用例的创建和执行以及测量代码覆盖率是现代开发过程的重要组成部分 新发布的Parasoft Jtest 2023 1增加了重要的新功能 使Java开发和QA团队在测试实践中更具有生产力和效率 通过使用最新版本的Jtest 您可以在Visu

随机推荐

  • C/C++编程:从0到1学习libuv(linux、Clion)

    libuv强制使用异步和事件驱动的编程风格 它的核心工作是提供一个event loop 还有其他基于IO和其他事件通知的回调函数 libhv还提供了一些核心工具 比如定时器 非阻塞的网络支持 异步文件系统访问 子进程等 实践 接下来我们安装
  • [CentOS6.5]cmake: command not found

    yum install y cmake
  • 如何使用Python进行数据挖掘?

    使用Python进行数据挖掘需要掌握以下几个关键步骤 数据收集 首先 你需要获取你要进行数据挖掘的数据 可以从公共数据集 API 数据库等各种来源收集数据 数据清洗 清洗数据是一个重要的步骤 它包括去除重复数据 处理缺失值 处理异常值 标准
  • 2020-11-30

    嵌入式MQTT库移植 基于mosquitto库 一 交叉编译OpenSSL 下载源码到Linux虚拟机环境 https www openssl org source openssl 1 1 1f tar gz 放入非windows共享文件夹
  • UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 的解决方法

    最近初学网络爬虫 今天在练习使用Python的request模块的时候遇到了一个错误 import requests 发送请求 response requests get https jingyan baidu com event img
  • input获取值时,页面数据value并未改为键入值,导致校验时数据不一致问题处理

    由于部分原因 系统现需要将数据进行动态处理 实现表头自定义 产生问题的背景不做介绍 现做此记录 方便后面查阅 问题描述 修改了input框的值 但实际value并未改变 如下可以看到下图右边值已经改为了500 但是进行调试时发现依旧是页面初
  • python UI自动化无界面运行

    python大家都知道可以使用selenium进行在Windows环境下运行 但每次都会进行弹框运行 但有时我们需要脚本在Linux环境进行运行或者不希望UI自动化频繁的弹框影响我们的操作 所有我们可以在编写UI自动化的时候选择有界面运行
  • echart--柱状图 从上到下排列 不居中

    遇到问题 echart的柱状图 我需要长这样 但是变成了下面那个图的样子 原因 1 x轴的对其方向不对 2 y轴的数据默认高度是auto 设置一个定死的值就行 3 y轴的对其方向不对 解决方案 在对应位置加上框里的参数
  • CPU interactive调频策略

    本文集中于interactive调频策略 内核可选的调频策略 读取可用的调频管理策略 sys devices system cpu cpufreq cpu0 cpufreq scaling available governors 调频策略通
  • python -m pip install --upgrade pip 报错

    具体问题 环境 windows python3 6 根据pip 的提示 WARNING You are using pip version 19 3 1 however version 20 0 2 is available You sho
  • 【LeetCode与《代码随想录》】双指针篇:做题笔记与总结-JavaScript版

    文章目录 代码随想录 主要题目 27 移除元素 344 反转字符串 剑指Offer 05 替换空格 151 翻转字符串里的单词 206 反转链表 24 两两交换链表中的节点 19 删除链表的倒数第 N 个结点 面试题 02 07 链表相交
  • 服务商面盯行业大佬新动向站在巨人肩膀上

    刷脸支付是以往的支付方式的巨大变革 可能会带来支付链条的变化以及交易场景的改变 从而引发第三方支付革命 其次一些新概念有助于刺激消费体验 同时可以提高企业品牌影响力 这些都是使用刷脸支付的有利之处 对于商户而言 刷脸支付增加广告曝光程度因为
  • 基于已搭建的项目完成用户管理模块

    一 创建所需数据库并添加记录 二 将资料中的所需页面内容加载到项目当中的webapp目录下 三 在各包中创建相关的类及接口 1 实体类创建 UserInfo 实体类 映射数据库字段 字段建议一致 2 在dao层接口定义用户管理模块的增删改查
  • matlab不同数据类型的读取(加载)和保存(写入)策略

    本文侧重于提供保存和读取最佳策略 分析适用场景 matlab的具体语法可以通过doc或help查询详细文档及示例 持续更新中 cell 矩阵 等不同数据类型的matlab内部读取和python交互读取策略 matlab内部读取 通用读写函数
  • 决策树(信息熵、信息增溢、GINI)的计算

    如何构建决策树 我需要选择什么属性来度量 这里我们需要通过计算才能更好的构建一棵决策树 有以下二分类问题训练样本 outlook temperat humidity windy play sunny hot high FALSE no su
  • 错误: 尝试打开文件xxxx-1.0-SNAPSHOT.jar时出现意外错误

    错误 尝试打开文件xxxx 1 0 SNAPSHOT jar时出现意外错误 解决方法 1 请看 395条消息 Linux jar报错处理 Exception in thread main java lang No Error Invalid
  • 牛客网输入输出练习(python/C++)

    牛客网输入输出练习 ACM模式 python c 1 A B 输入无行数 python解答 c 解答 2 A B 给定行数的输入 python解答 c 解答 3 A B 指定条件结束 python解答 c 解答 4 A B 给定长度的数组求
  • 2017年学习计划

    1 掌握一个画项目结构图的工具 2 熟练掌握c c 语言 3 完成HomeLife的开发 4 掌握linux的基本使用
  • ubuntu: 查看CPU信息

    cat proc cpuinfo 如果有多块CPU 就会一并显示出来
  • 单片机IO模拟串口协议

    一 前言 嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题 但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况 这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果 但是要用逻辑分析仪抓线逐个看波形比较费劲