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

ops/2025/3/28 5:59:49/

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.ppmy.cn/ops/167545.html

相关文章

无需编程!快速实现WinCC远程监控与报警

2. 无需编程&#xff01;快速实现WinCC远程监控与报警 痛点分析&#xff1a;企业缺乏专业编程人员&#xff0c;难以开发复杂监控系统。 解决方案&#xff1a;利用OPC560的即插即用功能&#xff0c;3步完成配置。 技术步骤&#xff1a; 连接OPC560至WinCC电脑&#xff1b; 通…

蓝桥杯 之 拔河(2024年C/C++ B组 H题)

文章目录 本题是 2024年C/C B组的H题首先看这个数据范围&#xff0c;个数也就在10^3,并且考察的还是连续区间的和的最小差值位置&#xff0c;注意的是这个区间是不能重合的 连续区间和的问题&#xff0c;考虑用到这个前缀和由于考察的是左右两个区间&#xff0c;并且还不能重合…

反反爬虫技术指南:原理、策略与合规实践

有很多人私下咨询爬虫技术&#xff0c;关于基础的爬虫技术我不打算介绍&#xff0c;因为网上有很多&#xff0c;CSDN都有非常多的介绍&#xff0c;就自行搜索。而今天要介绍主要是反-反-爬虫的技术指导与介绍。 引言 在如今的自媒体爆发时代&#xff0c;网络爬虫作为数据采集的…

防逆流检测仪表在分布式光伏发电系统中的应用

销售工程师 王孟春 13524471462 引言 目前&#xff0c;电网公司通常要求光伏并网系统为不可逆流发电系统&#xff0c;即光伏并网系统所发的电由本地负荷消耗&#xff0c;多余的电不允许通过低压配电变压器向上级电网逆向送电。在并网发电系统中&#xff0c;由于外部环境是不断…

安科瑞EMS:赋能双碳智慧园区建设,引领绿色未来

在全球气候变化加剧的背景下&#xff0c;中国提出"双碳"目标&#xff0c;彰显了大国担当。工业园区作为能源消耗和碳排放的主要载体&#xff0c;其绿色转型对实现双碳目标具有决定性意义。安科瑞电气股份有限公司推出的EMS能源管理系统&#xff0c;为工业园区提供了一…

EasyRTC嵌入式音视频通话SDK:微信生态支持、轻量化架构与跨平台兼容性(Linix/Windows/ARM/Android/iOS/LiteOS)

随着WebRTC技术的不断发展&#xff0c;实时音视频通信在各个领域的应用越来越广泛。EasyRTC嵌入式音视频通话SDK作为一款基于WebRTC技术的实时通信解决方案&#xff0c;凭借其强大的功能和灵活的集成能力&#xff0c;受到了越来越多开发者的关注。 一、系统架构设计 纯C语言开…

android源码应用预制

以下是详细的 Android 源码应用预制教程&#xff0c;从环境搭建到应用集成的完整流程&#xff1a; 1. 环境准备 (1) 下载 AOSP 源码 # 安装依赖&#xff08;Ubuntu 示例&#xff09; sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gc…

示波器直流耦合和交流耦合的区别

示波器的直流耦合和交流耦合是两种常见的耦合方式&#xff0c;用于选择输入信号的传输方式。它们的主要区别在于传输信号中是否包含直流分量。 1. 直流耦合&#xff08;DC Coupling&#xff09;&#xff1a;在直流耦合模式下&#xff0c;示波器会将输入信号的所有频率分量&…