精华内容
下载资源
问答
  • 串口通信是什么
    千次阅读
    2021-07-22 00:17:42

    串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

    串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

    串口通信(Serial CommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;

    而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

    串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

    串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

    串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

    a4fc0f022c38426775b5fe52796224ed.png

    串口通信的用途

    串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

    串口通信程序框图串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

    串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

    更多相关内容
  • 一篇短文让你彻底理解什么是串口通信

    万次阅读 多人点赞 2021-06-12 10:30:24
    1 并行与串行通信 机器的通信方式有两种,分别是并行通信与串行通信。 并行通信:并行通信是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会...

    1 并行与串行通信

    机器的通信方式有两种,分别是并行通信与串行通信。

    并行通信:并行通信是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。

    串行通信:串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。

    拿汽车通道来说,并行通信就是多车道,多辆车一起行驶,而串行通信就是单车道,只能一辆一辆车通过。

    以下是两者之间特性的对比:

    2 异步与同步串行通信

    串行通信有两种,分别是异步串行通信与同步串行通信。

    异步串行通信:异步串行通信是指通信双方以一个字符(包括特定附加位)作为数据传输单位且发送方传送字符的间隔时间不一定,具有不规则数据段传送特性的串行数据传输。

    同步串行通信:同步串行通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。

    两种串行通信不同就只有时间,在发送字符时,异步可以是不同时间间隔发送,但同步只能以固定的时间间隔发送。

    3 单工、半双工与全双工串行通信

    串行通信制式有单工串行通信,半双工串行通信,全双工串行通信三种。

    单工串行通信:单工串行通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。

    半双工串行通信:半双工串行数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据,这些数据来自数据刚刚传输的方向。像全双工传输一样,半双工包含一个双向线路(线路可以在两个方向上传递数据)。

    全双工串行通信:全双工串行通信是指在同一时刻信息可以进行双向传输,和打电话一样,说的同时也能听,边说边听。这种发射机和接收机分别在两个不同的频率上(两个频率差有一定要求)能同时进行工作的双工机也称为异频双工机。

    三种通信制式很容易理解,对照上图看,单工串行通信不就是单方面通信,只能发出指令或接收指令。半双工串行通信就是能接收又能发送,但是不能同时进行。全双工串行通信就最厉害,可以同时发送和接收指令。

    4 比特率与波特率

    衡量通讯性能的一个非常重要的参数就是通讯速率,通常以比特率(Bitrate) 来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s)

    容易与比特率混淆的概念是 “波特率”(Baudrate),它表示每秒钟传输了多少个码元。而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元

    如常见的通讯传输中,用0V 表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0 和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通讯传输中,有0V、2V、4V 以及6V 分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。

    因为很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率,虽然严格来说没什么错误,但希望我们还是了解它们的区别。

    5 TTL与RS-232电平标准

    根据通讯使用的电平标准不同,串口通讯可分为TTL 标准及RS-232 标准,电平标准如下表:

    可见RS-232使用负逻辑电平,规定(-3V ~ -25V)为逻辑“1”,规定(+3V ~ +25V)为逻辑“0”,(-3V ~ +3V)是未定义的过渡区。

    我们知道常见的电子电路中常使用TTL 的电平标准,理想状态下,使用5V 表示二进制逻辑“1”,使用0V 表示逻辑“0”;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V 表示逻辑“1”,+15V 表示逻辑“0”。

    6 RS-232信号线与DB9接口

    在最初的应用中,RS-232 串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”)之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。

    在旧式的台式计算机中一般会有RS-232 标准的COM口(也称DB9 接口)。

    我们看到接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232 标准调制的。

    对于调制解调方面的内容,有兴趣可以查找高频电子线路与通信方面的相关资料,这里不再赘述。

    DB9 接口中的公头及母头的各个引脚的标准信号线接法:

    每个口的具体作用如下表:

    上表中的是计算机端的DB9 公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9 母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用“直通型”的串口线连接起来即可。

    串口线中的RTS、CTS、DSR、DTR 及DCD 信号,使用逻辑 “1” 表示信号有效,逻辑“0”表示信号无效。例如,当计算机端控制DTR 信号线表示为逻辑“1” 时,它是为了告知远端的调制调解器,本机已准备好接收数据,“0” 则表示还没准备就绪。

    在目前的其它工业控制使用的串口通信中,一般只使用RXD、TXD 以及GND 三条信号线,直接传输数据信号,而RTS、CTS、DSR、DTR 及DCD 信号都被裁剪掉了,这主要是考虑到近程通信与远程通信问题。

    7 数据包

    串口通讯的数据包由发送设备通过自身的TXD 接口传输到接收设备的RXD 接口。在串口通讯协议中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。

    在串行异步通讯中,由于没有时钟信号(如前面讲解的DB9
    接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,上图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200 等。

    串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑“0” 的数据位表示,而数据包的停止信号可由0.5、1、1.5 或2 个逻辑“1” 的数据位表示,只要双方约定一致即可。

    在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7 或8 位长。

    在串行通讯所发送数据的最后一位,用来粗略的检验数据在传输过程中是否有出错。校验一般有以下几种:

    • 奇校验:让主体数据加上校验位中的“1”的个数保持为奇数。
    • 偶校验:让主体数据加上校验位中的“1”的个数保持为偶数。
    • 0 校验:无论主体数据是什么,校验位保持为0。
    • 1 校验:无论主体数据是什么,校验位保持为1。
    展开全文
  • 51单片机串口通信模拟实验,串口通信入门。
  • QNX下的串口通信,在实际的机器上测试了一下,发现可以连续的发送数据。
  • 在excel中加入串口通讯,可接收串口发来的数据,一行行显示,还有时间间隔显示
  • 实现无线串口通讯串口通信(Serial Communication), 是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其...
  • unity串口通信的源代码,可以直接导入unity中使用
  • 文件包含了STM32F429开发板中一些串口通讯的案例与试验。
  • 一文搞懂串口通信

    千次阅读 2021-05-19 15:22:13
    一直没明白它是什么意思,应用在什么场景,有什么特点和优点。近来又在某个文档中看到“电脑上至少配置两个RS232串口,一个RJ-45网口”,我实在拖不了了,今天一定要把它搞清楚。 研究之前我先是在网上搜了一些Qt和...

    很久之前就听说“串口”这个词。一直没明白它是什么意思,应用在什么场景,有什么特点和优点。近来又在某个文档中看到“电脑上至少配置两个RS232串口,一个RJ-45网口”,我实在拖不了了,今天一定要把它搞清楚。

    研究之前我先是在网上搜了一些Qt和串口通信开发相关的资料,大致看了一下大家的博文,稍微有一个简单的了解,然后我先去问一下实验室的好兄弟,
    在这里插入图片描述
    在这里插入图片描述
    简单沟通了一下,听听其他同学的想法,然后开干!

    百度百科上对于“串口"和"串口通信”的解释:

    串行接口 是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。
    串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

    尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

    RS-232标准

    串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。

    上面了解到大多数台式机上是有串口的,经常用于连接一些工业设备或者远程采集数据。由于自己对这些概念还不太懂,所以先去写个程序测试一下我的笔记本有没有串口。新建一个Qt Application项目,pro文件中导入serialport模块,在main.cpp中写入:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QSerialPort>
    #include <QSerialPortInfo>
    #include <QDebug>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    //    MainWindow w;
    //    w.show();
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
            qDebug() << "Name : " << info.portName();
            qDebug() << "Description : " << info.description();
            qDebug() << "Manufacturer: " << info.manufacturer();
            qDebug() << "Serial Number: " << info.serialNumber();
            qDebug() << "System Location: " << info.systemLocation();
        }
        qDebug() << "hello";
        return a.exec();
    }
    

    主要是使用QSerialPortInfo,它提供有关现有串行端口的信息。使用静态函数生成qserialPortInfo对象列表,列表中的每个qserialPortInfo对象表示单个串行端口,可以查询端口名、系统位置、说明和制造商。

    最后发现只输出了:hello。

    果然经过程序验证,我的普通华硕笔记本上是不具有串口这个东西的,那么什么设备上面有呢?

    了解到:

    带串口的笔记本电脑上有一个9针的插口,现在大部分电脑都没有这一插口了,可通过USB转串口软件和连接线替代。串口是为了通信用的,在当年,可以连接Modem,打印机,游戏机等外部设备,现在,这些设备都变成USB口了,所以现在的电脑上,再也看不到串口了。只有工控机上,串口还被保留。因为串口在工业控制方面,到现在还有很多应用。

    仿佛茅塞顿开啊,原来很久之前是有的,但是随着时代的发展被取代,除非一些特殊领域。

    再往下看:

    串行接口,简称串口,也就是COM接口,是采用串行通信协议的扩展接口。串口的出现是在1980年前后,数据传输率是115kbps~230kbps,串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备,目前部分新主板已开始取消该接口。

    看到这,我觉得串行接口应该就是一种采用串行通信协议的接口而已。接口有很多种,它是其中之一。

    于是我想尽快学习一下基本的API,其实不多,看下面这个代码应该就差不多了。

    QSerialPort 负责具体的串口操作。

    使用qserialPortInfo帮助程序类获取有关可用串行端口的信息,该类允许枚举系统中的所有串行端口。可以将helper类的对象作为参数传递给setport()或setportname()方法,以分配所需的串行设备。选定串口后,要先打开串口,才能设置波特率等参数。

    这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。

    还有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()。每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。

    看一下代码:

    #include "widget.h"
    #include "ui_widget.h"
    
    #include <QSerialPort>
    #include <QSerialPortInfo>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        //查找现有串行端口的信息
        foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            QSerialPort serial;
            serial.setPort(info);
            if(serial.open(QIODevice::ReadWrite))
            {
                ui->PortBox->addItem(serial.portName());
                serial.close();
            }
        }
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_OpenSerialButton_clicked()
    {
        if(ui->OpenSerialButton->text() == "打开串口")
        {
            serial = new QSerialPort;
            //设置串口名
            serial->setPortName(ui->PortBox->currentText());
            //打卡串口
            serial->open(QIODevice::ReadWrite);
            //设置波特率
            serial->setBaudRate(ui->BaudBox->currentText().toInt());
            //设置数据位数
            switch (ui->BitBox->currentIndex())
            {
            case 8:
                serial->setDataBits(QSerialPort::Data8);
            case 7:
                serial->setDataBits(QSerialPort::Data7);
            case 6:
                serial->setDataBits(QSerialPort::Data6);
            case 5:
                serial->setDataBits(QSerialPort::Data5);
                break;
            default:
                break;
            }
            //设置校验位
            switch (ui->ParityBox->currentIndex())
            {
            case 0:
                serial->setParity(QSerialPort::NoParity);
                break;
            default:
                break;
            }
            //设置停止位
            switch (ui->BitBox->currentIndex())
            {
            case 1:
                serial->setStopBits(QSerialPort::OneStop);
                break;
            case 2:
                serial->setStopBits(QSerialPort::TwoStop);
            default:
                break;
            }
            //设置流控制
            serial->setFlowControl(QSerialPort::NoFlowControl);
    
            //关闭设置菜单使能
            ui->PortBox->setEnabled(false);
            ui->BaudBox->setEnabled(false);
            ui->BitBox->setEnabled(false);
            ui->ParityBox->setEnabled(false);
            ui->StopBox->setEnabled(false);
            ui->OpenSerialButton->setText(tr("关闭串口"));
    
            //连接信号槽
            connect(serial,SIGNAL(readyRead),this,SLOT(ReadData));
        }
        else
        {
            //关闭串口
            serial->clear();
            serial->close();
            serial->deleteLater();
    
            //恢复设置使能
            ui->PortBox->setEnabled(true);
            ui->BaudBox->setEnabled(true);
            ui->BitBox->setEnabled(true);
            ui->ParityBox->setEnabled(true);
            ui->StopBox->setEnabled(true);
            ui->OpenSerialButton->setText(tr("打开串口"));
        }
    }
    //读取接收到的信息
    void Widget::ReadData()
    {
        QByteArray buf;
        buf = serial->readAll();
        if(!buf.isEmpty())
        {
            QString str = ui->textEdit->toPlainText();
            str+=tr(buf);
            ui->textEdit->clear();
            ui->textEdit->append(str);
    
        }
        buf.clear();
    }
    
    //发送按钮槽函数
    void Widget::on_SendButton_clicked()
    {
        serial->write(ui->textEdit_2->toPlainText().toUtf8());
    }
    
    

    就这?看完之后总感觉少了点什么,没错,你还没上手跑一下呢。于是我先大概参考[4]的代码,先保证代码能运行起来。

    前面验证知道,我的笔记本上不具有串口,所以需要用虚拟串口工具模拟两个串口出来,然后进行通信,于是我去找了一个用的比较多的软件,VSPD,它可以增加串口数量,一次虚拟2个串口,一个读,一个发,那我们就可以虚拟2个串口然后连接起来实现自发自收调试。

    安装很简单,完成之后,打开时这样子的。标题乱码了,对于我感觉有点难受,但是凑合用吧。

    在这里插入图片描述
    点击右边的【添加端口】,就会在左边的【Virtual ports】下面多出来两个端口。

    在这里插入图片描述
    然后,,,然后就可以跑程序了!

    首先,再次运行上面提到的main.cpp中监测串口的那几行代码,再看现在运行后输出的结果:

    Name :  "COM2"
    Description :  "Virtual Serial Port (Eltima Softwate)"
    Manufacturer:  "ELTIMA Software"
    Serial Number:  ""
    System Location:  "\\\\.\\COM2"
    Name :  "COM1"
    Description :  "Virtual Serial Port (Eltima Softwate)"
    Manufacturer:  "ELTIMA Software"
    Serial Number:  ""
    System Location:  "\\\\.\\COM1"
    hello
    

    说明刚刚的端口添加成功了!

    稍微修改一下博文[4]中的程序代码。其实少了一个文件,但是不影响我们运行,删了那两行代码就行了,还有把QAction中的最后一个参数this删了,运行结果:

    在这里插入图片描述
    在这里插入图片描述
    为何要俩窗口呢,因为要看收和发的过程。但是遇到了问题,Qt Creator还不能同时运行两个相同的进程,聪明的我想了个办法,开两个Qt Creator。。。

    ok,大致测试完了,记得关闭VSPD之前,删除掉虚拟端口。

    又参考[5]的代码写了一个示例:

    缺失一个ui文件,我在这放出来吧:
    在这里插入图片描述
    ui文件代码,自己实现的时候有些地方参考了博客[5]中的下拉框选项。

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow2</class>
     <widget class="QMainWindow" name="MainWindow2">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>800</width>
        <height>600</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <layout class="QGridLayout" name="gridLayout">
        <item row="0" column="0">
         <layout class="QHBoxLayout" name="horizontalLayout_7">
          <item>
           <layout class="QVBoxLayout" name="verticalLayout">
            <item>
             <widget class="QLabel" name="label">
              <property name="text">
               <string>接收窗口</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QTextEdit" name="recvTextEdit"/>
            </item>
            <item>
             <widget class="QLabel" name="label_2">
              <property name="text">
               <string>发送窗口</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QTextEdit" name="sendTextEdit"/>
            </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout">
              <item>
               <widget class="QPushButton" name="pushButton">
                <property name="text">
                 <string>清空接收</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QPushButton" name="sendButton">
                <property name="text">
                 <string>发送数据</string>
                </property>
               </widget>
              </item>
             </layout>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QVBoxLayout" name="verticalLayout_2">
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_2">
              <item>
               <widget class="QLabel" name="label_3">
                <property name="text">
                 <string>串口号</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QComboBox" name="portNameBox"/>
              </item>
             </layout>
            </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_3">
              <item>
               <widget class="QLabel" name="label_4">
                <property name="text">
                 <string>波特率</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QComboBox" name="baudrateBox">
                <property name="currentIndex">
                 <number>3</number>
                </property>
                <item>
                 <property name="text">
                  <string>1200</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>2400</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>4800</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>9600</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>14400</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>19200</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>38400</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>56000</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>57600</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>115200</string>
                 </property>
                </item>
               </widget>
              </item>
             </layout>
            </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_4">
              <item>
               <widget class="QLabel" name="label_5">
                <property name="text">
                 <string>数据位</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QComboBox" name="dataBitsBox">
                <property name="currentIndex">
                 <number>3</number>
                </property>
                <item>
                 <property name="text">
                  <string>5</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>6</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>7</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>8</string>
                 </property>
                </item>
               </widget>
              </item>
             </layout>
            </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_5">
              <item>
               <widget class="QLabel" name="label_6">
                <property name="text">
                 <string>校验位</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QComboBox" name="ParityBox">
                <item>
                 <property name="text">
                  <string></string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string></string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string></string>
                 </property>
                </item>
               </widget>
              </item>
             </layout>
            </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_6">
              <item>
               <widget class="QLabel" name="label_7">
                <property name="text">
                 <string>停止位</string>
                </property>
               </widget>
              </item>
              <item>
               <widget class="QComboBox" name="stopBitsBox">
                <item>
                 <property name="text">
                  <string>1</string>
                 </property>
                </item>
                <item>
                 <property name="text">
                  <string>2</string>
                 </property>
                </item>
               </widget>
              </item>
             </layout>
            </item>
            <item>
             <widget class="QPushButton" name="pushButton_3">
              <property name="text">
               <string>检测串口</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QPushButton" name="openButton">
              <property name="text">
               <string>打开串口</string>
              </property>
             </widget>
            </item>
           </layout>
          </item>
         </layout>
        </item>
       </layout>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>800</width>
         <height>21</height>
        </rect>
       </property>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <resources/>
     <connections/>
    </ui>
    
    

    同样是开两个端口COM1和COM2,然后测试一下收发,注意运行之前先打开VSPD添加一个虚拟串口对,然后分别启动两个进程a,b,首先分别点击a,b窗口中的检测串口,然后分别点击打开串口,这样发送数据按钮就会启用,然后就在发送窗口中编辑内容,点击发送数据就OK啦!

    可以看到,两边收发都是可以的。

    在这里插入图片描述
    细心的同学可能又发现了,为啥截图的VSPD变了?本人这一丢丢的强迫症困扰的厉害,这个pro才好嘛!

    今天的学习暂时先到此,后面继续补充完善,大家如果想要代码也可以私信我提供,欢迎讨论交流。

    参考

    1. Qt5 串口数据读取
    2. 串口通信
    3. 带串口的笔记本是什么概念
    4. QT5实现串口收发数据(上位机与下位机通信)
    5. QT5串口编程——编写简单的上位机
    6. qt 串口收发(完整版)
    展开全文
  • 互联网串口通信 让世界联网起来 2017版 周云波注 自存收藏
  • 串行通讯 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯串行通讯的特点是:数据位传送,传按位顺序进行,少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 根据...
  • javaWeb调用串口通讯

    2020-08-10 09:51:52
    java串口通讯demo源码,内有注解。可实现通过javaWeb页面控制串口,调用串口数据,发送串口指令等操作。可同时监听多个串口,并同时向多个串口发送和接收消息。内含已经写好的串口监听类,定时器,以及串口数据转换...
  • 用Delphi实现串口通讯,采用API方式在Delphi下实现串口通讯.
  • Flash串口通信ANE.rar

    2021-12-10 11:12:16
    在flash air桌面应用程序中可以用来对串口进行获取和写入信息,对于AS3展厅开发人员来说是必备知识。
  • 非常适合 单片机进一步学习 和串行通讯
  • [通讯方式] 串口通信

    千次阅读 2022-03-07 16:02:49
    文章预览:一. 前言二. 串口通信的重要概念 ...1、什么是通信? 发送方按照信息编码方式对有效信息进行编码(编成可以在通信线路上传输的信号形态); 编码后的信息在传输介质上进行传输,输送给接收方; 接收...
    • 📢博客主页:https://blog.csdn.net/weixin_43197380
    • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    • 📢本文由 Loewen丶原创,首发于 CSDN,转载注明出处🙉
    • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

    一. 前言

    1、什么是通信?

    1. 发送方按照信息编码方式对有效信息进行编码(编成可以在通信线路上传输的信号形态);
    2. 编码后的信息在传输介质上进行传输,输送给接收方;
    3. 接收方接到编码信息后进行解码,解码后得到可以理解的有效信息

    可以理解为收发快递:卖家打包快递(编码)—— 快递小哥+运输车(传输介质)将打包好的快递给到买家手中 —— 买家拆开快递(解码),最终得到物品(有效信息)。

    2、同步通信和异步通信

    同步还是异步就看发送方和接收方的时钟频率是否一致:

    • [√] 同步通信:接收端发送端时钟信号频率一致,其发送端发送连续的比特流
    • [×] 异步通信:以字符为单位进行传输,接收端发送端时钟频率不要求同步,字符之间没有固定的时间间隔要求,但接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。

    在这里插入图片描述
    举个例子:大耳朵图图去牛爷爷家

    胡英俊对图图说:

    ①你自己去牛爷爷家吧,我去上班了,到牛爷爷家了给我打一个电话(异步通信)。

    ②胡英俊先送图图去牛爷爷家,确认送到牛爷爷家了之后,再去上班(同步通信)。

    3、电平信号和差分信号

    电平信号和差分信号是用来描述通信线路传输方式的。也就是说如何在通信线路上表示1和0。

    电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;

    差分信号的传输线中没有参考电平线,所有都是信号线,然后1和0的表达靠信号线之间的电压差。差分信号不容易受到干扰,因此传输质量比较稳定。现代通信一般都使用差分信号,电平信号几乎没有了。

    在电平信号下,”1根参考电平线+1根信号线“可以传递1位二进制;”1根参考电平线+2根信号线“可以同时发送2位二进制;如果想同时发送8位二进制就需要9根线。
    在差分信号下,2根线(彼此差分)可以同时发送1位二进制;如果需要同时发送8位二进制就需要16根线。

    总结: 在相同根数的通信线下, 表面上电平信号要比差分信号快;但是实际还是差分信号快,因为差分信号抗干扰能力强, 因此1个发送周期的时间耗时更少.

    4、串行接口和并行接口

    串行端口被描述为通道,而并行端口则表示有8条通道可同时传输8位(一个字节)的数据。

    在这里插入图片描述

    串行接口:
    串行接口,简称串口,也就是COM接口,是采用串行通信协议的扩展接口,数据传输率是115kbps~230kbps。

    串行接口是指数据是一位位地顺序传送出去的,其特点是通信线路简单,只要一对传输线就可以实现双向通信,并可以利用电话线。降低成本,适用于远距离通信,但传送速度慢

    并行接口:
    并行接口,简称并口,也就是LPT接口,是采用并行通信协议的扩展接口。并口的数据传输率比串口快8倍,标准并口的数据传输率为1Mbps。

    并行接口是指数据通过多条数据线同时传输出去,其特点是传输速度快(1Mbps),但当传输距离远、位数又多时,导致通信线路复杂且成本提高

    速度差异:
    ​通俗点讲,串口就像只有一条车道,而并口就是有8个车道,同一时刻能传送8位(一个字节数据)。但是并不是并口快,由于8位通道之间的互相干扰。传输速度就受到了限制。而且传输出错时,要同时重新传送8个位的数据。串口没有干扰,传输出错后重发以为就可以了。所以串口比并口快。串口硬盘就是这样被重视的,没有谁希望自己的机箱里出现一根胳膊粗的线束。

    历史上,工程师们确实是先做了串口,速度不够没办法只好含泪加电线上并口,直到他们发现了三大法宝(差分信号,时钟-数据恢复,和信道均一化)来提速,并口的动力就不那么强劲了。摘自:知乎:为什么串口比并口快?

    总结: 经过这么多年的发展,最终胜出的是: 异步、差分、串行, 譬如USB和网络通信。


    二. 串口通信的基本概念

    1、串口通信特点(异步、差分、串行通信)

    (1)异步

    串口通信的发送方和接收方之间没有统一的时钟信号,在异步通信中,收发双方取得同步是通过在字符格式中设置起始位和停止位的方法来实现,具体来说就是,在一个有效字符正式发送之前,发送器先发送一个起始位,然后在发送有效字符位,在字符结束时在发送一个停止位。

    (2)差分信号

    串口通信出现的时间较早、速率较低、传输的距离较近,所有干扰不太明显,因此当时使用了电平信号传输。后期出现的传输协议都改成了差分信号传输了。

    (3)串行通信

    将数据按位(bit)依次传输, 每位数据占据固定的时间长度,即可使用少数几条通信线路就可以完成系统间交换信息

    ps:注意区分串行通信和串口通信:

    • 串行通信是通信双方按位(bit)进行,遵守时序的一种通讯方式;
    • 串口通信是一种通信手段,对标于以太网方式、红外方式、蓝牙方式等通信手段而言。

    常用的串口接头有两种,一种是9针串口(简称DB-9),一种是25针串口(简称DB-25)。每种接头都有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9针串口的外观如图2所示。

    在这里插入图片描述
    在9针串口接头中,公头和母头的管脚定义顺序是不一样,这一点需要特别注意。那么,这些管脚都有什么作用呢?9针串口和25针串口常用管脚的功能说明如图所示:
    在这里插入图片描述

    典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。

    2、波特率

    波特率指的是串口通信的速率,也就是串口通信时每秒钟可以传输的数据位数(多少个二进制位 / 秒),譬如,每秒钟可以传输9600个二进制位(传输一个二进制位需要的时间是1/9600秒,也就是104us),波特率就是9600。

    波特率不能随意指定,主要是因为:通信双方必须事先设定相同的波特率才能成功通信,如果发送方和接收方按照不同的波特率通信则根本收不到,因此波特率最好是大家熟知的而不是随意指定的;常用的波特率经过长久发展,就形成了共识,大家常用的就是9600或者115200。

    可以将波特率比喻为两个特工的联络暗号,只有联络暗号正确,才能进行后续信息的传送。


    3、起始位、数据位、奇偶校验位、停止位

    串口通信时,收发是一个周期一个周期进行的,每个周期传输n个二进制位。这一个周期就叫做一个通信单元,一个通信单元由:起始位+数据位+奇偶校验位+停止位组成的。

    在这里插入图片描述
    起始位: 就是数据开始的标志,由0开始,即低电平开始。

    数据位: 是一个通信单元中发送的有效信息位,是本次通信真正要发送的有效数据,串口通信一次发送多少位有效数据是可以设定的(可以是5,7,8位三种,通常选择8位数据位,因为一般通过串口发送的文字信息都是ASCII码编码,而ASCII码中一个字符刚好编码为8位)。

    奇偶校验位: 是用来校验数据传输过程中的数据位,以防止数据位出错的。

    停止位: 是发送方用来表示本通信单元结束标志的,停止位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。常见的有1位停止位、1.5位停止位、2位停止位等,一般使用的是1位停止位。

    总结:

    串口通信时因为是异步通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、校验位、停止位(串口通信中起始位定义是唯一的,所以一般不用选择)。

    4、单工、半双工和全双工

    在通信中,相信大家也经常听说单工模式和双工模式,这是不同的通讯方式:

    • 单工模式:单方向收发数据,固定一方为发送端,一方为接收端。譬如,只能“A发送数据,B接收数据”。

    • 半双工模式(RS485):双方分时收发数据,譬如,“A发送数据,B接收数据”或者“A接收数据,B发送数据”,两个方向不能同时进行。

    • 全双功模式(RS232):双方同时收发数据,譬如,“A发送数据,B接收数据”同时“A接收数据,B发送数据”,两个方向同时进行。

    总结:

    半单工模式(RS485) 既可以使用一根数据线,又可以使用两根数据线,但是在切换数据传输方向时传输会有一些延时,故信息传输效率慢一些。全双工是两个单工通信的结合,参数一样的情况下,传输速度要比半双工高一些

    展开全文
  • 施耐德M218的串口通讯范例
  • 串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器...
  • 串口通信相关概念串行通信并行通信 串口通信分为串行通信与并行通信两种。 串行通信 串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间...
  • 已经定义了数百种通信协议来实现这种数据交换,并且通信的方式主要可以分为两类:并行或串行。 2、并行通信 并行是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高。 但并行传送的线路长度受...
  • 本文给大家分享了串行通信(80C51单片机汇编语言编程)。
  • 串口通信的重要性和基础就不用我多讲了吧?基础不懂直接点链接:https://blog.csdn.net/weixin_45629315/article/details/105717414 这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解。 目录 实验一(将...
  • 利用MiniSTM32F103RCT6开发板V3版本的HAL库开发串口1与串口3通讯串口1与串口3互相通讯 串口1给串口3发送数据,串口3接收后打印“串口1给串口3发送数据” 串口3给串口1发送数据,串口1接收后打印“串口1给串口3...
  • 串行通信的基本原理

    2021-02-03 17:53:15
    一、串口通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。在Windows环境(WindowsNT、...
  • html串口通讯.rar

    2020-09-17 12:58:21
    html实现串口通讯,压缩包内包含配置文件与教程,还有运行成功后的界面。 综合网上的资料,总结出最全面的网页串口实现方式。
  • STM32CUIDE之串口通信

    2021-01-06 09:09:59
    按通信的方式也可以分为串行和并行通信,串口通信只是众多串行通信当中的一种形式,通过开发板上的串口,将数据一位一位的一次传输。 所用设备 STM32MP157开发板,STLINK连接器,USB转TTL接口,5V电源。 开发环境 ...
  • STM32串口双机通信.zip

    2021-08-02 20:34:44
    基于stm32野火例程,使用两个STM32串口通信,发送数字点亮LED灯,主从机烧一个程序就可,通过按键相互点亮,比较基础。
  • 串行通信口简称串口。美国电子工业协会EIA按电气标准及协议来分,包括RS-232C、RS-422、RS-485、USB等。RS-232、RS-422与RS-485标准只对接口的电气特性作出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的...
  • 通信的基本方式可分为并行通信和串行通信两种。 并行通信通常是将数据字节的各位用多条数据线同时进行传送。并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,471
精华内容 109,388
关键字:

串口通信是什么