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

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 Configuration
    PA8     ------> USART1_CK
    PA9     ------> USART1_TX
    PA10     ------> 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.kler.cn/a/148051.html

相关文章:

  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • 网站小程序app怎么查有没有备案?
  • 实现一个BLE HID鼠标
  • unity基础,点乘叉乘。
  • Unity3D 包体裁剪与优化详解
  • 软件测试面试题(800道)【附带答案】持续更新...
  • OpenJudge NOI 1.8 16:矩阵剪刀石头布 c语言
  • SpringBoot趣探究--1.logo是如何打印出来的
  • 抖音视频如何无水印下载,怎么批量保存主页所有视频没水印?
  • Linux下unzip解压乱码问题的解决
  • Go 中切片(Slice)的长度与容量
  • spring JdbcTemplate 快速入门
  • JavaScript创建枚举
  • 解决:javax.websocket.server.ServerContainer not available 报错问题
  • 函数声明与函数表达式
  • uniapp之Vue3配置跨域(代理)
  • [RK-Linux] recovery分区详解(二)
  • harmonyos应用开发者高级认证考试部分答案
  • 配置ssh 免密登录 还是要密码才能登录
  • 二次开发问题汇总【C#】
  • MySQL进阶-InnoDB引擎
  • 全新付费进群系统源码 完整版教程
  • 数字人对本地生活商家的影响和应用
  • 竞赛选题 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测
  • Rust语言入门教程(五) - 流控制语句
  • vue 中 js 金额数字转中文