tag 标签: 串口数据

相关帖子
相关博文
  • 热度 13
    2023-4-10 11:49
    2303 次阅读|
    1 个评论
    串口将接收到的数据,进行解析后,使用QT绘图,动态刷新显示。 先将项目文件中增加 charts 支持 QT += charts 在主窗口定义中增加 QT_CHARTS_USE_NAMESPACE 在 ui 中使用 graphic view 控件占用图形显示的位置,并将控件提升为 QChartView 控件。 Qchart 可以绘制折线、条形图或饼图。折线需要有 QLineSeries 容纳折线的坐标数据。 先定义私有成员 QLineSeries * LineSerial ; ,需要在构造函数中实例化。 chart = new QChart(); hide(); addSeries(LineSerial); //将线性序列加入到图 QValueAxis *xaxis = new QValueAxis(); //建立X,Y轴 QValueAxis *yaxis = new QValueAxis(); setRange(0,20); // 设定 数轴范围 setRange(0,10); addAxis(yaxis,Qt::AlignLeft); addAxis(xaxis,Qt::AlignBottom); attachAxis(xaxis); attachAxis(yaxis); setTitle("Simple line chart example"); //设定图的抬头 setChart(chart); // 将 图加入到chatview 这样就可以将折线图显示出来了。 使用串口数据动态刷新折线图 在串口接收的槽函数中,收到的数据是使用 readall() ,读到一个 QString 里面,但有可能只是零碎的数据片段。获得数据后,追加到先前接收到的数据后面,再进行处理。这里有一个专门的处理函数,在槽函数中调用。依据要求,传入数据段指针和需要处理的数据序列指针。使用 QString 中的各种方法,判断数据是不是完整的,找到数据头和尾。然后进行解析,将合法数据追加到数据序列里。 int bubfreqscanpharse(QString *p,QLineSeries *pls){ indexOf("@ 6.00 MHz"); int ret = 0; static int linecolor = 0; if(npos != -1){ right(2)=="\r\n"){ // QDebug() << "get tail"; split("@"); if(datlist.size()==42){ int i; float x,y; clear(); for(i=1;i<42;i++){ x = datlist .mid(1,4).toFloat(); y = datlist .mid(11,4).toFloat(); append(x,y); } setColor(QColor(qrand()%255,qrand()%255,qrand()%255)); ret = 1; } clear(); } } return ret; } 串口接收处理槽函数 void MainWindow::readData() { readAll(); // 串口收到的数据放到data中 append(data); // 追加data到接收缓冲区 setText(data); // 显示刚收到的数据 // 调用数据处理函数,并传入缓冲区数据和链接到图的数据序列指针 if(bubfreqscanpharse(buf,LineSerial) == 1){ createDefaultAxes(); } }
  • 热度 13
    2012-10-24 11:04
    4471 次阅读|
    0 个评论
     从泰克示波器里面看UART数据的时候  截下来一段传输几个字节的数据信号数据 改天把图和数据传上来了  再对着图分析 各个UART中的各个概念 文件弄回来了  原始的是CSV格式的  原文件   放在Dbank  数据银行上   这个是示波器一段的图   上面的数据( 原文件 )就是这段的 Y的坐标单位是 电压值 V    X的单位是 时间 S   都是几十uS的    从这个可以分析出来 是多大 波特率 的 UART的格式 可以通过程序设置   有些会在停止位之前有一个 奇偶校验 之类的   停止位 也不一定只是一个单位大小  可以设置为1、1.5、2等 中间的 数据位长度 也可以设置位 6 7 8 位等 还有 数据的传输顺序    我这个是LSB先出的  所以可以看出 第一个数据 01010101  反过来就是10101010 =0xAA   第二个10101010 反过来01010101  0x55 第三个11001011  反过来  11010011  0xD3 第三个 11010000  反过来 00001011  0x0B 对着示波器  分析一遍之后  没错就是这样的  就是传的这些   也就是  数据和实际传输的信号  很好的对应上了 这个信号 是TXD 与 GND 之间的电压信号     此时  RXD与GND之间  一直为高电平电压值 这就是  UART : Universal Asynchronous Receiver/Transmitter,通用异步接收/发送   异步  没有时钟   接受端得有相应的采样时钟  否则会乱的   对于 波特率 的问题  这份数据有记录时间(具体精确的时间要看 数据表 )  好像记得在通信里面有 码元 这个概念  这里就是1bit   波特率=1/(1bit的时长)   这份数据1bit的时长≈8.6*10^(-6)s  也就是8.6us  1/8.6us =116279.06976744Hz   也就是115200的波特率了  因为那个8.6us的时间是估计的    而常用的波特率有这么些:看图片吧 也就是1200 1800 2400 4800 7200 9600 14400 19200 38400  57600 115200 128000 还有一些 115200 原来以为速度还挺快的   用示波器看了之后  我再运行了一段代码  输出两个引脚信号 来看时间 发现当运行一段不短的代码之后串口才发完3、4个码元(不是byte哦)  天哪   算一算  如果发16byte的数据   总共16*10(1bit起始位+8bit数据位+1bit的结束位)=160个码元的时间  160*1/115200=0.0013888888888889  也就是1.38ms  有时候中断都不知道发生多少次了  肯定 这也是相对的      UART里面还有一个经常提到的 RS232    这是一种标准(协议 )  就像说市电一样的  就知道是220V   RS-232  就是把TTL(0~5V) 转换到10+V的电压   提要电压  可以增强抗干扰的能力    增加传输距离      一般用芯片来实现 MAX232  很典型  工作电压5V  输出有12V左右  和输出的负载有关吧   例如TTL的逻辑1  232对应的就是 负10几V  0对应的就是10+V   就是一个变换  变换后一般用9针的接口线  工程应用上就是这样的   用到3根线  2、3、5  收发地  
相关资源