精华内容
下载资源
问答
  • 串口解析

    2019-11-19 11:32:25
    有大佬知道串口解析数据的嘛? void parse_serial(char *byte_buff, int byte_num) { for (int i = 0; i < byte_num; i++) { printf("%c", byte_buff[i]); } printf("\n"); } 这样打印一堆二...
  • GPS串口解析

    2012-04-23 21:24:46
    GPS串口解析
  • 海康SDK_串口解析工具合集海康SDK_串口解析工具合集海康SDK_串口解析工具合集
  • 电子-参考串口解析代码.zip,单片机/嵌入式STM32-F0/F1/F2
  • 基于16倍过采样的串口解析代码,有说明文档,发送说明文档,接收说明文档,和串口协议分析。发送和接收文档有对工程代码的逐句注释解释。
  • 串口解析程序,本程序用c#编写,涉及北斗部分通信应用协议的解析,其中协议为北斗协议为4.0通用版目前已经民用开放,大家可放心下载使用。
  • ROS:实现串口解析GPS协议,并发布到话题(以GPFPD为例) ROS:实现串口解析GPS协议,并发布到话题(以GPFPD为例) 积分不够私信我
  • android 修改gps串口解析

    热门讨论 2011-12-07 18:31:38
    neo 6串口数据 android 解析
  • 串口解析实验总结

    2021-04-01 14:05:55
    成果图:

    成果图:
    在这里插入图片描述
    关键语句:

    用来检测错误信息

    qDebug()<<my_serialPort_w->error()<<endl;
    
    
    

    解决粘包问题:

     requestData_w.append(my_serialPort_w->readAll());
        int totol_size_w = requestData_w.size();
        base_size_w = 14;
        if(totol_size_w<base_size_w)
        {
            qDebug()<<"消息太短"<<endl;
            return;
        }
        else
        {
    #if 1
            //收到数据后解析
              //  ui->lineEdit_PITCH->setText(requestData_w);
              //    ui->textEdit_gps->append(QString("时:%1, 分:%2, 经度:%3%4,纬度:%5%6").arg(gpsInfo.utc.hour).arg(gpsInfo.utc.sec).arg(gpsInfo.longitude).arg(gpsInfo.ewhemi).arg(gpsInfo.latitude).arg(gpsInfo.nshemi));
                Luopan_msg LPMSG;
    
                Luopan_msg_2 LPMSG_2;
                if(HEX_str_flag == 1)  //转换为HEX形式
                {
                    requestData_w =  requestData_w.toHex();
                }
                qDebug()<<"进入罗盘分析收到消息准备分析"<<endl;
                luopan_anlyse_2(&LPMSG_2,requestData_w);
                if(QString("1")==LPMSG_2.Pitch.pms)
                {
                    qDebug()<<"进入罗盘分析的继续分析啊啊啊啊啊啊啊啊"<<endl;
                    ui->lineEdit_PITCH->setText(QString("-%1.%2").arg(LPMSG_2.Pitch.integers).arg(LPMSG_2.Pitch.decimals));
                }
                else
                {
                    qDebug()<<"进入罗盘分析的继续分析22222222222"<<endl;
                    qDebug()<<"进入罗盘分析的继续分析22222222222"<<LPMSG_2.Pitch.integers<<endl;
                    ui->lineEdit_PITCH->setText(QString("%1.%2").arg(LPMSG_2.Pitch.integers).arg(LPMSG_2.Pitch.decimals));
                }
    
                if(QString("1")==LPMSG_2.Roll.pms)
                {
                    ui->lineEdit_ROLL->setText(QString("-%1.%2").arg(LPMSG_2.Roll.integers).arg(LPMSG_2.Roll.decimals));
                }
                else
                {
                    ui->lineEdit_ROLL->setText(QString("%1.%2").arg(LPMSG_2.Roll.integers).arg(LPMSG_2.Roll.decimals));
                }
                if(QString("1")==LPMSG_2.Heading.pms)
                {
                    ui->lineEdit_HEADING->setText(QString("-%1.%2").arg(LPMSG_2.Heading.integers).arg(LPMSG_2.Heading.decimals));
                }
                else
                {
                    ui->lineEdit_HEADING->setText(QString("%1.%2").arg(LPMSG_2.Heading.integers).arg(LPMSG_2.Heading.decimals));
                }
                //QByteArray LPMSG_BYTE_W;
    
    #endif
                //    qDebug()<<"收到的每帧包长度为:"<<totol_size_w<<endl;
                        if(HEX_str_flag == 1)  //转换为HEX形式
                        {
                            requestData_w =  requestData_w.toHex();
                        }
    
                if(requestData_w.length()!=0)//如果读取到有数据,就显示出来。
                {
                    qDebug()<<"收到的数据为"<<requestData_w<<endl;
                    //经测试收到的数据长短不一需要组包
                    ui->textEdit_luopan->moveCursor(QTextCursor::End);
                    ui->textEdit_luopan->insertPlainText(requestData_w);
    
                }
    
    
                requestData_w = requestData_w.right(totol_size_w-base_size_w);
                totol_size_w = requestData_w.size();
    //            showGpsInfo(meaMsg);
                //    ui->textEdit_read->append(requestData);
            }
    
    #endif
    
    
    
    ui->lineEdit_PITCH->setText(QString("-%1.%2").arg(LPMSG_2.Pitch.integers).arg(LPMSG_2.Pitch.decimals));
    

    私有函数:用来类内部访问
    通过重写定时器事件进行循环:
    分三步:

    1. virtual void timerEvent(QTimerEvent *event);
    2. 设置 this->id1 = this->startTimer(1000);
    3. if(this->id1==event->timerId())
      {
      qDebug()<<“asdfasdfasdfad”<<endl;
      }
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        virtual void timerEvent(QTimerEvent *event);
    
    
    private:
        Ui::Widget *ui;
        int id1;
    };
    #endif // WIDGET_H
    
    
    #include "widget.h"
    #include "ui_widget.h"
    #include<QDebug>
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        this->id1 = this->startTimer(1000);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::timerEvent(QTimerEvent *event)
    {
        if(this->id1==event->timerId())
        {
            qDebug()<<"asdfasdfasdfad"<<endl;
        }
    }
    
    
    

    qstring的函数使用

    extern void luopan_anlyse_2(Luopan_msg_2* msg,QByteArray buf)
    {
        //将qbytearry转为qstring方便通过mid提取内容
        QString temp = QString(buf);
        qDebug()<<"进入罗盘分析2"<<endl;
        if(temp.mid(6,2)==QString("84"))
        {
            qDebug()<<"进入罗盘分析888888888888888888888888888"<<endl;
            qDebug()<<"dddddddddddd"<<temp<<endl;
            qDebug()<<"rrrrrrrrrrrrrrrrrr"<<temp.mid(8,6).left(1)<<endl;
            msg->Pitch.pms = temp.mid(8,6).left(1);
            msg->Pitch.integers = temp.mid(8,6).mid(1,3);
            msg->Pitch.decimals = temp.mid(8,6).mid(4,5);
    
            msg->Roll.pms = temp.mid(14,6).left(1);
            msg->Roll.integers = temp.mid(14,6).mid(1,3);
            msg->Roll.decimals = temp.mid(14,6).mid(4,5);
    
            msg->Heading.pms = temp.mid(20,6).left(1);
            msg->Heading.integers = temp.mid(20,6).mid(1,3);
            msg->Heading.decimals = temp.mid(20,6).mid(4,5);
        }
    
    
    
    
    
    
    }
    
    
    展开全文
  • HLW8032串口通讯 程序解析代码,完整的提取电压、电流、功率、电能等参数
  • 解析串口通信数据格式DB-9 针连接头(从计算机连出的线的截面,公头)。\ 1 2 3 4 5 /\ 6 7 8 9 /RS-232 针脚的功能:(红色的线是常用的)数据:TXD (pin 3):串口数据输出RXD (pin 2):串口数据输入握手:RTS (pin 7)...

    解析串口通信数据格式

    DB-9 针连接头(从计算机连出的线的截面,公头)。

    \ 1 2 3 4 5 /

    \ 6 7 8 9 /

    RS-232 针脚的功能:(红色的线是常用的)

    数据:

    TXD (pin 3):串口数据输出

    RXD (pin 2):串口数据输入

    握手:

    RTS (pin 7):发送数据请求

    CTS (pin 8):清除发送

    DSR (pin 6):数据发送就绪

    DCD (pin 1):数据载波检测

    DTR (pin 4):数据终端就绪

    地线:

    GND (pin 5):地线

    其他

    RI (pin 9):铃声指示

    典型地,串口用于ASCII 码字符的传输。通信使用3 根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数

    据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,

    这些参数必须匹配:

    a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit 的个数。例如300 波特表示每秒钟发送300 个bit。当我们提到时钟周期时,我们就是指

    波特率例如如果协议需要4800 波特率,那么时钟是4800Hz 。这意味着串口通信在数据线上的采样率为4800Hz 。通常电话线的波特率为14400,28800 和36600。

    波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB 设备的通信。

    b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8 位的,标准的值是5、7 和8 位。如何设置取决于你想传送的

    信息。比如,标准的ASCII 码是0~127 (7 位)。扩展的ASCII 码是0~255 (8 位)。如果数据使用简单的文本(标准ASCII 码),那么每个数据包使用7 位

    数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

    c,停止位:用于表示单个包的最后一位。典型的值为1,1.5 和2 位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台

    设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程

    度越大,但是数据传输率同时也越慢。

    d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校

    验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是

    偶数个。如果是奇校验,校验位位1,这样就有3 个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道

    一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    本人实例波形分析:串口发送字符串“AT 回车 ”,16 位码为41540D 。示波器波形如下:

    41H)->TTL 电平(01)->RS232 电平(10)

    原始波形

    invert 之后的波形(由于RS232 使用的是负逻辑,要按常规逻辑分析,需要将电平0、1 调换,示波器有这个功能)

    稍后我来写具体数据结构分析。

    TTL 电平的起始位为0,终止位为1

    RS232 电平起始位为1,终止位为0 ;由TTL 到RS232 输出时需要电平转换,

    串口通信传输的数据格式实际上都是二进制,这也是计算机中处理数据的格式。

    一般说串口可以传输文本文件和二进制文件,归根到底都是二进制的数据。

    串口传输文本文件,实际上是传输该文本文件对应的ASCLL 码文件,ASCLL 码是十进制数,

    将该十进制数转换为十六进制(对应二

    进制数及0 、1 电平)然后传输。

    字节型文件传输本身就是二进制文件,本身就是二进制等0 、1 电平,不需要像文本文件那

    样进行数据转换,直接传输便可。

    举例:

    传输字节型文件0X55,对应二进制位0101 0101 就是一个字节,串口从低位开始1010 1010

    这样高低电平即可传输出去。

    文本文件

    展开全文
  • 功能:解析串口数据(此程序中以回车符作为解析对象,如需要解析其他字符可以自行参考修改),并将解析后的串口数据通过Wi-Fi透传。 测试过程:使用PC端串口助手软件,通过串口分别按照115200至1382400波特率(实际...
  • 原标题:串口基本原理详解有很多有过一定嵌入式开发工作经验的朋友在从事嵌入式开发的过程当中,主要在嵌入式软件,界面等方向做的研究较多,但经常也会用串口进行调试程序,只知道串口是用来传输数据用的。但串口...

    原标题:串口基本原理详解

    有很多有过一定嵌入式开发工作经验的朋友在从事嵌入式开发的过程当中,主要在嵌入式软件,界面等方向做的研究较多,但经常也会用串口进行调试程序,只知道串口是用来传输数据用的。但串口具体怎么用来传输数据却不太清楚,对串口的工作原理也是一知半解。接下来分享下串口具体是怎么用来传输数据的。

    串行通信的基本概念

    •在通信领域内,有两种数据通信方式:并行通信和串行通信

    •串行通信:

    •计算机与I/O设备之间数据传输的各位是按顺序依次进行传送,通常数据在一根数据线上或者一对差分线上传输。

    •并行通信:

    •计算机与I/O设备之间通过多条传输线交换数据,数据的各位同时传送。

    •串行速度慢,但是传输设备成本低,可利用现有的通信手段和通信设备进行远程通信。并行通信速度快,但是传输设备成本高,适合近距离数据传送。需要注意:一些差分串行通信总线(RS485,RS422,USB等)他们传输距离远,且抗干扰能力强,速度也比较快。

    1.1.1 数据的串行和并行通信方式

    串行通信好比是一列纵队,每个数据元素依次纵向排列。如图2-57所示,传输时一个比特一个比特的串行传输,每个时钟周期传输一个比特,这种传输方式相对比较简单,速度较慢,但是使用总线数较少,通常一根接收线,一根发送线即可实现串行通信。它的缺点是要增加额外的数据来控制一个数据帧的开始和结束。

    并行通信好比一排横队,齐头并进同时传输。这种通信方式每个时钟周期传输的数据量和其总线宽度成正比,但是实现较为复杂。UART通信采用的是串行方式进行通信的。

    图为串行数据通信与并行数据通信

    •串口的数据传输是以串行方式进行的。串口在数据通信中,一次只传输一个比特的数据。串行数据的传输速度用bps或波特率来描述。

    注意:

    码元:在数字通信中常常用时间间隔相同的符号来表示数字。这样的时间间隔内的信号称为码元,这个间隔称为码元长度

    比特率:是信息量传送速率单位,即每秒传输二进制代码位数。bit/s

    所谓差分传输,就是发送端在两条信号线上传输幅值相等相位相反的电信号,接收端对接受的两条线信号作减法运算,这样获得幅值翻倍的信号。

    串行通信涉及的常用术语

    •单工、半双工和全双工

    •单工(Simplex)

    o特点:仅能进行一个方向的数据传送

    •半双工(Half Duplex)

    o特点:数据可以在两个方向上进行传送,但是这种传送绝不能同时进行。[双向,但不同时]

    •全双工(Full Duplex)

    o特点:能够在两个方向同时进行数据传送

    •数据传输率

    •每秒传输的二进制位数,单位为bps(bit per second)也称比特率。

    •异步方式与同步方式

    •同步通信方式(Synchronous)所用的数据格式没有起始位、停止位,一次传送的字符个数可变。在传送前,先按照一定的格式将各种信息装配成一个包,该包包括供接收方识别用的同步字符一个或两个,其后紧跟着要传送的n个字符,再后就是校验字符。

    •异步方式(Asynchronous):也称“起止同步式”。

    奇偶校验位

    奇偶校验位 (Parity)是指偶数或者奇数或甚至对一个数字的性质。多被应用于计算机硬件的错误检测中。

    奇偶校验位是一个表示给定位数的二进制数中 1 的个数是奇数还是偶数的二进制数。奇偶校验位是最简单的错误检测码。奇偶校验位有两种类型:偶校验位与奇校验位。

    1.1.2 异步通信和同步通信

    图2-56同步信号与异步信号

    同步通信技术

    在发送数据信号的时候,会同时送出一根同步时钟信号,用来同步发送方和接收方的数据采样频率。如图2-56所示,同步通信时,信号线1是一根同步时钟信号线,以固定的频率进行电平的切换,其频率周期为t,在每个电平的上升沿之后进行对同步送出的数据信号线2进行采样(高电平代表1,低电平代表0),根据采样数据电平高低取得输出数据信息。如果双方没有同步时钟的话,那么接收方就不知道采样周期,也就不能正常的取得数据信息。

    图2-56同步信号与异步信号

    同步通信技术

    在发送数据信号的时候,会同时送出一根同步时钟信号,用来同步发送方和接收方的数据采样频率。如图2-56所示,同步通信时,信号线1是一根同步时钟信号线,以固定的频率进行电平的切换,其频率周期为t,在每个电平的上升沿之后进行对同步送出的数据信号线2进行采样(高电平代表1,低电平代表0),根据采样数据电平高低取得输出数据信息。如果双方没有同步时钟的话,那么接收方就不知道采样周期,也就不能正常的取得数据信息。

    异步通信技术

    在异步通信技术中,数据发送方和数据接收方没有同步时钟,只有数据信号线,只不过发送端和接收端会按照协商好的协议(固定频率)来进行数据采样。数据发送方以每秒钟57600bits的速度发送数据,接收方也以57600bits的速度去接收数据,这样就可以保证数据的有效和正确。通常异步通信中使用波特率(Baud-Rate)来规定双方传输速度,其单位为bps(bits per second每秒传输位数)。

    1.1.3 数据通信传输模式

    在数据通信过程中,发送方和接收方为了实现数据的正确发送和接收,通常会有一个状态寄存器来描述当前数据接收和发送状态,当发送方有数据发送时,会查看发送状态寄存器,看是否允许发送数据(如果上一次数据还没有发送完毕,不允许继续数据发送),在发送允许情况下再送出新数据。同样,接收端通过查看接收状态寄存器,确定是否有新数据到达,如果有数据到达,将去接收数据缓冲区读取数据。

    (1)轮询模式

    通过程序执行流,不停的检测状态寄存器的结果,如果当前可发送或接收,则发送或接收数据。其过程可以用下面伪代码来表示。

    轮询方式实现数据发送伪代码

    Send()

    {

    While(1)

    {

    if(发送状态 == 可发送) // 检查寄存器的值

    执行数据发送操作;

    }

    }

    轮询方式实现数据接收伪代码

    Receive()

    {

    While(1)

    {

    if(接收状态 == 有数据到达)

    执行数据接收操作;

    }

    }

    由程序可知,这种方式实现简单,但在进行数据接收和发送时都要进入循环检查状态寄存器的值,当没有数据到达或数据不可发送时,CPU会一直空转,其它程序又得不到CPU的执行权,很影响系统的效率。

    (2)中断模式

    中断方式是指,当数据到达或数据可发送时,产生中断,通知CPU去发送或接收数据,这种方式将通信硬件和CPU独立出来,通信硬件只有在发送或接收条件准备好之后中,才通知CPU去处理数据,在通信条件没有准备好的时候,CPU去处理其它程序,显然这种方式更合理,这种方式要求通信硬件要求比较高,需要支持产生中断信号。

    (3)DMA模式

    通常实现数据的转移或拷贝时,CPU将从源地址处复制数据到寄存器,然后将寄存器数据再写入目的地址处,该复制过程需要CPU来执行。FS4412支持DMA方式传输串口通信数据,DMA传输是指在CPU不干涉的情况下,DMA硬件自动实现数据的转移和复制,在DMA传输过程中,CPU几乎不用干涉,这样可以让CPU安心的去做自己的事情。虽然如此,但是DMA在传输数据过程中要占用总线,在大批数据传输时,系统总线会被DMA通道占用,也会影响系统的效率。

    1.1 UART串口

    通用异步接收器和发送器(Universal Asynchronous Receiver and Transmitter) 简称UART。通常是嵌入式设备中默认都会配置的通信接口。

    为什么使用串口?

    这是因为,很多嵌入式设备没有显示屏,无法获得嵌入式设备实时数据信息,通过UART串口和超级终端相连,打印嵌入式设备输出信息。并且在对嵌入式系统进行跟踪和调试时,UART串口是必要的通信手段。

    举例:

    比如:网络路由器,交换机等都要通过串口来进行配置。UART串口还是许多硬件数据输出的主要接口,如GPS接收器就是通过UART串口输出GPS接收数据的。

    fs4412的特点:

    1)4组收发通道,同时支持中断模式和DMA操作

    2)通道0,1,2及带红外3通道都支持64字节FIFO

    3)通道1和3支持高速操作模式

    4)支持握手模式的发送和接收

    1.1.4 UART控制器

    UART控制器,提供了三个独立的异步串行I/O端口,每个端口都可以在中断模式或DMA模式下工作,换而言之,UART可以生成中断或DMA请求用于CPU和UART之间的数据传输。UART串口挂接在APB总线上,APB总线最高可以达到50MHz工作频率,在使用APB时钟频率时可以达到最高115.2Kbps波特率的通信速度。如果UART串口接收外部设备提供UEXTCLK(外部时钟),UART可以在更高的速度下工作。每个UART串口在接收装置和发送装置里分别包含一个64Byte的FIFO缓冲区,用于缓存发送数据和接收数据。

    由于UART是串行异步通信方式,因此在UART通信过程中每次只能传输1位(bit),若干位组成一个数据帧(frame),帧是UART通信中最基本单元,它主要包含:开始位,数据位,校验位(如果开启了数据校验,要包含校验位),和停止位。

    UART在通信之前要在发送端和接收端约定好帧结构,也就是约定好传输数据帧格式。

    l 开始位:必须包含在数据帧中,表示一个帧的开始。

    l 数据位:可选5,6,7,8位,该位长度可由编程人员指定。

    l 校验位:如果在开启了数据校验时,该位必须指定。

    l 停止位:可选1,2位,该位长度可由编程人员指定。

    通信双方约定好帧格式后,指定同一波特率,以保证双方数据传输的同步。

    1.1.5 UART串口工作原理

    每个UART包含一个波特率产生器,发送器,接收器和一个控制单元,如下图所示:

    •下面列出Exynos4412 UART相关的控制寄存器,具体位含义见Exynos4412芯片手册

    •UART行控制器ULCONn

    •UART模式控制寄存器UCONn

    •UART FIFO控制寄存器UFCONn

    •UART MODEM控制寄存器UMCONn

    •发送寄存器UTXH和接收寄存器URXH

    •波特率分频寄存器UBRp2和UFRACVAL2

    •UART硬件结构

    •UART是以异步方式实现通信的,其采样速度由波特率决定,波特率产生器的工作频率可以由PCLK(外围设备频率),FCLK/n(CPU工作频率的分频),UEXTCLK(外部输入时钟)三个时钟作为输入频率,波特率设置寄存器是可编程的,用户可以设置其波特率决定发送和接收的频率。发送器和接收器包含了64Byte的FIFO和数据移位器。UART通信是面向字节流的,待发送数据写到FIFO之后,被拷贝到数据移位器(1字节大小)里,数据通过发送数据管脚TXDn发出。同样道理,接收数据通过RXDn管脚来接收数据(1字节大小)到接收移位器,然后将其拷贝到FIFO接收缓冲区里。

    •(1)数据发送

    •发送的数据帧可编程的,它的一个帧长度是用户指定的,它包括一个开始位,5~8个数据位,一个可选的奇偶校验位和1~2个停止位,数据帧格式可以通过设置ULCONn寄存器来设置。发送器也可以产生一个终止信号,它是由一个全部为0的数据帧组成。在当前发送数据被完全传输完以后,该模块发送一个终止信号。在终止信号发送后,它可以继续通过FIFO(FIFO)或发送保持寄存器(NON-FIFO)发送数据。

    •(2)数据接收

    •同样接收端的数据也是可编程的,接收器可以侦测到溢出错误奇偶校验错误,帧错误和终止条件,每个错误都可以设置一个错误标志。

    •l 溢出错误是指在旧数据被读取到之前,新数据覆盖了旧数据

    •l 奇偶校验错误是指接收器侦测到了接收数据校验结果失败,接收数据无效

    •l 帧错误是指接收到的数据没有一个有效的停止位,无法判定数据帧结束

    •l 终止条件是指RxDn接收到保持逻辑0状态持续长于一个数据帧的传输时间

    •(3)自动流控AFC(Auto Float Control)

    •硬件流控使用串行电缆控制线上的电压信号来控制数据的发送和接收。

    •串口通讯中的硬件流控有两种方式:DTR/DSR方式和RTS/CTS方式。

    •自动流控制可以看成是串口的开关,uart2不带有AFC功能

    •UART0和UART1支持有nRTS和nCTS的自动流控,UART2不支持流控。在AFC情况下,通信双方nRTS和nCTS管脚分别连接对方的nCTS和nRTS管脚。通过软件控制数据帧的发送和接收。

    •在开启AFC时,发送端接收发送前要判断nCTS信号状态,当接收到nCTS激活信号时,发送数据帧。该nCTS管脚连接对方nRTS管脚。接收端在准备接收数据帧前,其接收器FIFO有大于32个字节的空闲空间,nRTS管脚会发送激活信号,当其接收FIFO小于32个字节的空闲空间,nRTS必须置非激活状态。如图2-60所示。

    •RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

    •CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

    •此处有人将CTS翻译为发送允许。因为CTS是对方的RTS控制己方的CTS是否允许发送的功能。

    图2-60自动流控数据传输

    (4)波特率

    在UART中波特率发生器为发送器和接收器提供工作时钟。波特率发生器的时钟源可以选择FS4412的内部系统时钟(PCLK,FCLK/n)或UEXTCLK(外部时钟源),可以通过设置UCONn寄存器来设置波特率发生器的输入时钟源。通常我们选择使用PCLK作为UART工作时钟。

    UART控制器中没有对波特率进行设置的寄存器,而是通过设置一个除数因子,来决定其波特率。其计算公式如下:

    UART除数(UBRpn) = (int)(CLK/(buad rate * 16 )) - 1

    其中:UBRpn的取值范围应该为1~2^16-1。例如:波特率为115200bps,PCLK时钟为其工作频率,采用50MHz,UBRpn为:

    UBRpn = (int)(50M / (115200 x 16)) - 1 = 26

    在系统时钟未初始化时,PCLK = 12MHz,如果波特率采用57600bps,那么UBRpn为:

    UBRpn = (int)(12M / (57600 x 16)) - 1 = 12

    当使用外部时钟源时,如果外部时钟小于PCLK时钟,则UEXTCLK应该设置为0。

    .比特率

    在数字信道中,比特率是数字信号的传输速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数bit/s(bps)、每秒千比特数(Kbps)或每秒兆比特数(Mbps)来表示(此处K和M分别为1000和1000000,而不是涉及计算机存储器容量时的1024和1048576)。

    .波特率

    波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,其单位为波特(Baud)。 波特率与比特率的关系为:比特率=波特率X单个调制状态对应的二进制位数。

    如何区分两者?

    显然,两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。

    图2-61 开发板串口硬件图

    UART的接口

    图2-61为Cortex-A9开发板引出UART串口接线图,它采用DB9接口公头(有接线柱的端口,只有接线孔的为母头),其有9根信号线,UART通信过程中用到了信号线2 RSTXD0(数据发送管脚)它和串口线母头TXDx信号线相接(x代表0号,1号,2号串口),信号3 RSRXD0(数据接收管脚)和串口线母头RXDx相接(x代表0号,1号,2号串口),信号线5(接地管脚),信号线7 RSCTS0(数据发送流控制管脚)和串口线母头nCTSx相接,信号线8 RSRTS0(数据接收流控制管脚)和串口线母头nRTSx相接。如果UART中没有开启AFC流控的话,只要用到信号线2,信号线3和信号线5。

    UART寄存器配置

    UART0串行控制寄存器(ULCON0)

    寄存器名地址是否读写描述复位默认值

    ULCON00x50000000R/W串口0串行控制寄存器0x00

    ULCON0位描述初始值

    保留[7]0

    红外模式[6]选择串口0是否使用红外模式:

    0 = 正常通信模式

    1 = 红外通信模式0

    校验模式[5:3]设置串口0在数据接收和发送时采用的校验方式:

    0xx = 无校验

    100 = 奇校验

    101 = 偶校验

    110 = 强制校验/检测是否为1

    111 = 强制校验/检测是否为0000

    停止位[2]设置串口0停止位数:

    0 = 每个数据帧一个停止位

    1 = 每个数据帧二个停止位0

    数据位[1:0]设置串口0数据位数:

    00 = 5个数据位 01 = 6个数据位

    10 = 7个数据位 11 = 8个数据位00

    通过设置ULCON0来设置UART0通信方式,ULCON0[6]选择通信方式为一般通信模式或红外通信模式,ULCON0[5:3]设置串口0校验方式,ULCON0[2]设置串口0停止位数,ULCON0[1:0] 设置串口0的数据位数。

    我们选择一般通信模式,无校验位,1个停止位,8个数据位的数据通信方式。因此:

    ULCON0 = 0x03;

    表2-26 UART0串口控制寄存器(UCON0)

    寄存器名地址是否读写描述复位默认值

    UCON00x50000004R/W串口0控制寄存器0x00

    UART0串行控制寄存器(ULCON0)

    寄存器名地址是否读写描述复位默认值

    ULCON00x50000000R/W串口0串行控制寄存器0x00

    ULCON0位描述初始值

    保留[7]0

    红外模式[6]选择串口0是否使用红外模式:

    0 = 正常通信模式

    1 = 红外通信模式0

    校验模式[5:3]设置串口0在数据接收和发送时采用的校验方式:

    0xx = 无校验

    100 = 奇校验

    101 = 偶校验

    110 = 强制校验/检测是否为1

    111 = 强制校验/检测是否为0000

    停止位[2]设置串口0停止位数:

    0 = 每个数据帧一个停止位

    1 = 每个数据帧二个停止位0

    数据位[1:0]设置串口0数据位数:

    00 = 5个数据位 01 = 6个数据位

    10 = 7个数据位 11 = 8个数据位00

    通过设置ULCON0来设置UART0通信方式,ULCON0[6]选择通信方式为一般通信模式或红外通信模式,ULCON0[5:3]设置串口0校验方式,ULCON0[2]设置串口0停止位数,ULCON0[1:0] 设置串口0的数据位数。

    我们选择一般通信模式,无校验位,1个停止位,8个数据位的数据通信方式。因此:

    ULCON0 = 0x03;

    表2-26 UART0串口控制寄存器(UCON0)

    寄存器名地址是否读写描述复位默认值

    UCON00x50000004R/W串口0控制寄存器0x00

    UCON0位描述初始值

    FCLK分频因子[15:12]当UART0选择FCLK作为时钟源时,设置其FCLK的分频因子

    UART0 工作时钟频率 = FCLK/FCLK分频因子 + 60000

    UART时钟源选择[11:10]选择UART0的工作时钟PCLK,UEXTCLK,FCLK/n:

    00,10 = PCLK

    01 = UEXTCLK

    11 = FCLK/n

    当选择FCLK/n作为UART0工作时钟时还要做其它设置,具体请读者自行查看硬件手册00

    发送数据中断

    产生类型[9]设置UART0中断请求类型,在非FIFO传输模式下,一旦发送数据缓冲区为空,立即产生中断信号,在FIFO传输模式下达到发送数据触发条件时立即产生中断信号:

    0 = 脉冲触发

    1 = 电平触发0

    接收数据中断

    产生类型[8]设置UART0中断请求类型,在非FIFO传输模式下,一旦接收到数据,立即产生中断信号,在FIFO传输模式下达到接收数据触发条件时立即产生中断信号:

    0 = 脉冲触发

    1 = 电平触发0

    接收数据超时[7]设置当接收数据时,如果数据超时,是否产生接收中断:

    0 = 不开启超时中断 1 = 开启超时中断

    10 = 7个数据位 11 = 8个数据位0

    接收数据错误中断[6]设置当接收数据时,如果产生异常,如传输中止,帧错误,校验错误时,是否产生接收状态中断信号:

    0 = 不产生错误状态中断 1 = 产生错误状态中断0

    回送模式[5]设置该位时UART会进入回送模式,该模式仅用于测试

    0 = 正常模式 1 = 回送模式0

    发送终止信号[4]设置该位时,UART会发送一个帧长度的终止信号,发送完毕后,该位自动恢复为0

    0 = 正常传输 1 = 发送终止信号0

    发送模式[3:2]设置采用哪个方式执行数据写入发送缓冲区

    00 = 无效

    01 = 中断请求或查询模式

    10 = DMA0请求00

    接收模式[1:0]设置采用哪个方式执行数据写入接收缓冲区

    00 = 无效

    01 = 中断请求或查询模式

    10 = DMA0请求00

    通常UART串口采用PCLK作为输入工作时钟,采用简单的轮询方式进行数据接收和发送,不开启数据接收超时,数据产生错误时不产生错误状态中断,因此:

    UCON0 = 0x05;

    表2-27 UART FIFO控制寄存器(UFCON0)

    寄存器名地址是否读写描述复位默认值

    UFCON00x50000008R/W串口0 FIFO控制寄存器0x00

    UFCON0位描述初始值

    发送数据

    触发级别[7:6]设置FIFO发送模式的触发级别:

    00 = FIFO为空触发 01 = 16字节触发

    10 = 32字节触发 11 = 48字节触发00

    接收数据

    触发级别[5:4]设置FIFO接收模式的触发级别:

    00 = FIFO为空触发 01 = 16字节触发

    10 = 32字节触发 11 = 48字节触发00

    保留[3]0

    发送FIFO重置[2]在重置FIFO后自动清除发送缓冲区

    0 = 正常模式 1 = 自动清除0

    接收FIFO重置[1]在重置FIFO后自动清除接收缓冲区

    0 = 正常模式 1 = 自动清除0

    启用FIFO[0]0 = 不启用FIFO 1 = 启用FIFO0

    表2-28 UART MODEM控制寄存器(UMCON0)

    寄存器名地址是否读写描述复位默认值

    UMCON00x5000000CR/W串口0 MODEM控制寄存器0x00

    UMCON0位描述初始值

    保留[7:5]必须全部置0000

    AFC自动流控[4]0 = 不开启流控 1 = 开启流控0

    保留[3:1]必须全部置0000

    请求发送[0]如果启用AFC,该位无效,S3C2440会自动控 制nRTS,如果不启用AFC,nRTS必须由软件控制

    0 = 高电平激活nRTS 1 = 低电平激活nRTS0

    表2-29 UART 发送/接收状态寄存器(UTRSTAT0)

    寄存器名地址是否读写描述复位默认值

    UTRSTAT00x50000010R/W串口0发送/接收状态寄存器0x06

    UTRSTAT0位描述初始值

    发送器为空[2]当发送缓存寄存器中没有数据要发送且发送移位寄存器为空时,自动置1

    0 = 非空

    1 = 发送器为空(发送缓存和移位寄存器)1

    发送缓存寄存器为空[1]当发送缓存寄存器为空时,自动置1

    0 = 发送缓存寄存器非空

    1 = 发送缓存寄存器为空1

    接收缓存寄存器为空[0]当接收缓存寄存器有数据到达时,自动置1

    0 = 接收缓存寄存器为空

    1 = 缓存寄存器接收数据0

    表2-30 UART 发送缓存寄存器(UTXH0)

    寄存器名地址是否读写描述复位默认值

    UTXH00x50000020(L)

    0x50000023(B)W串口0发送缓存寄存器-

    表2-31 UART 接收缓存寄存器(URXH0)

    寄存器名地址是否读写描述复位默认值

    URXH00x50000024(L)

    0x50000027(B)R串口0接收缓存寄存器-

    表2-32 UART 波特率除数寄存器(UBRp0)

    寄存器名地址是否读写描述复位默认值

    UBRp00x50000028R/W串口0波特率除数寄存器-

    UBRp0位描述初始值

    波特率除数[15:0]设置波特率除数(大于0)使用外部输入时钟时可以置0-

    上述寄存器是是和UART通信相关寄存器,使用简单的无FIFO,无自动流控AFC时,设置如下:

    UFCON0 = 0x00; // 不使用FIFO

    UMCON0 = 0x00; // 不使用流控

    UBRp0 = 26; // 波特率为115200,PCLK=50Mhz

    UBRp0 = 53; // 波特率为57600,PCLK=50Mhz

    UBRp0 = 12; // 波特率为57600,PCLK=12Mhz

    UTXH0和URXH0分别是数据发送和接收寄存器,发送数据时通过轮询方式判断发送状态寄存器的状态,当可以发送数据时,执行UTXH0寄存器写入操作,接收数据时,以轮询方式检测接收状态寄存器状态,当有数据到达时,读取URXH0寄存器里的数据即可取得串口数据。

    可能不同的开发板,不同厂家生产设计的开发板有所不同,里面的寄存器的配置也会略有区别,原理是一样的。

    11月13日,嵌入式开发就业班

    11月13日,Android开发就业班

    11月13日,HTML5高端就业班

    11月13日,JavaEE精英就业班

    责任编辑:

    展开全文
  • 实际项目中使用的读串口程序,简单实用
  • 无线龙串口解析

    2014-10-21 15:19:31
    头 命令头x3 物理地址x8 网络地址x2 数据缓冲x16 CRC 帧尾 串口读操作: 头:固定0x26(&),帧尾:固定...命令头:已知:54 43 4B 串口开启  4A 4F 4E(JON)节点加入  

    命令头x3

    物理地址x8

    网络地址x2

    数据缓冲x16

    CRC

    帧尾

    串口读操作:

    头:固定0x26(&),帧尾:固定为2A(*),CRC为校验位

    命令头:已知:54 43 4B 串口开启

                            4A 4F 4E(JON)节点加入

                                41 49 4E   (AIN)红外

                                41 53 48(ASH)震动

                                41 48 55 (AHU)温湿度

                               41 41 53 (AAS) 光敏温度

    具体命令解析:

    需知:数据上传分为自动上传和手动查询,即使同一种数据,不同上传方式命令头不一样

    1、  节点加入命令:

    头,物理地址,网络地址无需再说,命令头为4A 4F 4E。数据为52 4F 55(ROU) 若干 FF SensorNum 78 78。其中SensorNum占1字节,表示传感器类型,具体内容如下:

    SensorNum:3 :高精度温湿度

                         4:温度,光照,蜂鸣器

                         6:继电器

                         7:雨滴传感器

                         8:红外传感器

                         9:震动传感器

                         11:可燃气体传感器

                         17:高亮LED

    2、  自动上传数据:

    自动上传数据的命令头都以41(A)开头,后两位表示传感器类型,如49 4E(IN)表示红外,53 48(SH)表示震动,48 55(HU)表示高精度温湿度,AS表示光照和温度。(待补充)

    1)  高精度温湿度

    其缓冲数据内容为 A L 温度信息(2字节)湿度信息(2字节)后面各位无所谓

    温度信息的换算方法为:

    将温度信息转化为无符号整数a

    温度=a*0.01-39.6

    湿度信息换算方法为:

    将湿度信息转化为无符号整数b

    湿度=b*0.0405-4-b*b*0.000001*2.8

    以上公式底层就是这么写的,照搬

    2)  温度光照信息:

    温度的缓冲数据内容为:

      W D 温度信息(2字节)后面各位无所谓

    光照的缓冲数据内容为:

    G M光照信息(2字节) 后面各位无所谓

    以上2种数据的转换方式为:

    转换为字符串读取:例如 3139 就是表示19

    3)  震动,红外无需缓冲数据内容


    3、  手动查询:

    命令头同串口写入操作,只是后面加了数据,数据转化同自动上传


    4、  其他:

    1)  例行回复,当串口写操作的命令执行成功后都会返回一条回复,命令头和发送时一样,缓冲数据内容为 O K 3 其余各位无所谓。

     

     

     

    串口写操作:

    头,物理地址,网络地址,尾帧,校验位无所谓(底层不检验)

    命令头:


    第一位:52(R)读 

           二三位:

    1)41 53(AS)读光敏温度传感器

    根据缓冲数据0,1位判读读取何种数据:

    57 44(WD)温度  G M光敏

    2)48 55(HU)高精度温湿度

    根据缓冲数据0,1位判读读取何种数据:

    57 44(WD)温度  53 44(SD)湿度

                         3)RA读雨滴传感(没用)

                         4)GA读可燃气体(没用)

                         5)NS读取连接状态


    第一位:54(T)测试

           二三位:

                         LD led测试(未使用)

                         BL 测试电压(未使用)

                         BE 测试蜂鸣器(1响0不响)

                         RE 测试继电器(未使用)

                  LL 控制高亮led(FF为关闭,96为正常亮度,00为最高亮度,FA为最低亮度)


    第一位:53(S)设置

          二三位:

    AS 设置光敏温度传感器:缓冲数据内容:0,1位 GM表示光敏, 2位表示自动上传功能(1自动,0手动),3,4 位表示时间间隔(直接转化为整型),5位表示灯光开启门限;0,1位WD表示温度,2,3,4位同上。

    48 55(HU) 高精度传感器:缓冲数据内容:0位表示自动上传,1,2位表示上传间隔。

                         RA 雨滴自动上传(未使用)

                         GA 可燃气体自动上传(未使用)

     

    展开全文
  • 利用串口解析AIS接收机数据

    千次阅读 2019-08-19 15:09:49
    串口: 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就...
  • modem串口解析

    千次阅读 2010-05-03 21:27:00
    MODEM 是用户接入互联网的重要设备。虽然网络干线上已经普及宽带光纤传输,但是在拥有庞大用户群的最后一公里路段上,目前最现实的接入方式还是铜线... MODEM的对外接口是串口,这个串行I/O口用于传输控制信号、状态
  • 通用异步串行通讯(UART,以下简称:串口通讯),是一般嵌入式工程控制系统中使用非常普遍的一种通讯方式,又主要是以TTL电平、RS232、RS485或RS422总线方式为最多。所以,一般从事工控行业的IT工程师,需撑握串口通讯...
  • 嵌入式系统中串口通信帧的同步方法21ic引言串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位...
  • 【单片机】MAX232芯片解析以及RS-232串口解析

    万次阅读 多人点赞 2018-09-11 19:43:24
    如果电脑没有rs232口 只有USB口 可以用串口转接线转出串口 如图: 这个时候在电脑上位机上需要安装驱动程序 注意 这个驱动程序驱动的是PL2303芯片(在上图的大头里面) 使得RS232信息转换成usb信息 下图...
  • 嵌入式dio 读取主板模拟量 数字量 输出口控制
  • 在做嵌入式系统时,经常需要通过串口将数据传送给PC机,为了保证数据的正确性,往往需要进行校验,在传送一个字节的时候可以进行奇偶校验,传送一组数据的时候可以采用CRC校验等,但是在发送一组数据的时候采用CRC...
  • 在做嵌入式系统通信时往往会用到串口,包括嵌入式系统将数据传输给PC,或者是嵌入式系统之间进行数据传输,这时候就会遇到发送数据的问题。我们知道单片机通过串口发送数据时往往是一次一个字节(8位),如果传输char...
  • 1.串口配置 ROS串口编程学习笔记:https://blog.csdn.net/u014695839/article/details/81209082
  • 往往我们协议多的情况下,还会包含数据编号,给来的数据进行 //编号,协议优化后就是: 头+编号+长度+数据+校验 //协议解析> //////////////////////////////////////////////////////////////////////////////////...
  • 我们的串口程序,除了通用的,进行串口监听收发的简单工具,大多都和下位机有关,这就需要关心我们的通讯协议如何缓存,分析,以及通知界面。我们先说一下通讯协议。通讯协议就是通讯双方共同遵循的一套规则,定义...
  • 串口输出的类型主要分为单字节 字符串和二进制数据流,它们的控制输出函数各不相同。Windows系统里面,每行结尾是“”,即“\r\n”#define CR 0x0d // 回车13='\r'#define LF 0x0a// 换行newline =10='\n'#define ...
  • 原来处理:仿真时if语句一直为假 修改后:判断正常
  • 基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,439
精华内容 975
关键字:

串口解析