20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3

stty -F /dev/ttyS3 115200 -echo
cat /dev/ttyS3 &
echo  serialdata > /dev/ttyS3


20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3
2025/3/19 14:17


缘起:在荣品的PRO-RK3566开发板的buildroot系统下,在命令行中使用echo可以发送数据。
但是cat不能接收数据。荣品建议直接使用SDK中集成的QT应用来测试了。

串口线需要使用1.25/1.27mm间距的4PIN排线。


1、现在 在PRO-RK3566开发板上的UART3。可以以 115200bps N 8 1 对外发送,请问 接受怎么配置?
2、打开 UART3时 内核的警告信息?怎么关闭?如何处理?


root@rk3566-buildroot:/dev# stty -F /dev/ttyS3 115200 -echo
[   36.455271] of_dma_request_slave_channel: dma-names property of node '/serial@fe670000' missing or empty
root@rk3566-buildroot:/dev# [   36.455328] dw-apb-uart fe670000.serial: failed to request DMA, use interrupt mode


1 桌面也有测试的qt 应用 可以去看接收  
2 打印是没有开启dma 模式,对收发没有影响,需要可以去 内核目录下搜索 注释打印


参考资料:
https://doc.rpdzkj.cn/#/zh_cn/%E7%91%9E%E8%8A%AF%E5%BE%AE%E7%B3%BB%E5%88%97/rk3566-rk3568/8.%E6%8E%A5%E5%8F%A3%E4%BD%BF%E7%94%A8?id=%e4%b8%b2%e5%8f%a3%e6%b5%8b%e8%af%95
串口测试
Debian 或者 Ubuntu 可用minicom测试

安装:

sudo apt-get install minicom
复制Error已复制
安装完成后,启动 minicom

例如:

以115200的波率、无校验位、1位停止位的方式连接到/dev/ttyS5串口。

sudo minicom -b 115200 -o -D /dev/ttyS5
复制Error已复制
退出后短接TX,RX,输入英文或数字字符,就能在界面中显示出来

image-49

buildroot

使用自带命令cat和echo模拟串口收发。

短接串口的tx和rx。

配置串口:

设置波特率为 115200,-F指定具体的串口,其它参数不指定使用默认值。

stty -F /dev/ttyS0 115200 -echo
复制Error已复制
开始测试:

后台cat在串口有数据时打印接收到的数据:

cat /dev/ttyS0 &
复制Error已复制
使用echo将数据重定向到串口/dev/ttyS0:

echo  serialdata > /dev/ttyS0
复制Error已复制
如果串口正常,则会在终端打印echo传输的信息。


参考资料:
百度:RK3588 串口测试


https://blog.csdn.net/MATLABCSD/article/details/136390240?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522f1e73abada1bd9b99186c23ec00cd9ac%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=f1e73abada1bd9b99186c23ec00cd9ac&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-136390240-null-null.142^v102^pc_search_result_base6&utm_term=rk3588%20%E6%B5%8B%E8%AF%95%E4%B8%B2%E5%8F%A3%E5%8A%9F%E8%83%BD%E6%98%AF%E5%90%A6%E6%AD%A3%E5%B8%B8&spm=1018.2226.3001.4187
https://blog.csdn.net/MATLABCSD/article/details/136390240
rk3588 测试串口功能是否正常


https://blog.51cto.com/u_16213608/12700040
瑞芯微rk3588 实测目标检测


https://www.bilibili.com/opus/850451336208056345
RK3588平台产测之ArmSoM-W3 DDR压力测试

root@rk3566-buildroot:/# 
root@rk3566-buildroot:/# cd rockchip-test/
root@rk3566-buildroot:/rockchip-test# cd ddr/
root@rk3566-buildroot:/rockchip-test/ddr# 
root@rk3566-buildroot:/rockchip-test/ddr# ll
total 24
drwxr-xr-x  2 root root 4096 Jul  2  2024 ./
drwxr-xr-x 16 root root 4096 Jul  2  2024 ../
-rwxr-xr-x  1 root root 1116 Jul  1  2024 ddr_freq_scaling.sh*
-rwxr-xr-x  1 root root 1395 Jul  1  2024 ddr_test.sh*
-rwxr-xr-x  1 root root  559 Jul  1  2024 memtester_test.sh*
-rwxr-xr-x  1 root root  681 Jul  1  2024 stressapptest_test.sh*
root@rk3566-buildroot:/rockchip-test/ddr# 


https://www.elecfans.com/d/5402027.html
迅为电子RK3588S开发板第三章Buildroot系统功能测试


https://blog.51cto.com/u_14224/12947041
rk3588串口查看DDR gpu CPU频率及利用率


https://baijiahao.baidu.com/s?id=1780150091100272757&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/664344987
https://blog.csdn.net/sinovoip/article/details/134008668
Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termio.h>
#include <time.h>
#include <pthread.h>
 
int read_data(int fd, void *buf, int len);
int write_data(int fd, void *buf, int len);
int setup_port(int fd, int baud, int databits, int parity, int stopbits);
void print_usage(char *program_name);
 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t data_ready = PTHREAD_COND_INITIALIZER;
int data_available = 0;
 
void *read_thread(void *arg) {
    int fd = *(int *)arg;
    char buffer[1024]; // 存储读取的数据
 
    while (1) {
        int bytes_read = read_data(fd, buffer, sizeof(buffer));
        if (bytes_read > 0) {
            printf("Read Thread: Read %d bytes: %s\n", bytes_read, buffer);
        } else {
            // 处理读取错误或设备关闭的情况
            break;
        }
    }
    
    pthread_exit(NULL);
}
 
void *write_thread(void *arg) {
    int fd = *(int *)arg;
    char input[1024]; // 存储用户输入的数据
 
    while (1) {
        printf("Enter data to write (or 'q' to quit): ");
        fgets(input, sizeof(input), stdin);
 
        if (strcmp(input, "q\n") == 0 || strcmp(input, "Q\n") == 0) {
            // 用户输入 'q' 或 'Q',退出循环
            break;
        }
 
        int len = strlen(input);
        int bytes_written = write_data(fd, input, len);
        if (bytes_written > 0) {
            printf("Write Thread: Wrote %d bytes: %s\n", bytes_written, input);
        }
    }
    
    pthread_exit(NULL);
}
 
int main(int argc, char *argv[]) //./a.out /dev/ttyS4 115200 8 0 1
{
    int fd;
    int baud;
    int len;
    int count;
    int i;
    int databits;
    int stopbits;
    int parity;
 
    if (argc != 6) {
        print_usage(argv[0]);
        return 1;
    }
 
    baud = atoi(argv[2]);
    if ((baud < 0) || (baud > 921600)) {
        fprintf(stderr, "Invalid baudrate!\n");
        return 1;
    }
 
    databits = atoi(argv[3]);
    if ((databits < 5) || (databits > 8)) {
        fprintf(stderr, "Invalid databits!\n");
        return 1;
    }
 
    parity = atoi(argv[4]);
    if ((parity < 0) || (parity > 2)) {
        fprintf(stderr, "Invalid parity!\n");
        return 1;
    }
 
    stopbits = atoi(argv[5]);
    if ((stopbits < 1) || (stopbits > 2)) {
        fprintf(stderr, "Invalid stopbits!\n");
        return 1;
    }
 
 
    fd = open(argv[1], O_RDWR, 0);
    if (fd < 0) {
        fprintf(stderr, "open <%s> error %s\n", argv[1], strerror(errno));
        return 1;
    }
 
    if (setup_port(fd, baud, databits, parity, stopbits)) {
        fprintf(stderr, "setup_port error %s\n", strerror(errno));
        close(fd);
        return 1;
    }
    pthread_t read_tid, write_tid;
    int ret;
 
    // 创建读取线程
    ret = pthread_create(&read_tid, NULL, read_thread, &fd);
    if (ret != 0) {
        fprintf(stderr, "Failed to create read thread\n");
        return 1;
    }
 
    // 创建写入线程
    ret = pthread_create(&write_tid, NULL, write_thread, &fd);
    if (ret != 0) {
        fprintf(stderr, "Failed to create write thread\n");
        return 1;
    }
 
    // 等待读取线程和写入线程结束
    pthread_join(read_tid, NULL);
    pthread_join(write_tid, NULL);
    
    close(fd);
 
    return 0;
}
 
static int baudflag_arr[] = {
    B921600, B460800, B230400, B115200, B57600, B38400,
    B19200,  B9600,   B4800,   B2400,   B1800,  B1200,
    B600,    B300,    B150,    B110,    B75,    B50
};
static int speed_arr[] = {
    921600,  460800,  230400,  115200,  57600,  38400,
    19200,   9600,    4800,    2400,    1800,   1200,
    600,     300,     150,     110,     75,     50
};
 
int speed_to_flag(int speed)
{
    int i;
 
    for (i = 0;  i < sizeof(speed_arr)/sizeof(int);  i++) {
        if (speed == speed_arr[i]) {
            return baudflag_arr[i];
        }
    }
 
    fprintf(stderr, "Unsupported baudrate, use 9600 instead!\n");
    return B9600;
}
 
static struct termio oterm_attr;
 
int setup_port(int fd, int baud, int databits, int parity, int stopbits)
{
    struct termio term_attr;
 
    
    if (ioctl(fd, TCGETA, &term_attr) < 0) {
        return -1;
    }
 
    
    memcpy(&oterm_attr, &term_attr, sizeof(struct termio));
 
    term_attr.c_iflag &= ~(INLCR | IGNCR | ICRNL | ISTRIP);
    term_attr.c_oflag &= ~(OPOST | ONLCR | OCRNL);
    term_attr.c_lflag &= ~(ISIG | ECHO | ICANON | NOFLSH);
    term_attr.c_cflag &= ~CBAUD;
    term_attr.c_cflag |= CREAD | speed_to_flag(baud);
 
    
    term_attr.c_cflag &= ~(CSIZE);
    switch (databits) {
        case 5:
            term_attr.c_cflag |= CS5;
            break;
 
        case 6:
            term_attr.c_cflag |= CS6;
            break;
 
        case 7:
            term_attr.c_cflag |= CS7;
            break;
 
        case 8:
        default:
            term_attr.c_cflag |= CS8;
            break;
    }
 
    
    switch (parity) {
        case 1:  
            term_attr.c_cflag |= (PARENB | PARODD);
            break;
 
        case 2:  
            term_attr.c_cflag |= PARENB;
            term_attr.c_cflag &= ~(PARODD);
            break;
 
        case 0:  
        default:
            term_attr.c_cflag &= ~(PARENB);
            break;
    }
 
 
    
    switch (stopbits) {
        case 2:  
            term_attr.c_cflag |= CSTOPB;
            break;
 
        case 1:  
        default:
            term_attr.c_cflag &= ~CSTOPB;
            break;
    }
 
    term_attr.c_cc[VMIN] = 1;
    term_attr.c_cc[VTIME] = 0;
 
    if (ioctl(fd, TCSETAW, &term_attr) < 0) {
        return -1;
    }
 
    if (ioctl(fd, TCFLSH, 2) < 0) {
        return -1;
    }
 
    return 0;
}
 
 
int read_data(int fd, void *buf, int len)
{
    int count;
    int ret;
 
    ret = 0;
    count = 0;
 
    //while (len > 0) {
 
    ret = read(fd, (char*)buf + count, len);
    if (ret < 1) {
        fprintf(stderr, "Read error %s\n", strerror(errno));
        //break;
    }
 
    count += ret;
    len = len - ret;
 
    //}
 
    *((char*)buf + count) = 0;
    return count;
}
 
 
int write_data(int fd, void *buf, int len)
{
    int count;
    int ret;
 
    ret = 0;
    count = 0;
 
    while (len > 0) {
 
        ret = write(fd, (char*)buf + count, len);
        if (ret < 1) {
            fprintf(stderr, "Write error %s\n", strerror(errno));
            break;
        }
 
        count += ret;
        len = len - ret;
    }
 
    return count;
}
 
void print_usage(char *program_name)
{
    fprintf(stderr,
            "*************************************\n"
            "  A Simple Serial Port Test Utility\n"
            "*************************************\n\n"
            "Usage:\n  %s <device> <baud> <databits> <parity> <stopbits> \n"
            "       databits: 5, 6, 7, 8\n"
            "       parity: 0(None), 1(Odd), 2(Even)\n"
            "       stopbits: 1, 2\n"
            "Example:\n  %s /dev/ttyS4 115200 8 0 1\n\n",
            program_name, program_name
           );
}

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

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

相关文章

深入理解 C# 反射 的使用

总目录 前言 反射是.NET框架中一个强大的特性&#xff0c;允许程序在运行时检查和操作类型信息。通过反射&#xff0c;开发者可以动态地创建对象、调用方法、访问属性等&#xff0c;为程序提供了极大的灵活性。本文将详细讲解C#反射的使用方法及其应用场景。 一、什么是反射&a…

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…

AI入门7:python三种API方式调用本地Ollama+DeepSeek

回顾 书接上篇&#xff1a;各种方式搭建了本地知识库&#xff1a; AI入门&#xff1a;AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2&#xff1a;本地AI部署&#xff0c;用ollama部署deepseek&#xff08;私有化部署&#xff09;-CSDN博客 AI入门3&#xff1a;给本地d…

内网安全-横向移动Kerberos 攻击SPN 扫描WinRMWinRSRDP

1.WinRM&WinRS 条件&#xff1a; 双方开启winrm winrs服务 2008版本以上默认开启&#xff0c;win 7默认关闭 检测使用cs内置端口扫描5985开放情况 进行连接 winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami 2.内网-spn shell setspn -T …

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…

高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?

如果有遗漏,评论区告诉我进行补充 面试官: Eureka是什么&#xff1f; 我回答: 在Java高级面试中&#xff0c;关于Eureka的讨论通常会涵盖其基本概念、组件与架构、工作原理、高级特性以及与其他服务发现工具的比较等多个方面。以下是结合提供的内容对Eureka进行的详细解析和…

YZi Labs 谈对 Plume 的投资:利用区块链创造现实价值的典范项目

3 月 17 日&#xff0c;YZi Labs 宣布投资 RWAfi 赛道项目 Plume&#xff0c;引发市场广泛关注。本轮融资是 Plume 在 去年 5 月和 12 月 连续两轮融资后的第三轮融资&#xff0c;代表着市场资本市场对于 Plume RWAfi 叙事以及其发展潜力的高度认可。 本次融资不仅提升了市场对…

互功率谱 cpsd

互功率谱(Cross-Power Spectral Density, CPSD)是信号处理中用于描述两个信号在频域中相关性的工具。它表示两个信号在不同频率下的功率分布及其相位关系,广泛应用于模态分析、系统辨识和信号匹配等领域。 matlab 实现 MATLAB 提供了 cpsd 函数来计算互功率谱。以下是使用 …

RocketMQ 架构

一、RocketMQ 核心架构概述 ​1. 主要组件 ​Name Server&#xff1a; 集群的「中枢神经」&#xff0c;负责 Topic 元数据管理&#xff08;如 Topic 分区分布、Broker 节点状态监控&#xff09;。 ​Broker&#xff1a; 消息存储与流转的核心节点&#xff0c;负责消息的持久化…

单片机学完开发板,如何继续提升自己的技能?

很多人学完开发板后都会卡在一个尴尬的阶段&#xff1a;觉得自己会的东西不少&#xff0c;但又不知道下一步该干啥。会点C语言&#xff0c;能烧录程序&#xff0c;能点亮LED&#xff0c;玩转按键&#xff0c;搞定串口等等&#xff0c;能用开发板做点小玩意儿&#xff0c;但面对…

olmOCR大模型:支持结构化精准提取复杂PDF文件内容

基于streamlit与olmOCR大模型实现的pdf提取工具 import os import json import subprocess import pandas as pd from pathlib import Path import shutil import time import re import streamlit as st# 创建工作目录 WORKSPACE_DIR "olmocr_workspace" os.maked…

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测&#xff01;五模型对比&#xff01;Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运…

druid开启防火墙之后的bug

bug以及解决方案 不允许执行多个语句不允许有注释部分数据有误识别&#xff0c;抛出异常&#xff0c;导致原本正常执行的语句被中断 解决方案 application.yaml中对于druid配置如下&#xff1a; wall:enabled: true # 开启防火墙config:multi-statement-allow: true # 允许多个…

SQLMesh 系列教程:Airbnb数据分析项目实战

在本文中&#xff0c;我们将探讨如何利用dbt项目的代码库来实现一个简单的SQLMesh项目。本文的基础是基于Udemy讲师为dbt课程创建的示例项目&#xff0c;可以在这个GitHub repo中获得。这个dbt项目是相对完整的示例&#xff0c;我们将使用它作为模板来演示SQLMesh&#xff08;下…

单片机写的小液晶屏驱动+汉字滚屏

单片机写的小液晶屏驱动汉字滚屏 stm32f401freertos内置HZK16 单片机汉字滚屏

【Golang那些事】go1.22和1.23 更新重点及测评

好久没有写文章了&#xff0c;攒了一年的Golang版本特性的技术点以及踩过的坑&#xff0c;那就在新年第一篇的文章中做一个总结吧&#xff1a; 一、关于迭代器 (一)迭代器去掉了共享共享内存 一个经典的面试题 说到Golang经典的面试题&#xff0c;大家可能都刷到过很多&…

python力扣438.找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s “cbaebabacd”, p “abc” 输出: [0,6] 解释: 起始索引等于 0 的子串是 “cba”, 它是"abc" 的异位词。 起始索引…

【大模型实战篇】使用GPTQ量化QwQ-32B微调后的推理模型

1. 量化背景 之所以做量化&#xff0c;就是希望在现有的硬件条件下&#xff0c;提升性能。量化能将模型权重从高精度&#xff08;如FP32&#xff09;转换为低精度&#xff08;如INT8/FP16&#xff09;&#xff0c;内存占用可减少50%~75%。低精度运算&#xff08;如INT8&#xf…

【MySQL】架构

MySQL架构 和其它数据库相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上&#xff0c;插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实…

JavaScript 金额运算精度丢失问题及解决方案

JavaScript 金额运算精度丢失问题及解决方案 1. 前言2. 为什么 JavaScript 计算金额会精度丢失&#xff1f;2.1 JavaScript 使用 IEEE 754 双精度浮点数2.2 浮点运算错误示例**错误示例 1&#xff1a;0.1 0.2 ≠ 0.3****错误示例 2&#xff1a;浮点乘法精度问题** 3. 解决方案…