树莓派开发相关知识六 -串口通讯

1、uart串口通信

uart串口通信协议,使用txd,rxd双引脚实行异步数据传输,其中txd为传输口,rxd为接收口。

其协议如上图,由起始位+有效数据位+奇偶校验位(*可选),停止位(*宽度可调),空闲位组成,即根据uart协议,当我们需要发送如01010101这8位有 效数据时,我们应该让txd引脚成010101010(LSB低位在前) (0/1根据奇校验,偶校验还是无奇偶校验定) 1(1/1.5/2 脉冲宽度可以是1,1.5,2),后续如果不发数据了,则停留在空闲位。

如果我们选择有效位8位数据,奇校验并停止位宽度为1,则发送数据时发送 01010100111即可。

  • 空闲位:即不发数据时的默认位,取1
  • 起始位:取0,空闲位拉低表示“我要发数据了”,接收端监听低位就知道“你发数据了”,当然这是异步通信,数据收发不“负责”,只管发跟收,没有 ack回应。
  • 有效数据位:低位在前,即先发低位
  • 奇偶校验位:根据协议可设置为奇校验,偶校验,无奇偶校验,奇校验则上述有效位+校验位加起来为奇数,偶校验则有效位+校验位为偶数,无 则没有这个时序
  • 停止位:取1,即拉高表示数据传输结束,保持1/1.5/2个脉冲宽度,可根据协议调整

由于是异步通信,因此收发两端必须通过某种方式进行同步,此同步方式为波特率,所谓波特率即一秒钟有多少个位传输,如115200表示为传输速度 为115200bit/s,每个脉冲宽度为1s / 115200 = 8.68us

即,收发双方都是按照8.68us的节奏来进行数据的“裁剪”工作,达到“同步”。

2、wiringPi串口接口函数

int serialOpen(char *device, int baud)  
device:串口的地址默认一般是"/dev/ttyAMA0"
baud:波特率
返回:正常返回文件描述符,否则返回-1失败。

void serialClose(int fd)
fd:文件描述符    关闭fd关联的串口

void  serialPutchar(int fd, unsigned char c)    
fd:文件描述符
c:要发送的数据

void  serialPuts (int fd, char *s)  
fd:文件描述符
s:发送的字符串,字符串要以'\0'结尾

void  serialPrintf (int fd, char *message, …)   
fd:文件描述符
message:格式化的字符串

int serialDataAvail (int fd)  
fd:文件描述符
返回:串口缓存中已经接收的,可读取的字节数,-1代表错误

int serialGetchar (int fd)  
fd:文件描述符
返回:读取到的字符
如果串口缓存中没有可用的数据,则会阻塞10秒,如果10后还有没,返回-1
所以,在读取前,做好通过serialDataAvail判断下。

void serialFlush (int fd)   
fd:文件描述符
刷新,清空串口缓冲中的所有可用的数据。

3、发送数据测试

 #include <stdio.h>
 #include <stdlib.h>
 #include "wiringPi.h"
 #include "wiringSerial.h"
 int main(void)
 {
	//打开串口,设备驱动为/dev/ttyAMA0
	int fd = serialOpen("/dev/ttyAMA0", 115200);//波特率
	char str[100] = "";
	while(1){
		//发送0xAA,即0B10101010
		serialPutchar(fd, 0xaa);

      //每一秒往串口输出helloworld
       //serialPuts(fd, "helloworld\n");
       //sleep(1);
	}
	return 0;
 }

4、时序分析

按照串口协议,此程序中波特率选择115200,其他没有设置,即默认无奇偶校验,停止位宽度为1,8位有效数据。 开始为起始位为0,有效数据位0B10101010,由于LSB低位在前,因此数据时序就变成01010101倒置,停止位1 因此时序应为0010101011这样的周期时序。

5、使用ttl转usb与计算机进行串口通信,从计算机读取

#include <stdio.h>
 #include "wiringPi.h"
 #include "wiringSerial.h"
 #include <string.h>
 int main(void)
 {
	 //打开串口,设备驱动为/dev/ttyAMA0
	 int fd = serialOpen("/dev/ttyAMA0", 115200);
	 char str[100] = "";
	 int idx = 0;
	 char ch = 0;
	 while(1){
		 //由于串口输入serialGetchar有阻塞,因此通过serialDataAvail接口判断缓存中是否有数据写入,再进行读取
		if(serialDataAvail(fd) > 0){
			 char ch = serialGetchar(fd);
			 str[idx] = ch;
			 
			 if(ch == '\n')
			 {
				 str[idx] = '\0';
				 printf("%s\n", str);
				 idx = 0;
			 }else
			 {
				idx++;
			 }
		 }
	 }
	 return 0;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件&#xff0c;用于创建复选框&#xff0c;允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类&#xff0c;因此继承了按钮的特性。它表示一个复选框&#xff0c;用户可以通过…

计算机网络(Ⅴ)网络核心

电路交换 为源主机分配了独享的线路。有资源浪费是缺点。 优点是保障了性能&#xff0c;但是资源共享的能力较差&#xff08;计算机的通讯不是持续的&#xff0c;具有突发性&#xff0c;不适用于电路交换&#xff09; 频分&#xff08;FDM&#xff09;&#xff1a;交换节点与交…

漫途焊机安全生产监管方案,提升安全生产管理水平!

随着智能制造时代的到来&#xff0c;企业安全生产管理的重要性日益凸显。特别是在现代工厂中&#xff0c;焊机的安全生产监管成为了一个不容忽视的重要环节。传统的焊机安全生产监管方式存在诸多不足&#xff0c;如人工巡检频率低、数据延迟、安全隐患发现不及时等问题。因此&a…

下划线命名转驼峰

转小驼峰 //下划线对小驼峰命名转换 public class UnderlineToCamelCase {public static String underlineToCamel(String underlineStr) {String[] words underlineStr.split("_");StringBuilder result new StringBuilder(words[0]);// 从第二个单词开始&#x…

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…

小红书笔记详情API接口系列(概述到示例案例)

小红书笔记详情数据API接口是小红书开放平台提供的一项服务&#xff0c;允许开发者获取小红书上的笔记详情数据。以下是对该接口及其使用方法的详细介绍&#xff1a; 一、接口概述 小红书笔记详情数据API接口提供了一系列的接口&#xff0c;允许开发者获取笔记的标题、正文、标…

如何有效提升MySQL大表分页查询效率(本文以一张900万条数据体量的表为例进行详细解读)

文章目录 1、提出问题1.1 问题测试 2、解决问题&#xff08;三种方案&#xff09;2.1、方案一&#xff1a;查询的时候&#xff0c;只返回主键 ID2.2、方案二&#xff1a;查询的时候&#xff0c;通过主键 ID 过滤2.3、方案三&#xff1a;采用 elasticSearch 作为搜索引擎 3、总结…

整车功能架构 --- 智能座舱

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

「C/C++」C/C++ 之 动态内存分配

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

WSGI、uwsgi、uWSGI与Nginx

一、写在前 WSGI、uwsgi与uWSGI WSGI (web server gateway interface 网络服务网关接口) 只能用于python&#xff0c;是一个接口标准协议&#xff0c;django、flask自带有uwsgi 是WSGI的通信协议uWSGI是实现了uwsgi协议和WSGI服务的web服务器 他们是为了将web服务器与web框架…

【element ui系列】分享几种实现el-table表格单选的方法

在实际的开发中&#xff0c;经常会用到从表格中选择一条记录的情况&#xff0c;虽然官方给出的例子&#xff0c;但是给人感觉看起来不明显&#xff0c;于是&#xff0c;在此基础上做了改进。接下来&#xff0c;介绍两种常见的实现方法&#xff1a; 1、采用复选框(checkbox)实现…

nodejs批量修改word文档目录样式

工作中遇到一个需求:写个nodejs脚本,对word文档(1000+个)的目录页面进行美化。实现过程遇到不少麻烦,在此分享下。 整体思路 众所周知,Docx格式的Word文档其实是个以xml文件为主的zip压缩包,所以,页面美化整体思路是:先将文档后缀名改为zip并解压到本地,然后将关键的…

信息安全数学基础(40)同态

一、定义 设R和S是两个环&#xff08;或群等其他代数结构&#xff09;&#xff0c;如果存在一个映射σ&#xff1a;R→S&#xff0c;使得对于R中的任意元素a和b&#xff0c;都满足σ(ab)σ(a)σ(b)和σ(ab)σ(a)σ(b)&#xff08;在群的情况下&#xff0c;则满足σ(a*b)σ(a)σ…

【笔面试常见题:三门问题】用条件概率、全概率和贝叶斯推导

1. 问题介绍 三门问题&#xff0c;又叫蒙提霍尔问题&#xff08;Monty Hall problem&#xff09;&#xff0c;以下是蒙提霍尔问题的一个著名的叙述&#xff0c;来自Craig F. Whitaker于1990年寄给《展示杂志》&#xff08;Parade Magazine&#xff09;玛丽莲沃斯莎凡特&#x…

反向代购企业如何精准出击高需求国家——以俄罗斯市场为例

在全球化贸易的浪潮中&#xff0c;中国凭借其强大的工业生产能力、优越的地缘优势以及与俄罗斯日益紧密的双边关系&#xff0c;已成为俄罗斯不可或缺的贸易伙伴。中国制造的商品&#xff0c;从衣食住行到各类消费品&#xff0c;已深深渗透到俄罗斯民众的日常生活中。 据数据统计…

Muse-Ant-Desgin-Vue 改造成 Vite+Vue3

后台地址&#xff1a;https://www.creative-tim.com/product/muse-vue-ant-design-dashboard?refantdv-official 一、配置 ViteAntDesginVue 配置ViteAntDesginVue ViteAntDesginVue配置&#xff1a;https://blog.csdn.net/qq_17523181/article/details/143241626 安装vue-ro…

Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)

文章目录 前言解决方法后记 前言 一个排阻接八个 LED&#xff0c;方便又省事&#xff0c;但出现了P1端口输出低电平后&#xff0c;仿真引脚却一直显示红色保持高电平不变&#xff0c;用电压表测量显示 2V 左右。 这是仿真的问题&#xff0c;在用开发板时是不会遇到的&#xff…

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…

Altium Designer使用技巧(一)

一、清除绿色报错。 按TM快捷键。即可消除报错。 二、模块化框选集中。 在原理图中框选原理图&#xff0c;然后按 T S,会跳转到指定pcb&#xff0c;并选择上相应封装&#xff0c;此时按 T O L,再次画一个矩形&#xff0c;刚才选中的封装就会汇集到一起。 三、隐藏飞线 在PCB界面…

笔记本双系统win10+Ubuntu 20.04 无法调节亮度亲测解决

sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple 安装好后找到一个太阳的图标&#xff0c;就是这个软件&#xff0c;打开后调整brightness&#xff0c;就可以调整亮度&#xff0c;可…