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.pswp.cn/pingmian/72840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72840.shtml
英文地址,請注明出處:http://en.pswp.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. 解決方案…