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

STM32F4与串口屏通信

淘晶池串口屏操作指令集

那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信

第一,串口屏传输数据给F4板子

这时,我们就该来谈一谈prints函数和printh函数的用法

prints att,length

att:变量名称

length:长度(0为自动长度)

printh hex

hex:需要发送的字符的16进制字符串表达式(每个字节之间用空格隔开)

sprintf(msg, "funct0.b9.txt=\"-%d%s\"", items[opt].step, items[opt].unit);

含sprintf( )的语句都是从单片机发送信息到串口屏并修改串口屏上对应值的代码段,其中func0.b9.txt指的是串口屏上位机程序中func0页面b9模块的文本txt值,也就是说这段代码将串口屏所显示的func0.b9.txt值用“-%d%s”覆盖,其中%d和%s分别是items[opt].step,items[opt].unit的值。
串口屏-单片机的交互流程是:在串口屏上用你配置的虚拟键盘输入数据 -> 输入数据以字符形式从串口屏传给单片机 -> 单片机内部存储该数据 -> 单片机将数据发送回串口屏并在屏幕上进行显示。
将数据发送回串口屏只是为了便于观察和调试,实际上是利用串口屏为单片机内部变量赋新值。

prints函数具体用法:

这里参考一下SpeedyDashie博主:

使用prints函数发送定长为2的字符串,并规定第一个字符为操作位,第二个字符为具体操作值,这样在代码中也比较便于处理。

其中lenth部分写0则代表发送整个完整的字符串,不过由于代码是处理定长数据的,为了防止溢出,建议仍对lenth写2,即发送2字节。注意所发送数据需要带“ ”号,否则会被当作数值类型发送。

对于从单片机回传数据至串口屏,数据的结束符为“0XFF 0XFF 0XFF”三个字节。

示例1:发送字符串

假设要发送字符串"hello",可以这样用prints函数:

prints"hello",5

这里"hello"是要发送的字符串,5表示字符串的长度(5个字符)。串口屏会通过串口将5个字符发送出去。

示例2:发送变量值

如果有变量temp存储了温度值,要将其发送出去,可以这样使用:

prints temp.val,2

假设temp.val的值为25(十进制),那么串口屏会发送两个字节的数据,即19 00(假设以小端格式发送16位数值)。

示例3:结合帧头和帧尾发送数据

在一些通信协议中,可能需要在数据前后添加帧头和帧尾标识。例如,发送一个以0x55开头,以0xff 0xff 0xff结尾的数据帧,其中包含一个变量data的值,可以这样编写:

printh 55         //发送帧头
prints data.val,2 //发送data变量的值,假设是16位数据
printh ff ff ff   //发送帧尾

这样串口屏会先发送0x55作为帧头,然后发送data.val的值,最后发送三个0xff作为帧尾

注意事项

  • 参数格式:在使用prints函数时,参数之间必须用逗号分隔,且参数的格式要正确。例如,发送字符串时,字符串需要用双引号括起来;发送变量时,要使用变量的正确引用方式。

  • 数据类型处理:如果发送的是数值型变量,需要注意其数据类型(如8位、16位、32位等)以及在串口传输中的字节顺序(大端或小端)。

  • 帧结构设计:在设计数据帧时,要根据实际的通信需求合理安排帧头、数据内容和帧尾,确保接收端能够正确解析出完整的数据帧。


 

#include "usart.h"

#define RX_BUFFER_SIZE 256 // 接收缓冲区大小
uint8_t RxBuffer[RX_BUFFER_SIZE]; // 接收缓冲区
uint8_t aRxBuffer; // 中间变量,用于存储接收到的一个字节
uint16_t Uart_Rx_Cnt = 0; // 接收计数

// 在主函数中初始化串口并开启中断接收
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init(); // 初始化串口1,假设与串口屏连接的是串口1
    HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 开启中断接收
    while (1)
    {
        // 主循环中可以处理其他任务
    }
}

// 中断接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    // 检查是否是串口1的中断
    if (huart->Instance == USART1)
    {
        if (Uart_Rx_Cnt >= RX_BUFFER_SIZE - 1) // 如果接收缓冲区即将溢出
        {
            Uart_Rx_Cnt = 0; // 重置计数
            memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区
            HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10, 0xFFFF); // 发送提示信息
        }
        else
        {
            RxBuffer[Uart_Rx_Cnt++] = aRxBuffer; // 将接收到的字节存入缓冲区
            // 判断是否接收到回车换行符(假设串口屏发送数据以回车换行符结束)
            if ((RxBuffer[Uart_Rx_Cnt - 1] == 0x0A) && (RxBuffer[Uart_Rx_Cnt - 2] == 0x0D))
            {
                // 在这里对接收到的数据进行处理
                DataProcessing(RxBuffer, Uart_Rx_Cnt - 2); // 减去回车换行符的两个字节
                Uart_Rx_Cnt = 0; // 重置计数
                memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区
            }
        }
        HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 继续接收下一个字节
    }
}

// 数据处理函数
void DataProcessing(uint8_t *data, uint16_t length)
{
    // 根据实际需求对接收到的数据进行处理
    // 例如,判断数据内容并执行相应操作
    if (length >= 1)
    {
        switch (data[0])
        {
            case 'A':
                // 执行操作A
                break;
            case 'B':
                // 执行操作B
                break;
            default:
                // 默认操作
                break;
        }
    }
}

第二,F4传输数据给串口屏

#include "stdio.h"

void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)
{
    char buf[512]; 
    memset(buf,0x00,sizeof(buf));

   va_list ap;
  va_start(ap, format);
  uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, ap);
    
  va_end(ap);
  HAL_UART_Transmit(huart,(uint8_t *)buf,len,1000);
}
Uart_printf(&huart1,"t0.txt=\"%.3f\"\xff\xff\xff",t0);

相关文章:

  • C++项目——内存池
  • dockerSDK-Go语言实现
  • dfs刷题排列问题 + 子集问题 + 组和问题总结
  • 【Java SE】单例设计模式
  • TNNLS 2024 | 基于残差超密集网络的高光谱图像空间光谱融合方法
  • 【Java基础】在Java中,一个线程的大小(即线程所占用的内存)是多少
  • 关于FastAPI框架的面试题及答案解析
  • 如何在 Flutter 中使用 WebRTC
  • 从零开始学3PC:分布式事务的进阶方案
  • HarmonyOS第23天:应用性能优化,解锁流畅体验密码
  • 当下主流 AI 模型对比:ChatGPT、DeepSeek、Grok 及其他前沿技术
  • 51单片机笔记
  • 【Leetcode 每日一题】2680. 最大或值
  • 组合总和
  • 理解 Node.js 中的 process`对象与常用操作
  • 系统思考—链接组织效能提升与问题解决
  • VideoHelper 油猴脚本,重塑你的视频观看体验
  • 51c~C++合集1
  • 【CSS文字渐变动画】
  • 无人机点对点技术要点分析!
  • 印巴局势紧张之际,巴基斯坦两天内第二次进行导弹试射
  • “特朗普效应”下澳大利亚执政工党赢得大选,年轻选民担忧房价
  • “五一”前两日湖北20多家景区实施限流
  • 重庆市大渡口区区长黄红已任九龙坡区政协党组书记
  • 《水饺皇后》:命运如刀,她以饺子还击
  • 美国证实加拿大及墨西哥汽车零部件免关税