Linux-Ubuntu之串口通信

Linux-Ubuntu之串口通信

  • 一,串口通信
    • 1.串口通信寄存器配置
    • 2.串口通信软件实现
      • ①手动波特率
      • ②自动波特率
      • ③主函数
  • 二,printf和scanf实现串口的输入显示

一,串口通信

1.串口通信寄存器配置

在这里插入图片描述

串口通信利用接口是这个TTL,下载程序用的是OTG,先连接OTG下载程序,然后再连接到TTL接口,利用SecureCRT观察串口通信,这个Secure就像是板子的串口显示屏,能观察发送和接收的信息。
对寄存器配置,先设置UART1的复用属性和电气属性,然后关闭串口对内部的奇偶校验、停止位、起始位以及波特率进行配置,波特率一般选择115200,最后使能串口,在主函数里面调用相应函数,实现显示。

2.串口通信软件实现

#include "dsp_uart.h"
#include "dsp_gpio.h"
#include "dsp_uart.h"
#include "dsp_gpio.h"void uart_init(void)
{/*初始化GPIO即UART1的复用以及电器属性*/uart_IO_init();/*初始化:波特率等信号*/uart_disable(UART1); //关闭UART1uart_soft(UART1);//复位UART1/*配置UART1*/UART1->UCR1 = 0;UART1->UCR1 &= ~(1<<14);/*UART1具体配置,数据位八位。奇偶校验无,停止位1位*/UART1->UCR2 = 0;  UART1->UCR2 |=(1<<1)|(1<<2)|(1<<5)|(1<<14);UART1->UCR3 |=(1<<2);/*设置波特率 115200*/UART1->UFCR &=~(7<<7);UART1->UFCR = (5<<7);UART1->UBIR = 71;UART1->UBMR =3124;/*使能串口*/uart_enable(UART1);
}/*关闭串口*/
void uart_disable(UART_Type *base)
{base->UCR1 &= ~(1<<0);
}
/*打开串口*/
void uart_enable(UART_Type *base)
{base->UCR1 |= (1<<0);
}
/*复位UART*/
void uart_soft(UART_Type *base)
{base->UCR2 &= ~(1<<0);while((base->UCR2 & 0x01)==0);
}
void uart_IO_init(void) //复用功能和电器属性
{//TXIOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);//设置为复用功能IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10b0);//电器属性//RXIOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0);//设置为复用功能IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10b0);//电器属性
}/*发送一个字符*/
void putc(unsigned char c)
{while(((UART1->USR2 >>3)&0X01) == 0);//判断上次发送完成UART1->UTXD = c&0xff;
}/*接收字符*/
unsigned char getc(void)
{while((UART1->USR2 &0X01)==0);//判断有数据可以接收return UART1->URXD;    
}
/* 发送一串字符*/
void puts(char *str)
{char *p = str;while(*p){putc(*p++);}
}
void uart_setbaudrate(UART_Type *base, unsigned int baudrate, unsigned int srcclock_hz)
{uint32_t numerator = 0u;		//鍒嗗瓙uint32_t denominator = 0U;		//鍒嗘瘝uint32_t divisor = 0U;uint32_t refFreqDiv = 0U;uint32_t divider = 1U;uint64_t baudDiff = 0U;uint64_t tempNumerator = 0U;uint32_t tempDenominator = 0u;/* get the approximately maximum divisor */numerator = srcclock_hz;denominator = baudrate << 4;divisor = 1;while (denominator != 0){divisor = denominator;denominator = numerator % denominator;numerator = divisor;}numerator = srcclock_hz / divisor;denominator = (baudrate << 4) / divisor;/* numerator ranges from 1 ~ 7 * 64k *//* denominator ranges from 1 ~ 64k */if ((numerator > (UART_UBIR_INC_MASK * 7)) || (denominator > UART_UBIR_INC_MASK)){uint32_t m = (numerator - 1) / (UART_UBIR_INC_MASK * 7) + 1;uint32_t n = (denominator - 1) / UART_UBIR_INC_MASK + 1;uint32_t max = m > n ? m : n;numerator /= max;denominator /= max;if (0 == numerator){numerator = 1;}if (0 == denominator){denominator = 1;}}divider = (numerator - 1) / UART_UBIR_INC_MASK + 1;switch (divider){case 1:refFreqDiv = 0x05;break;case 2:refFreqDiv = 0x04;break;case 3:refFreqDiv = 0x03;break;case 4:refFreqDiv = 0x02;break;case 5:refFreqDiv = 0x01;break;case 6:refFreqDiv = 0x00;break;case 7:refFreqDiv = 0x06;break;default:refFreqDiv = 0x05;break;}/* Compare the difference between baudRate_Bps and calculated baud rate.* Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1)).* baudDiff = (srcClock_Hz/divider)/( 16 * ((numerator / divider)/ denominator).*/tempNumerator = srcclock_hz;tempDenominator = (numerator << 4);divisor = 1;/* get the approximately maximum divisor */while (tempDenominator != 0){divisor = tempDenominator;tempDenominator = tempNumerator % tempDenominator;tempNumerator = divisor;}tempNumerator = srcclock_hz / divisor;tempDenominator = (numerator << 4) / divisor;baudDiff = (tempNumerator * denominator) / tempDenominator;baudDiff = (baudDiff >= baudrate) ? (baudDiff - baudrate) : (baudrate - baudDiff);if (baudDiff < (baudrate / 100) * 3){base->UFCR &= ~UART_UFCR_RFDIV_MASK;base->UFCR |= UART_UFCR_RFDIV(refFreqDiv);base->UBIR = UART_UBIR_INC(denominator - 1); //瑕佸厛鍐橴BIR瀵勫瓨鍣紝鐒跺悗鍦ㄥ啓UBMR瀵勫瓨鍣紝3592椤� base->UBMR = UART_UBMR_MOD(numerator / divider - 1);//base->ONEMS = UART_ONEMS_ONEMS(srcclock_hz / (1000 * divider));}}
void raise(int sig_nr) 
{}

①手动波特率

    /*设置波特率 115200*/UART1->UFCR &=~(7<<7);UART1->UFCR = (5<<7);UART1->UBIR = 71;UART1->UBMR =3124;

②自动波特率

利用函数uart_setbaudrate进行设置,串口引入的时钟为80MHZ。

uart_setbaudrate(UART1,115200,80000000);

③主函数

int main(void){unsigned char kkkk=0;int_init();//中断初始化imx6u_clkinit();//时钟初始化key_init();//按键初始化clk_enable();//时钟初始化uart_init();//串口初始化beep_init();//凤鸣器初始化led_init();//led初始化while(1){led_mode(ON);puts("请输入字符:");kkkk=getc();putc(kkkk);puts("\r\n");puts("您输入的字符为:");putc(kkkk);puts("\r\n");led_mode(OFF);}return 0;    }

二,printf和scanf实现串口的输入显示

添加include文件夹,然后将Makefile文件进行对应修改,添加相应路径,在主函数中调用printf和scanf的stdio头文件,在软件上输入数值,实现串口的输入发送,终于感觉能进行交互了。
主函数:

#include "main.h"#include "dsp_clk.h"#include "dsp_led.h"#include "dsp_delay.h"#include "beep.h"#include "dsp_key.h"#include "dsp_int.h"#include "dsp_exti.h"#include "dsp_epit.h"#include "dsp_uart.h"#include "stdio.h"int main(void){int a,b;unsigned char kkkk=0;int_init();//中断初始化imx6u_clkinit();//时钟初始化key_init();//按键初始化clk_enable();//时钟初始化uart_init();//串口初始化beep_init();//凤鸣器初始化led_init();//led初始化while(1){printf("输入两个整数:\r\n");scanf("%d %d",&a,&b);printf("%d + %d = %d \r\n",a,b,a+b);led_mode(!kkkk);kkkk=!kkkk;// led_mode(ON);// puts("请输入字符:");// kkkk=getc();// putc(kkkk);// puts("\r\n");// puts("您输入的字符为:");// putc(kkkk);// puts("\r\n");// led_mode(OFF);}return 0;    }

最终实现界面:
在这里插入图片描述
关于这个软件的安装设置:https://blog.csdn.net/qq_52089863/article/details/132722671

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机发烫怎么解决?

在当今这个智能手机不离手的时代&#xff0c;手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感&#xff0c;长期过热还可能损害手机硬件、缩短电池寿命&#xff0c;甚至引发安全隐患。不过别担心&#xff0c;下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…

YashanDB 23.2 YAC -单库多实例架构多活共享集群安装部署指南

一、概述 1.1 文档目标 ​ 本说明旨在指导技术人员在 CentOS 7 x86_64 操作系统上完成崖山数据库企业版 23.2 的共享集群安装与部署。通过系统架构、集群拓扑及部署需求的精确描述&#xff0c;帮助读者在开始安装前对崖山数据库的架构形成清晰认识。本文以高效、稳定、安全为…

JavaScript(一):变量与常量

目录 var let const 在JavaScript中&#xff0c;主要使用var、let和const关键字来声明变量或常量 var var是JavaScript早期时声明变量的方式&#xff0c;目前比较少用到 作用域&#xff1a; 函数内部声明&#xff1a;只在函数内部有效函数外部声明&#xff1a;全局有效 变量…

【开发问题记录】执行 git cz 报require() of ES Module…… 错误

文章目录 1、问题2、解决3、参考链接 1、问题 在对 commitizen 进行完&#xff0c;一系列的初始化以后 &#xff0c; 对代码进行 提交 到暂存区&#xff0c;然后要提交到 本地仓库 的报错 然后因为安装了 commitizen 所以是想用 git cz 进行提交的&#xff0c; 执行命令的时候…

LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中

LaTeX 是一种基于标记的排版系统&#xff0c;广泛用于创建高质量的文档&#xff0c;特别是在需要复杂数学公式、表格、文献引用等的场景中。以下是关于 LaTeX 的详细解释&#xff1a; 1. LaTeX 的基本概念 本质&#xff1a;LaTeX 是基于 TeX 的排版系统&#xff0c;提供了更高…

AI三驾马车——数据、算法与算力的一体化融合体验

一、概述 随着AI大模型、云计算和大数据技术的快速发展&#xff0c;智能算力市场需求持续增长。今年7月由国家信息中心发布的《智能算力产业发展白皮书》指出&#xff0c;随着AI大模型等关键技术取得突破&#xff0c;算力需求正从通用计算转向智能计算。智能计算是指面向人工智…

【可靠有效】springboot使用netty搭建TCP服务器

Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…

React性能优化:构建更高效的应用

在现代前端开发中,React已经成为构建复杂、交互频繁应用的首选框架。然而,随着应用规模的扩大和功能的丰富,组件的频繁重渲染可能会成为性能瓶颈,影响用户体验。为了提升React应用的性能,开发者需要掌握一系列性能优化技巧和工具。本文将详细介绍React性能优化的各个方面,…

PyTorch Lightning Callback介绍

PyTorch Lightning Callback 介绍 在 PyTorch 中&#xff0c;callbacks&#xff08;回调函数&#xff09;不是原生支持的核心功能&#xff0c;但在深度学习中非常常见&#xff0c;尤其是用来监控训练过程、调整超参数或执行特定的任务。许多高级深度学习框架&#xff08;如 Py…

外键约束的应用层维护

1.前言 一般来说 对于不同表格之间的属性约束 我们通常直接使用数据库已经实现好的外键来完成 但是数据库底层实现的外键他的性能很差 这是因为在执行数据库修改操作时 他需要遍历其他所有的表来找出其中可能相关联的属性 一并进行数据库修改(应用层的维护则只需要遍历所有关联…

【C语言】斐波那契数列

已知Fibonacci数列为1,1,2,3,5,8,13,…&#xff0c;用递归法编写求Fibonacci数的函数&#xff0c;在主函数中输入一个自然数&#xff0c;输出不小于该自然数的最小的一个Fibonacci数。 #include <stdio.h> int Fib(int f) {if (f < 2) return 1;else return Fib(f - …

前端知识补充—CSS

CSS介绍 什么是CSS CSS(Cascading Style Sheet)&#xff0c;层叠样式表, ⽤于控制⻚⾯的样式 CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯的样式和结构分离 基本语法规范 选择器 {⼀条/N条声明} 1&#xff09;选择器决定针对谁修改…

elasticsearch 杂记

8.17快速安装与使用 系统&#xff1a;ubuntu 24 下载地址&#xff1a; https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-linux-x86_64.tar.gz 解压后进入目录&#xff1a;cd ./elasticsearch-8.17.0 运行&#xff1a;./bin/elasticsearch 创…

在git commit之前让其自动执行一次git pull命令

文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢&#xff1f; 是因为在本地操作 git add . 、 git commit -m "xxxxx"时&#xff0c;没有提前进行git pull操作&…

c# RSA加解密工具,.netRSA加解密工具

软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project

地理数据库Telepg面试内容整理-如何在数据库中优化大规模空间数据的查询性能

优化大规模空间数据查询的性能是一个复杂但关键的任务,特别是在需要处理海量的地理信息时。空间数据通常涉及复杂的几何对象、空间关系和大范围的查询操作,因此,优化空间数据的查询性能通常需要综合考虑存储、索引、查询方法等多个方面。以下是一些优化大规模空间数据查询性…

GitCode 光引计划投稿|智能制造一体化低代码平台 Skyeye云

随着智能制造行业的快速发展&#xff0c;企业对全面、高效的管理解决方案的需求日益迫切。然而&#xff0c;传统的开发模式往往依赖于特定的硬件平台&#xff0c;且开发过程繁琐、成本高。为了打破这一瓶颈&#xff0c;Skyeye云应运而生&#xff0c;它采用先进的低代码开发模式…

FFmpeg推拉流命令

命令简介 它可以将本地的视频/音频流推送到服务器&#xff0c;也可以将服务器上的音视频流拉到本地。 推流命令的命令格式 ffmpeg -re -i [输入文件] -c:v [视频编码器] -c:a [音频编码器] -f [输出格式] [推流地址] 参数解析 -re 表示采用实时模式&#xff0c;以原始速度…

使用git管理项目版本

Pycharm git-创建本地仓库\创建分支\合并分支\回溯版本\加入git后文件颜色代表的含义_python中git显示不同颜色-CSDN博客 主要几个命令&#xff1a; git status 查看已提交文件 git checkout -b dev 创建并切换到新分支&#xff0c;是各分支的头指针 git symbolic-ref HEAD re…

iOS从Matter的设备认证证书中获取VID和PID

设备认证证书也叫 DAC, 相当于每个已经认证的设备的标识。包含了 VID 和 PID. VID: Vendor ID &#xff0c;标识厂商 PID: Product ID&#xff0c; 标识设备的 根据 Matter 对于设备证书的规定&#xff0c;DAC证书subject应该包含VID 和 PID. 可通过解析 X509 证书读取subject…