当前位置: 首页 > news >正文

Linux学习笔记6-串口应用

到现在为止都是在开发板上运行的裸机程序,相当于之前学习STM32单片机时走过的路,还没有真正进入到核心的驱动开发部分,但这都是基础,所以慢慢来不着急。
接下来进入串口通信的学习,和GPIO一样,也是和单片机对比着来看。
先看下使用CubeMX设置初始化串口后自动生成的代码,应该都很熟悉了。

void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA8     ------> USART1_CKPA9     ------> USART1_TXPA10     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_8|USART1_TX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = USART1_RX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(USART1_RX_GPIO_Port, &GPIO_InitStruct);/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);}
}

使用串口收发数据时使用的函数是HAL_UART_Transmit()HAL_UART_Receive()或者HAL_UART_Receive_IT()等,或者直接改写printf()scanf()来直接打印或接收串口数据。
I.MX6UL的串口操作大同小异,和之前的GPIO类似,也是需要第三方的编写函数来操作各个串口相关的寄存器来达到想要的功能。有以下4步:

  1. 设置UART的时钟源,设置寄存器CCM_CSCDR1
  2. 初始化UART,包括波特率,奇偶校验位、停止位、数据位,设置寄存器UART1_UCR1~UCR3
  3. 使能相应的UART,设置寄存器UART1_UCR1
  4. 编写UART的数据收发函数,操作寄存器UART1_UTXD

但其实想想就知道,编写收发函数的这种串口读写的方法太繁琐了,最开始helloworld的时候不是直接可以用printf("Hello World!\n");吗?要注意,这个是直接打在屏幕上,而我们现在是要把可执行文件烧写到开发板上,通过开发板的串口和PC连接后发送和接收数据,不是一个层面的事情。当然,我们还是可以用printf()scanf(),但是一定需要初始化串口。本人最主要是想学习Linux的应用,比较浮躁,不愿意投入时间精力去看寄存器的操作,所以在这一阶段利用Uboot移植的stdio文件夹,再使用正点原子写好的相关驱动,直接放到工程文件夹里,就可以使用串口进行数据的读写了。
在main.c里加入这段

char a[20];
int b;
printf("please input your name and your age, use space between them:");
scanf("%s %d, &a, &b);
printf("\r\n%s is the most handsome one in the age of %d", a, b);

编译链接烧写后通过MobaXTerm或其他工具即可完成串口数据的测试,可以打印并接收,完成了预想的功能。

(未完待续)

http://www.lryc.cn/news/246705.html

相关文章:

  • ubuntu下如何查看.gz压缩包中的内容,以及grep过滤查找文件中的某些内容
  • AI 重构工业制造的故事 我们从大模型开始讲起
  • easyExcel 注解开发 快速以及简单上手 以及包含工具类
  • VS2010配置opencv2.4.10
  • Android:控制按键灯亮灭【button-backlight】
  • 1、nmap常用命令
  • Redis缓存设计典型问题
  • 【python】python基础速通系列2-python程序中的积木块
  • 本地开启https,配置nodeJs服务
  • 项目中的svg图标的封装与使用
  • 文件服务器迁移
  • 虹科Pico汽车示波器 | 汽车免拆检修 | 2011款瑞麒M1车发动机起动困难、加速无力
  • 深度学习之图像分类(十五)DINAT: Dilated Neighborhood Attention Transformer详解(一)
  • 和数集团出席中科院上海高研院​第三十三期“高研交叉论坛”信息能源融合专场
  • GitHub----使用记录
  • 大数据平台/大数据技术与原理-实验报告--实战HDFS
  • C#中的事件(委托的发布和订阅、事件的发布和订阅、EventHandler类、Windows事件)
  • 世微 舞台灯深度调光 大功率 dc-dc降压恒流驱动IC APS54083
  • 【nlp】3.3 Transformer论文复现:2. 编码器部分(掩码张量、多头注意力机制、前馈全连接层)
  • vue3中shallowReactive与shallowRef
  • 蓝桥杯-动态规划-子数组问题
  • CDA一级备考思维导图
  • 【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
  • Unity中Shader的BRDF解析(一)
  • 《软件工程原理与实践》复习总结与习题——软件工程概述
  • acwing算法基础之动态规划--线性DP和区间DP
  • 力扣 622.设计循环队列
  • 初识Linux(2).妈妈再也不用担心我Linux找不到门了。
  • 房屋租赁出售经纪人入驻小程序平台
  • 【计算方法与科学建模】矩阵特征值与特征向量的计算(五):乘幂法的加速(带有原点移位的乘幂法)