DSView源码阅读笔记(持续更新中···)

2023-11-16

一、DSView源码阅读笔记

主线任务
将源码成功编译运行
提取示波器功能代码
添加示波器通道数量
找到接收数据部分源码
在win平台上使用qt开发环境进行代码重构
支线任务

以下笔记内容部分是猜测内容

DSView\

pv:

mainwindow.cpp:

​ void MainWindow::device_detach();//设备分离

​ void MainWindow::device_attach();//设备连接

​ void MainWindow::capture_state_changed(int state)//捕获状态改变

​ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev);//

sigsession.h:
storesession.cpp:

注释部分代码,运行测试,结果显示逻辑分析仪功能下的波形显示一条直线

将读取到的一段数据存储在一个缓冲区,显示界面再读取缓冲区数据,将其显示在界面上

session

libsigrok4DSL\

dsdevice.c:

​ SR_API int sr_dev_probe_name_set(const struct sr_dev_inst *sdi,

​ int probenum, const char *name); //设置指定设备探针的名字


​ SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum,

​ gboolean state); //启动或者关闭指定设备 的探针


SR_API int sr_dev_trigger_set(const struct sr_dev_inst *sdi, uint16_t probenum,

​ const char *trigger); //向指定的设备(和指定的探针)添加一个触发器,如 果 这个设备上指定的探针已经有一个触发器,它将静态地被替换


​ #ifdef HAVE_LIBUSB_1_0

​ SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,

​ uint8_t address, struct libusb_device_handle *hdl);

​ SR_PRIV void sr_usb_dev_inst_free(struct sr_usb_dev_inst *usb);


​ SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(const char *port,

​ const char *serialcomm);

​ SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial);

​ //这两个参数(pathname , serialcomm)都被复制到新分配的字符串中,并由sr_serial_dev_inst_free()自动释放。

hwdriver.c:(硬件驱动程序)
libsigrok.h:

​ 关于如何连接到设备的规范。结合SR_CONF_SERIALCOMM,这是一个串行端口对操作系统有意义的形式(例如,/dev/ttyS0)。


libsigrokdecode4DSL\

二、涉及的知识

串口通讯

读取串口数据并处理(C语言)

读取串口数据程序的编程逻辑示意图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOvTsvf1-1629789294072)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210823133253144.png)]

c程序

//main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "openDev.h"

int main()
{
    int fd;
    int nread;
    char buffer[MAX_BUFF_SIZE];

    serial_parse phandle;
    phandle.rxbuffsize = 0;

    char *dev_name = "/dev/ttyUSB0";//根据实际情况选择串口

    while(1) 
    {  
        fd = OpenDev(dev_name); //打开串口 

        if(fd>0)
        {
            set_speed(fd,9600); //设置波特率
            printf("set speed success!\n");
        }     
        else  
        { 
            printf("Can't Open Serial Port!\n"); 
            sleep(1);  //休眠1s
            continue; 
        } 
        break;
    }

    if(set_Parity(fd,8,1,'N')==FALSE) //设置校验位 
    {
        printf("Set Parity Error\n"); 
        exit(1);
    }
    else
    {
        printf("Set Parity Success!\n"); 
    }

    while(1) 
    { 
        usleep(10000);  //休眠1ms
        nread = read(fd , phandle.buff + phandle.rxbuffsize, MAX_BUFF_SIZE - phandle.rxbuffsize);
        phandle.rxbuffsize += nread;
        phandle.buff[phandle.rxbuffsize] = '\0';
		/*
		处理 phandle.buff
		*/
	}

	return 0;
}

//openDev.h
#ifndef OPENDEV_H
#define OPENDEV_H

#include <math.h>

#define TRUE 1
#define FALSE 0
#define MAX_BUFF_SIZE (256)

typedef struct _serial_parse
{
    char buff[MAX_BUFF_SIZE];
    int rxbuffsize;
}serial_parse;

int OpenDev(char *Dev);
void set_speed(int fd, int speed);
int set_Parity(int fd,int databits,int stopbits,int parity);

#endif


//openDev.c
#include <termios.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "openDev.h"

#define TRUE 1
#define FALSE 0
 
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
 
int OpenDev(char *Dev)
{
  int fd = open(Dev,O_RDWR | O_NOCTTY | O_NONBLOCK);
  if(-1 == fd)
    {
      perror("Can't Open Serial PPPPort");
      return -1;
    } 
  else 
    {
      printf("Open com success!\n");
      return fd;
    }
} 

void set_speed(int fd, int speed)
{ 
  int i; 
  int status; 
  struct termios Opt;
 tcgetattr(fd, &Opt); 
  for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
   { 
      if (speed == name_arr[i]) 
        { 
          tcflush(fd, TCIOFLUSH); 
          cfsetispeed(&Opt, speed_arr[i]);
         cfsetospeed(&Opt, speed_arr[i]);
         status = tcsetattr(fd, TCSANOW, &Opt); 
          if (status != 0) perror("tcsetattr fd1");
         return;
       } 
    tcflush(fd,TCIOFLUSH);
    }
}

int set_Parity(int fd,int databits,int stopbits,int parity) 
{ 
  struct termios options; 
  if ( tcgetattr( fd,&options) != 0) 
  {
   perror("SetupSerial 1");
   return(FALSE);
 } 
  bzero(&options,sizeof(options)); 
  options.c_cflag |= CLOCAL | CREAD;
 options.c_cflag &= ~CSIZE; 
  switch (databits) 
  { 
    case 7: 
    options.c_cflag |= CS7;
   break;
   case 8:
   options.c_cflag |= CS8;
   break; 
    default: fprintf(stderr,"Unsupported data size\n");
   return (FALSE); 
  } 
  switch (parity) 
  {
   case 'n': 
    case 'N':
   options.c_cflag &= ~PARENB;
   options.c_iflag &= ~INPCK; 
    break; 
    case 'o':
   case 'O': 
    options.c_cflag |= (PARODD | PARENB);
   options.c_iflag |= (INPCK | ISTRIP); 
    break; 
    case 'e': 
    case 'E': 
    options.c_cflag |= PARENB;
   options.c_cflag &= ~PARODD; 
    options.c_iflag |= (INPCK | ISTRIP); 
    break; 
    case 'S': 
    case 's': 
    options.c_cflag &= ~PARENB; 
    options.c_cflag &= ~CSTOPB;
   break;
   default: fprintf(stderr,"Unsupported parity\n"); 
   return (FALSE); 
  } 
  switch (stopbits)
 { 
    case 1:
   options.c_cflag &= ~CSTOPB; 
    break; 
    case 2: 
    options.c_cflag |= CSTOPB;
   break; 
    default: fprintf(stderr,"Unsupported stop bits\n"); 
    return (FALSE); 
    } 
    if (parity != 'n') 
    options.c_iflag |= INPCK; 
    options.c_cc[VTIME] = 0;
   options.c_cc[VMIN] = 0;
   tcflush(fd,TCIFLUSH); 
    if (tcsetattr(fd,TCSANOW,&options) != 0)
   {  
        perror("SetupSerial 3"); 
        return (FALSE);
   } 
    return (TRUE);
}

snapshoot快照

qt信号与槽函数

DSO数字存储示波器

两个重要参数:带宽采样率

Oscilloscopes

这个页面记录了配置键是编写控制示波器的libsigrok前端所需的各种其他信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pNzFEr5-1629789294074)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210816133721796.png)]

Frame-based

通常示波器的工作方式是触发被测信号或外部触发信号。然后,该设备测量尽可能多的它的内部缓冲区可以容纳。当缓冲区满时,设备停止测量并将其缓冲区发送到libsigrok驱动程序。这个传输代表了一帧数据的价值。驱动程序将这些数据转换为libsigrok内部模拟格式,然后像这样发送到前端:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nHe3fME-1629789294075)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210816133747346.png)]

示波器然后重新开始采集,有时是在驱动程序刺激之后。因此,从示波器接收到的数据不是连续的从一帧到下一帧:在这之间有一个周期,该设备不进行测量。

Streaming

有些设备可以作为连续流示波器,不涉及帧。值得注意的是,具有模拟前端的基于fx2的设备,如Nexus-Computing ossciprime,就是这样工作的。

Config keys

一个用于示波器的libsigrok驱动程序实现了以下配置键的全部或部分。

SR_CONF_OSCILLOSCOPE

表示一种可以充当示波器的设备,即随时间测量一个或多个模拟通道上的电压,并将这些测量值作为模拟值发送到前端。

SR_CONF_LIMIT_FRAMES

基于帧的示波器实现了这个关键帧集,即在SR_DF_FRAME_BEGIN和SR_DF_FRAME_END包之间要捕获和发送的帧数。

它只用于设置这个值;获取它只会返回先前设置的值。默认值为0,表示连续抓取帧,直到被告知停止。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNQ8jQB4-1629789294077)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210816134428465.png)]

SR_CONF_NUM_TIMEBASE

示波器在其水平(时间)轴上的分割数。这对应于设备显示的方格上的垂直线所标记的区域。即使在无头示波器上,这个概念仍然存在;例如,如果没有这个数字,SR_CONF_TIMEBASE设置就没有意义。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQh6PpV5-1629789294077)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210816134513938.png)]

SR_CONF_TIMEBASE

采集过程中单个水平(时间)分割采样的持续时间。分割的数量由SR_CONF_NUM_TIMEBASE返回,因此将这个数字乘以这个持续时间就得到了对单个帧的有效采样的度量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZ1s29Up-1629789294078)(C:\Users\jingwenwei\AppData\Roaming\Typora\typora-user-images\image-20210816134602330.png)]

告知停止。

[外链图片转存中…(img-hNQ8jQB4-1629789294077)]

SR_CONF_NUM_TIMEBASE

示波器在其水平(时间)轴上的分割数。这对应于设备显示的方格上的垂直线所标记的区域。即使在无头示波器上,这个概念仍然存在;例如,如果没有这个数字,SR_CONF_TIMEBASE设置就没有意义。

[外链图片转存中…(img-RQh6PpV5-1629789294077)]

SR_CONF_TIMEBASE

采集过程中单个水平(时间)分割采样的持续时间。分割的数量由SR_CONF_NUM_TIMEBASE返回,因此将这个数字乘以这个持续时间就得到了对单个帧的有效采样的度量。

[外链图片转存中…(img-hZ1s29Up-1629789294078)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DSView源码阅读笔记(持续更新中···) 的相关文章

  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 初识MySQL(一)

    目录 一 初识MySQL数据库 Database 1 1 为什么要有数据库 1 2 关于数据库的大体分类 二 数据库的操作 2 1 如何创建一个库 2 1 1 SQL方式 2 1 2 图形化界面方式 My SQL Workbench 2 2
  • python socket基于TCP/IP协议实现多人聊天室

    文章目录 前言 一 实现原理 二 queue队列 三 代码实现 四 需要注意的地方 五 总结 前言 所谓套接字 Socket 就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象 一个套接字就是网络上进程通信的一端 提供了应用层进程
  • Vue简单示例——weex跨平台解决方案

    简单介绍 Weex的出现主要解决了Web开发的应用频繁发布版本和多端研发两个问题 同时解决了前端语言性能差异和显示效果受限的问题 什么是weex Weex是使用流行的Web开发体验来开发高性能原生应用框架 使开发者可以用JS语言和前端开发经
  • H264/AVC-帧内预测

    I宏块使用帧内预测编码压缩数据 根据相邻宏块数据恢复当前宏块信息 值得注意的一点是 帧内预测所参考的相邻宏块数据是deblocking之前的像素值 因为上一宏块的deblocking依赖当前宏块像素值 但当前宏块数据还未重建 1 帧内预测类
  • Python 综合面试题(附参考答案)

    Python 综合面试题 第一部分 Python 基础 如何理解 python 中的深度拷贝和浅拷贝 浅拷贝旨在减少内存的占用 深拷贝可以在做数据的清洗 修改或者入库 的时候 对原数据进行复制一份 以防数据修改之后 找不到原数据 深浅拷 贝
  • PID算法与PID自整定算法

    本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed 用途 PID输出 说明 参数
  • 手撕代码:判断二进制串除以3的余数

    题目描述 给定一个长二进制串 求其除以3的余数 思路分析 这里涉及到状态机 由于除以三的余数只可能是0 1 2 所以状态机就有三个状态 现在逐个遍历二进制串 初始余数为0 当遇到1时 状态转到1 遇到0时状态仍为0 对于状态1 判断分别遇到
  • win8 java 32位_java8离线安装包32位 官方最新版

    java8电脑版安装包是一款全新的java编程软件 该软件有着良好的操作性 支持多语种编程 当然也包括中文编程 支持winxp win7 win8 win10等基本微软系统进行操作 全面升级现有Java编程模式 带来一项协同开发的JVM J
  • Opencv.js+Hbuilder快速打造一个图像处理App

    一 开发工具简介 1 Opencv js Opencv 是一个常见的图像处理库 通常使用C 和python去调这个库对图像 视频流进行处理 而js版的opencv可以进一步丰富前端对于图像的处理 目前opencv js版映入了与其他版本基本
  • 安信实验室教你如何实现Windows自动安装!

    用户接入硬件后 Windows 自动下载安装或更新厂商的驱动软件 特点 1 产品的驱动程序及软件已放入微软官方驱动程序库 全世界用户都可以很快捷和方便地自动安装厂商自定义的软件 驱动通过微软官方认证 最佳安全性保障和信用背书 应用软件可以自
  • adb shell dumpsys activity activities调用信息简析

    活动栈 通过执行上面命令 可以得到类似如下格式的信息 Stack 45 type standard mode fullscreen isSleeping false mBounds Rect 0 0 0 0 Stack 0 type hom
  • Python 重命名文件或目录(os.rename)

    文章目录 1 概述 2 语法 os rename 2 1 相对路径 2 2 绝对路径 3 扩展 3 1 os 模块详解 1 概述 mermaid svg 9u1Lg7aqBXqPfILR label font family trebuche
  • Python面试常见的30个问题及答案

    Python面试问题 问题1 Python的主要功能是什么 python特性如下 解释型 动态类型 面向对象 简洁明了 免费自由 有一个庞大的社区 Q 2 区分深层和浅层拷贝 深拷贝将对象复制到另一个对象中 这意味着如果您对对象的副本进行更
  • vue-resource的$http.jsonp方法例子

    div class box div
  • svn版本回退

    SVN版本回退 当一不小心把文件改错了或者误删除了文件并提交到了服务器 我们要取消这些修改的话 首先就是将这个文件还原到上一个修订的版本的内容 revert to this rebision 然后将这个文件重新提交 那么服务器上的这个文件就
  • 集成开发工具使用

    集成开发工具使用 Intellij IDEA介绍 下载 安装 IDEA开发Java项目 IDEA快捷键 IDEA常见配置和操作的学习 1 IDEA 1 1 IDEA概述 IDEA全称Intellij IDEA 是用于Java语言开发的集成环
  • Windows Server 2016-OU组织单位日常操作

    技术无所谓贵贱 既然曾经做过就总该是要留下点什么 毕竟做技术这些年给我们留下太多太多的成长经历 总有人问这些已经很皮毛了为什么还要写 其实没那么多花哨理由 就是想着做或者不做这一块总是要对过往做个简单归总 习惯已成自然 虽然因为种种原因频繁
  • 使用http动词篡改的认证旁路

    文章目录 一 漏洞描述 二 解决建议 三 解决方法 Springboot 配置文件增加配置 编写配置类 编写过滤器 提示 以下是本篇文章正文内容 下面案例可供参考 一 漏洞描述 可能会升级用户特权并通过 Web 应用程序获取管理许可权可能会
  • C++小坑:问号表达式的输出

    文章目录 发现问题 解决方案 发现问题 本来只是想写这样一个测试是否连接成功的判断 std cout lt lt Result gt lt lt Avaliable hey you got it hell suck it lt lt std
  • DSView源码阅读笔记(持续更新中···)

    一 DSView源码阅读笔记 主线任务 将源码成功编译运行 提取示波器功能代码 添加示波器通道数量 找到接收数据部分源码 在win平台上使用qt开发环境进行代码重构 支线任务 以下笔记内容部分是猜测内容 DSView pv mainwind