精华内容
下载资源
问答
  • 总体来讲串行总线需要的管脚少、PCB设计的时候连线少,非常方便MCU和外设尤其是传感器之间的连接,相对于并行总线有很大的优势,可以说这三种总线已经是任何一款MCU必有的外设连接方式了。这三种总线也各有千秋,I2C...

    658a2a9908a91adb7b15ec8bcfcc42d2.gif

    前面三篇文章我们简单介绍了一下最常用的三种串行总线SPI、I2C、UART,总体来讲串行总线需要的管脚少、PCB设计的时候连线少,非常方便MCU和外设尤其是传感器之间的连接,相对于并行总线有很大的优势,可以说这三种总线已经是任何一款MCU必有的外设连接方式了。


    这三种总线也各有千秋,I2C看似简约但用起来不简单,主要是要让2根信号线处理那么多复杂的场景并能够保证数据的传输,背后支撑的硬件机制以及协议是不简单的,用FPGA自己写一个I2C的控制逻辑会非常的烧脑;SPI比I2C多出用于片选的信号线,因此逻辑设计上要简单很多,但带来的劣势就是每多连接一个外设,就要多出一条连接线;UART是一种异步的串行连接方式,没有了时钟线的连接就像I2C一样硬件连接起来非常简单,但使用的时候需要收、发两端的波特率设置在共同的频率,偏差要很小,否则就会出现传输错误。


    今天我门就通过一些生动的动图来对我们三种总线再次进行一次深刻的认识。我们先看看SPI的传输(同步、串行)

    bd3c1abc69d0683df8a4f4b4997221db.gif

    36a2f3d3c996a9f54c8e25266937f915.gif

    bd49fab0a893de12bce90b7595bc632a.gif

    我们再看看I2C的传输(同步、串行、2线)

    b83382fc18b80e743db1d9ce8ca75902.gif

    69845603113eed7ab9c3363d22a79129.gif

    c70dd717aa04c5e203ecc7bd80c8e4fb.gif

    红外控制也是基于异步串行的方式:

    f8c383209e276f8057f0a12fd50b67f6.gif

    13c212cda7a90003b2fffda8ecfd33d4.gif

    53cb691c2374897a1e1d322eaf2e3017.gif

    串行通信离不开数据的并/串转换和串/并转换:

    2349a8dac18bb0fbf69c2f63a78d377e.gif

    b83d143a555695a8c31f64db8e36655a.gif

    24828491fd44d9fae9dfd7765d0123b2.gif

    cffdda096f10c266246dc13bd92a265c.gif

    还有一些与我们相关的有趣的动画:
    比如PWM的产生和应用:

    4e43975e70a64ae91fb063c920aad9f3.gif

    06c92e69f51902a40e30860c79cbcd17.gif

    通信中常用到的模拟调制信号:

    4a2c042ea7107019ef0966f16d367df5.gif

    相位调制:

    07b4c9b9be4bd11b303158d9a16e4d16.gif

    方波信号的边沿抖动:

    fe2ab6a4cce657314433ff5888f6e52c.gif

    END

    4b6a453c6a2b6655fcb9d2613795a672.png

    硬禾团队一直致力于给电子工程师和相关专业的同学,带来规范的核心技能课程,帮助大家在学习和工作的各个阶段,都能有效地提升自己的职业能力。

    a0ad341c3a7e4e2d8b6cb5615216cf05.png
    展开全文
  • 当控制计算机与各数控机床相距较远时,一般采用串行通信方式而不采用并行通信方式。...RS-232C是电子工业协会(EIA)推荐的一种普及型异步通信总线标准,目前已广泛应用到了计算机系统中外围设备与主机的连接中。
  • RS-232C是电子工业协会(EIA)推荐的一种普及型异步通信总线标准,目前已广泛应用到了计算机系统中外围设备与主机的连接中。  但是RS-232C应用于计算机系统时存在如下问题:  (1)传送距离过近:由于受负载电容容许...
  • RS-232C是电子工业协会(EIA)推荐的一种普及型异步通信总线标准,目前已广泛应用到了计算机系统中外围设备与主机的连接中。但是RS-232C应用于计算机系统时存在如下问题:(1)传送距离过近:由于受负载电容容许值的限制...
  • STM32串行通信理解

    2020-11-23 17:12:09
    串行通信的通信方式:二、STM32串口通信基础1.STM32的串口通信接口2.UART异步通信方式引脚连接方法:3.UART异步通信方式特点:4.STM32串口通信过程:5.STM32异步通信要定义哪些参数:6.串口通信框图7.串口设置的一般...

    一、通信接口的背景知识

    1.处理器与外部设备通信的两种方式

    (1)并行通信
    -传输原理:数据各个位同时传输
    -优点:速度快
    -缺点:占用引脚资源多
    (2)串行通信
    -传输原理:数据按位顺序传输
    -优点:速度快占用引脚资源少
    -缺点:速度慢

    2.串行通信按照数据传送的方式

    (a)单工: 数据传输只支持数据在一个方向上传输。
    (b)半双工: 允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
    (c)全双工: 允许数据同时在两个方向上的传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
    在这里插入图片描述

    3.串行通信的通信方式

    1. 同步通信:带时钟同步信号传输。
      –SPI,IIC通信接口
    2. 异步通信:不带时钟同步信号。
      –UART(通用异步收发器),单总线

    (1) 同步通信:
    在时钟的上升沿到来时发送一位数据,速度取决于时钟的频率。
    (2) 异步通信:
    -UART:双方会约定传输数据的速率,如波特率;
    -单总线:没有约定波特率,但是会约定信号对应的持续时间,比如,1代表一个信号持续1/3的高电平,2/3的低电平;0代表一个信号持续1/3的低电平,2/3的高电平;
    常见的串行通信接口:
    在这里插入图片描述

    二、STM32串口通信基础

    1.STM32的串口通信接口

    • UART:通用异步收发器 USART:通用同步异步收发器
    • STM32F4XX目前最多支持8个UART,STM32F407一般是6个,具体请查看数据手册。

    2.UART异步通信方式引脚连接方法

    -RXD(具体对应管脚看数据手册):数据输入引脚。数据接收。
    -TXD(同上):数据发送引脚。数据发送。
    在这里插入图片描述

    3.UART异步通信方式特点

    ● 全双工异步通信
    ● 小数波特率发生器系统,提供精确的波特率;
    ● 可配置为 16 倍过采样或 8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。(提高容错率)
    ● 等等(请查看STM32F4XX中文参考手册,这里只列出重要的)

    4.STM32串口通信过程

    在这里插入图片描述

    5.STM32异步通信要定义的参数

    (1)起始位
    (2)数据位(8位或者9位)
    (3)奇偶校验位(第9位)
    (4)停止位(1,15,2位)
    (5)波特率设置
    在这里插入图片描述

    6.串口通信框图

    在这里插入图片描述在这里插入图片描述

    ps:对框图内f(PCLKx)不理解的可以查阅https://blog.csdn.net/mango_cpu/article/details/109824549
    里面有详细的说明;

    7.串口设置的步骤

    1. 串口时钟使能,GPIO 时钟使能。
    2. 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。
    3. GPIO初始化设置:要设置模式为复用功能。
    4. 串口参数初始化:设置波特率,字长,奇偶校验等参数。
    5. 开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。
    6. 使能串口。
    7. 编写中断处理函数:函数名格式为USARTxIRQHandler(x 对应串口号)。
    展开全文
  • 1.2串口通信的传输方式 1.3串口通信的同步技术 1.4串行接口标准 二 API函数实现串口通信 2.1打开串口 2.1.1串口是否有驱动 2.1.2连接串口 2.1.3串口逻辑端口号大于10无法打开问题 2.2串口配置 2.2.1设置...

    目录

    一串口通信基础      

    1.1串口通信原理与特点     

    1.2串口通信的传输方式     

    1.3串口通信的同步技术     

    1.4串行接口标准     

    二 API函数实现串口通信   

    2.1打开串口 

    2.1.1串口是否有驱动    

    2.1.2连接串口    

    2.1.3串口逻辑端口号大于10无法打开问题 

    2.2串口配置 

    2.2.1设置缓冲区大小    

    2.2.2设置串口状态  

    2.2.3设置需通知的事件      

    2.2.4清空缓冲区      

    2.3异步接收数据     

    三示例代码 

    3.1连接串口并设置参数     

    3.2发送与接收数据 

    3.3关闭串口 

     

     

     

    一串口通信基础

            提到串口让人想起并口,它们是计算机中两个比较重要的通信方式.

    串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占一个固定的时间长,速度慢,但是传输距离远,有9针和25针两种,是阳插座(插座中有针凸起),目前25针较少使用;Modem\鼠标\USB口\老式摄像头等都是用串口.

    并口:把字节的二进制位用多条线同时传输,速度快串口8倍左右,传输距离有限,一般计算机内部数据传输用此方式,平常使用的有打印机,扫描仪等;为25针,阴插座(插座有25个针孔).

     

    1.1串口通信原理与特点

            串行端口是CPU与串行设备间的编码转换器,当CPU经过串行端口发数据时,字节数据列队成串行位,串行端口接收数据时,串行位转换成字节数据.所以必须安装相应的驱动程序.

            串行通信有成本低的特点,而且可以在现有的电话网络上进行传输,家庭通过电话线上网即是这种方式.只要配置一个相应的通信接口,如:Modem.

    1.2串口通信的传输方式

            单工:只能从一头传输到另一头,如只能从A向B传或者B向A传,如看电视,只允许电视台向电视发数据,不允许电视向电视台发数据.在单工传输方式上一般采用两个通信,一个通道传输数据,一个通道传输控制信号.

            半双工:允许互传信息,但是不能同时进行,如对讲机,A说话时,B不能说话,B说话时A不能说话.

            全双工:允许双同时通信,如讲电话.

    1.3串口通信的同步技术

            物理连接建立后,需要使用一种机制使对方正确解释发送的数据,发送方安位发出数据后,接收方如何识别这些数据,并如何正确组装成正确的字节.这就需要同步技术.数据同步技术一般解决如下问题:

    ² 确定发送数据起始时间

    ² 发送数据的传输速率

    ² 发送数据所需的时间

    ² 发送时间间隔

    3.1异步传输

            按字节为单位传输,异步传输方式也叫起止方式,在被传输的字节前后加起止位,起止位无信号时处于高电平,接收方检测到低电平信号表示开始接收,收到停止信号表示传输完成.

    3.2同步传输

            以数据块为单位传输,在块的前后加一个特殊字节表示起止,传输效率高,线路利用率高,设备负担也大.

    1.4串行接口标准

            常用标准有RS-232C,RS-485,RS-422等,其中RS-232C被广泛用于计算机串口通信.RS-232C标准要求一般线路不要超过15米.

     

    二 API函数实现串口通信

            API函数串口编程,可采用简单的查询方式或定时方式,也可采用复杂的事件驱动方式,所谓事件驱动方式是当输入缓冲区中有数据时,将自动调用某个方法执行相应的操作.定时方式是在一定的时间间隔内判断缓冲区内有数据被写入,此方法效率不高,查询方式就更落后的一种方式.所以设计的好的串口通信程序一般用事件驱动,有实时,高效,灵活等特点.

    一般编制串行通信程序分以下几个部分:

    Ø 打开串行端口:打开通信资源,设置通信参数、设置通信事件、创建读、写事件、进入等待串口消息循环。

    Ø 读取串行端口信息:当串口发生EV_RXCHAR(接收到字符并放入了输入缓冲区)消息后读取串口、数据传输错误处理、字符串处理如回车符、空格并相应转化成数据,如果模拟量还要进行数据检验等功能。

    Ø 写串行端口信息:将要发送的信息写入串口,相应进行错误处理。

    Ø 断开串行端口连接:关闭事件,清除通信事件,丢弃通信资源并关闭。

     

    2.1打开串口

    2.1.1串口是否有驱动

            如何判断PC机中串口是否正常,驱动是否安装,串口名(逻辑端口名)是多少.如果PC机有串口同时驱动正常,那么在注册表的HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP目录下,包含字符"Serial"或"VCom"项下面的值就是,可以有多项,如下图:

     

     

    项SERIALCOMM下有一个值----COM11,表明有一个可用串口,如果目录下包含字符Serial或VCom的项下没有任何值,表明没有串口或者驱动不正常.以下是获取串口逻辑名的代码:

    #define MAX_KEY_LENGTH   255

    #define MAX_VALUE_NAME  16383

    HKEY hTestKey;

    if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hTestKey) ){

            TCHAR   achClass[MAX_PATH] = TEXT(""); // buffer for class name

            DWORD   cchClassName = MAX_PATH; // size of class string

            DWORD   cSubKeys=0;                  // number of subkeys

            DWORD   cbMaxSubKey;             // longest subkey size

            DWORD   cchMaxClass;             // longest class string

            DWORD   cValues;             // number of values for key

            DWORD   cchMaxValue;         // longest value name

            DWORD   cbMaxValueData;      // longest value data

            DWORD   cbSecurityDescriptor; // size of security descriptor

            FILETIME ftLastWriteTime;     // last write time

     

            DWORD i, retCode;

            TCHAR achValue[MAX_VALUE_NAME];

            DWORD cchValue = MAX_VALUE_NAME;

     

            // Get the class name and the value count.

            retCode = RegQueryInfoKey(

                      hKey,                   // key handle

                      achClass,               // buffer for class name

                      &cchClassName,          // size of class string

                      NULL,                   // reserved

                      &cSubKeys,              // number of subkeys

                      &cbMaxSubKey,           // longest subkey size

                      &cchMaxClass,           // longest class string

                      &cValues,               // number of values for this key

                      &cchMaxValue,           // longest value name

                      &cbMaxValueData,        // longest value data

                      &cbSecurityDescriptor,  // security descriptor

                      &ftLastWriteTime);      // last write time

     

            if (cValues > 0) {

                      for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) {

                               cchValue = MAX_VALUE_NAME; achValue[0] = '\0';

                               if (ERROR_SUCCESS == RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL)) {

                                        CString szName(achValue);

                                        if (-1 != szName.Find(_T("Serial")) || -1 != szName.Find(_T("VCom")) ){

                                                  BYTE strDSName[10]; memset(strDSName, 0, 10);

                                                  DWORD nValueType = 0, nBuffLen = 10;

                                                  if (ERROR_SUCCESS == RegQueryValueEx(hKey, (LPCTSTR)achValue, NULL,

    &nValueType, strDSName, &nBuffLen)){

                                                           int nIndex = -1;

                                                           while(++nIndex < 20){

                                                                    if (-1 == m_nComArray[nIndex]) {

                                                                              m_nComArray[nIndex] = atoi((char*)(strDSName + 3));

                                                                              break;

                                                                    }

                                                           }

                                                  }

                                        }

                               }

                      }

            }

            else{

                      AfxMessageBox(_T("机PC机没有COM口....."));

            }

    }

    RegCloseKey(hTestKey);

     

    2.1.2连接串口

    串口是系统资源,也当作文件一样操作,所以也用CreateFile函数,如果调用成功返回串口句柄,如果失败返回INVALID_HANDLE_VALUE值.函数参数说明如下:

    HANDLE WINAPI CreateFile(

     __in         LPCTSTR lpFileName,//串口名(逻辑端口名),如:”COM1”,”COM2”

     __in            DWORD dwDesiredAccess,//访问模式,对串口有读/写权限

     __in            DWORD dwShareMode,//共享模式,有读/写/删除共享,对串口通信只能独占模式

     __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,//文件安全属性,对串口设置为NULL

     __in            DWORD dwCreationDisposition,//创建方式,串口通信设置为OPEN_EXISTING

     __in            DWORD dwFlagsAndAttributes,//文件属性标记,是否异步方式,在些设置

     __in_opt HANDLE hTemplateFile);//文件句柄,如果不为NULL,新文件从该够本复制或扩展,如果函数执行成功,返回新的串口句柄.

    Ø 第一个参数:逻辑串口号,用字符串”COMX”表示,”X”是串口序号,关于电脑中的逻辑串口号,在注册表HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP目录下,包含字符"Serial"或"VCom"项下面的值就是,可以有多个

    Ø 第二个参数:是对对串口的访问权限,串口只有读/写(GENERIC_READ/GENERIC_WRITE)权限,可以同时设置成读/写权限,也可以单独只设置读或写权限.

    Ø 第三个参数:是共享模式,有读/写/删除共享,对串口通信只能独占模式,即是0.

    Ø 第四个参数:文件安全属性,对串口设置成NULL.

    Ø 第五个参数:创建方式,有CREATE_ALWAYS/ CREATE_NEW/ OPEN_EXISTING等方式,但是对串口只能是OPEN_EXISTING,只能打开存在的串口,不像文件一样可创建之类

    Ø 第六个参数:文件属性与标志,详细信息查看MSDN,如果想把串口设置成异步方式,那么要设置成FILE_FLAG_OVERLAPPED.

    Ø 第七个参数:文件句柄,新文件从该句柄复制或扩展,如果函数执行成功,返回新的句柄,对串口通信,设置成NULL

    以下为代码示例:

    HANDLE hCom = CreateFile("COM1", //打开串口1

                 GENERIC_READ|GENERIC_WRITE, //允许读和写操作

                 0, //独占方式

                 NULL,

                 OPEN_EXISTING, //打开存在的串口,必须是OPEN_EXISTING,文件还可以CREATE_NEW,串口不能创建

                 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //异步方式打开

                 NULL);

    if (INVALID_HANDLE_VALUE == m_hCom) {

                               int nError = GetLastError();

                 }

    如果执行成功返回串口句柄,如果失败通过GetLastError获取错误码.

            

    2.1.3串口逻辑端口号大于10无法打开问题

           通过函数CreateFile打开串口,其第一个参数就是串口的逻辑端口名,是用”COMX”表示的,其中X是1~N的整数,当X大于10时,有时会出现无法打开的问题,把逻辑端口名改成"\\\\.\\COM

    X"即可解决.

    CString szCom;

    szCom.Format(_T("\\\\.\\COM%d"), nPort);

    COMFile = CreateFile(szCom.GetBuffer(50), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,                                                 NULL,             OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);

    2.2串口配置

            对串口进行设置,如缓冲区大小,是否允许二进制,参数配置等.

    2.2.1设置缓冲区大小

            设置IO的缓冲区大小根据自己需求,太小容易丢失数据,所以根据自己的需求设置.

    BOOL SetupComm(

     HANDLE hFile, //串口句柄,CreateFile的有效返回值

     DWORD dwInQueue, //输入缓冲区字节数

     DWORD dwOutQueue);//输出缓冲区字节数

    2.2.2设置串口状态

            设置串口的各种状态,波特率/数据位/停止位/校验位/流控制/二进制等.设置窗口状态是通过函数SetCommState设置的,第一个参数是串口句柄,第二个是DCB指针.DCB结构比较复杂,参数多,所以一般是通过GetCommState来填充一个DCB对象,然后再修改这对象,再把修改好的对像给SetCommState做参数.这是常用的方法.下面是对DCB参数介绍:

    typedef struct _DCB { // dcb 

            DWORD DCBlength;           // sizeof(DCB) 

            DWORD BaudRate;            // current baud rate 指定当前的波特率

            DWORD fBinary: 1;          // binary mode, no EOF check 指定是否允许二进制模式,WINDOWS 95中必须为TRUE

            DWORD fParity: 1;          // enable parity checking 指定奇偶校验是否允许

            DWORD fOutxCtsFlow:1;// CTS output flow control 指定CTS是否用于检测发送控制.当为TRUE是CTS为OFF,发送将被挂起

            DWORD fOutxDsrFlow:1;// DSR output flow control 指定DSR是否用于检测发送控制.当为TRUE是DSR为OFF,发送将被挂起

            DWORD fDtrControl:2;       // DTR flow control type DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将

    //DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",

            DWORD fDsrSensitivity:1;   // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略

            DWORD fTXContinueOnXoff:1; // XOFF continues Tx 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送

    //是否停止.TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送

    //出XoffChar字符中止接收字节之后,发送继续进行。FALSE时,在接收缓冲区接收到代表缓冲

    //区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。

            DWORD fOutX: 1;            // XON/XOFF out flow control TRUE时,接收到XoffChar之后便停止发送.接收到XonChar之后将重新开始

            DWORD fInX: 1;             // XON/XOFF in flow control TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出

    //去.接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去

            DWORD fErrorChar: 1;       // enable error replacement 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇

    //偶校验错误的接收字符

            DWORD fNull: 1;            // enable null stripping TRUE时,接收时去掉空(0值)字节

           DWORD fRtsControl:2;       // RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,当接收缓冲区小于半满时RTS为ON 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF

           DWORD fAbortOnError:1;     // abort reads/writes on error TRUE时,有错误发生时中止读和写操作

           DWORD fDummy2:17;          // reserved 未使用

          WORD wReserved;            // not currently used 未使用,必须为0

           WORD XonLim;               // transmit XON threshold 指定在XON字符发送这前接收缓冲区中可允许的最小字节数

           WORD XoffLim;              // transmit XOFF threshold 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数

            BYTE ByteSize;             // number of bits/byte, 4-8 指定端口当前使用的数据位

            BYTE Parity;               // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法,可能为:

    //EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

            BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

            char XonChar;              // Tx and Rx XON character 指定用于发送和接收字符XON的值

            char XoffChar;             // Tx and Rx XOFF character 指定用于发送和接收字符XOFF值

            char ErrorChar;            // error replacement character 本字符用来代替接收到的奇偶校验发生错误时的值

            char EofChar;              // end of input character 当没有使用二进制模式时,本字符可用来指示数据的结束

            char EvtChar;              // received event character 当接收到此字符时,会产生一个事件

            WORD wReserved1;           // reserved; do not use 未使用

        } DCB; 

    以下为示例代码:

                 DCB dcb;

                 GetCommState(hCom,&dcb);

                 dcb.BaudRate = 9600;//波特率

                 dcb.fBinary = TRUE;//是否允许传二进制

                 dcb.fParity = TRUE;//是否奇偶校验

                 dcb.ByteSize = 8;//数据位

                 dcb.Parity = ODDPARITY;//奇偶校验方式

                 dcb.StopBits = ONESTOPBIT;//停止位

                 SetCommState(hCom,&dcb);

    2.2.3设置需通知的事件

            设置你关心的事件,当此事件发生时,将得到事件通知,通过SetCommMask函数设置,SetCommMask函数两个参数,第一个为串口句柄,第二个为事件,可通过位或的方式指定多个事件,如下:

    BOOL WINAPI SetCommMask(

     __in  HANDLE hFile,

     __in  DWORD dwEvtMask);

    示例代码:

    SetCommMask(m_hCom, EV_RXCHAR ) ;

    EV_RXCHAR事件指当输入缓冲区内有数据时,通过WaitCommEvent函数可获得通知,其他事件同理,其他事件还有EV_BREAK/EV_CTS/EV_RING等,详情参看MSDN.

    2.2.4清空缓冲区

            在接收/发送数据前缓冲区中可能有垃圾数据,或者中途想清空缓冲区数据,可以用以下调用以下函数:

    BOOL WINAPI PurgeComm(

     __in HANDLE hFile,//串口句柄

     __in DWORD dwFlags//清空方式PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR

    );

    PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR分别表示:立即中断写操作并清空输出缓冲区|清空输出缓冲区|立即中断读操作并清空输入缓冲区|清空输入缓冲区.示例代码如下:

    PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

    2.3异步接收数据

            在2.2.3中通过SetCommMask函数,设置了异步通知事件EV_RXCHAR,所以当输入缓冲区中有数据时,将会有事件触发,那怎么获得事件呢?通过WaitCommEvent函数截取,与WaitForSingleObject原理类似.函数说明如下:

    BOOL WINAPI WaitCommEvent(

     __in  HANDLE hFile,

     __out LPDWORD lpEvtMask,

     __in  LPOVERLAPPED lpOverlapped);

    第一个参数是串口句柄,第二个参数是Out型指针,接收事件标志的,第三个参数接收事件信息事件状态.以下为示例代码:

    HANDLE hEventArr[2];

    hEventArr[0] = osRead.hEvent;

    hEventArr[1] = *g_OutPutList.GetEvent();

    while(1){

                 DWORD nResutl = WaitForMultipleObjectsEx(2, hEventArr, FALSE, 200, TRUE/*INFINITE*/);

                 if(0 == nResutl){

                               if (g_OutPutList.GetCount() > 1000)

                                             g_OutPutList.RemoveAll();

                               WORD nLen = (WORD)m_nBuffLen + 2;

                               PBYTE pIn = new BYTE[nLen];

                               pIn[0] = HIBYTE(nLen);

                               pIn[1] = LOBYTE(nLen);

                               memcpy(pIn + 2, m_InPutBuff, m_nBuffLen);

                               g_InPutList.AddTail(pIn);

                               m_nBuffLen = 0;

                 }

                 else if(1 == nResutl){

                               PBYTE pOut = (PBYTE)g_OutPutList.RemoveHead();

                               int nLen = pOut[0] * 0x100 + pOut[1] - 2;

                               WriteCommBlock(pOut + 2, nLen);

                               delete[] pOut;

                 }

                 DWORD dwEvtMask = 0 ;

                 WaitCommEvent( COMFile, &dwEvtMask, &ShareEvent);//等̨¨待äy串ä?口¨²事º?件t

                 if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {

                               ReadCommBlock( );

                 }

    }

     

    三示例代码

        关于本文的代码下载链接:http://download.csdn.net/detail/mingojiang/4425803 VS2010编写的,编译通过,是个串口调试工具. 如图:

     

    3.1连接串口并设置参数

    DCB dcb ;

    BOOL fRetVal ;

    COMMTIMEOUTS CommTimeOuts;

    CString szCom;

    szCom.Format(_T("\\\\.\\COM%d"), nPort);

    COMFile = CreateFile(szCom.GetBuffer(50), GENERIC_READ | GENERIC_WRITE,//可¨¦读¨¢、¡é可¨¦写¡ä

                                                                                       FILE_SHARE_READ | FILE_SHARE_WRITE,                                                                                

    NULL,

                                                                                       OPEN_EXISTING,

                                                                                       FILE_FLAG_OVERLAPPED,

                                                                                       NULL);

    if (INVALID_HANDLE_VALUE == COMFile){

                 return ( FALSE ) ;

    }

     

    SetupComm(COMFile,6000,6000) ;

    SetCommMask(/*COMFileTemp*/COMFile, EV_RXCHAR ) ;

    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;

    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;

    CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;

    CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/9600 ;

    CommTimeOuts.WriteTotalTimeoutConstant = 0 ;

    SetCommTimeouts(/*COMFileTemp*/COMFile, &CommTimeOuts ) ;

     

    dcb.DCBlength = sizeof( DCB ) ;

    GetCommState(COMFile, &dcb ) ;

    dcb.BaudRate =CBR_9600;

    dcb.StopBits =ONESTOPBIT;

    dcb.Parity = NOPARITY;

    dcb.ByteSize=8;

    dcb.fBinary=TRUE;

     dcb.fOutxDsrFlow = 0 ;

    dcb.fDtrControl = DTR_CONTROL_ENABLE ;

    dcb.fOutxCtsFlow = 0 ;

    dcb.fRtsControl = RTS_CONTROL_ENABLE ;

    dcb.fInX = dcb.fOutX = 1 ;

    dcb.XonChar = 0X11 ;

    dcb.XoffChar = 0X13 ;

    dcb.XonLim = 100 ;

    dcb.XoffLim = 100 ;

    dcb.fParity = TRUE ;

     

    fRetVal = SetCommState(/*COMFileTemp*/COMFile, &dcb ) ;

     

    if(!fRetVal) return FALSE;

     

    PurgeComm( /*COMFileTemp*/COMFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

     

    EscapeCommFunction( /*COMFileTemp*/COMFile, SETDTR ) ;

     

    3.2发送与接收数据

    HANDLE hEventArr[2];

    hEventArr[0] = osRead.hEvent;

    hEventArr[1] = *g_OutPutList.GetEvent();

     

    while(1){

                 DWORD nResutl = WaitForMultipleObjectsEx(2, hEventArr, FALSE, 200, TRUE/*INFINITE*/);

                 if(0 == nResutl){

                               if (g_OutPutList.GetCount() > 1000)

                                             g_OutPutList.RemoveAll();

                               WORD nLen = (WORD)m_nBuffLen + 2;

                               PBYTE pIn = new BYTE[nLen];

                               pIn[0] = HIBYTE(nLen);

                               pIn[1] = LOBYTE(nLen);

                               memcpy(pIn + 2, m_InPutBuff, m_nBuffLen);

                               g_InPutList.AddTail(pIn);

                               m_nBuffLen = 0;

                 }

                 else if(1 == nResutl){

                               PBYTE pOut = (PBYTE)g_OutPutList.RemoveHead();

                               int nLen = pOut[0] * 0x100 + pOut[1] - 2;

                               WriteCommBlock(pOut + 2, nLen);

                               delete[] pOut;

                 }

     

    DWORD dwEvtMask = 0 ;

    WaitCommEvent( COMFile, &dwEvtMask, &ShareEvent);//等̨¨待äy串ä?口¨²事º?件t

    if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {

                 ReadCommBlock( );

                 }

    }

     

    3.3关闭串口

    //禁止串行端口所有事件

    SetCommMask(COMFile, 0) ;

    //清除数据终端就绪信号

    EscapeCommFunction( COMFile, CLRDTR ) ;

    //丢弃通信资源的输出或输入缓冲区字符并终止在通信资源上挂起的读、写操操作

    PurgeComm( COMFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

    CloseHandle( COMFile );

    COMFile = NULL

    转载于:https://www.cnblogs.com/MingoJiang/archive/2012/11/12/2767171.html

    展开全文
  • 串口通信9.1 串行通信基础一、计算机通信方式数据传送速度二、串行数据传输方式串行异步通信协议标准数据格式一帧数据发送时序通信速率(传输速率)信号调制与解调(了解)RS232C标准——串行通信接口标准25针连接器...

    第九章 串口通信

    9.1 串行通信基础

    一、计算机通信方式

    CPU与外部的信息交换称为通信

    • 并行通信:数据所有位同时被传输
    • 串行通信:数据被逐位顺序传送
      • 串行异步通信:指一帧字符用起始位和停止位来完成
      • 串行同步通信:靠同步字符来完成收发双方同步

    数据传送速度

    并行通信>串行同步通信>串行异步通信
    同步通信指的是发送端与接收端的时钟同步

    二、串行数据传输方式

    (远程)串行数据通信系统模型

    数字信道
    模拟信道 信道<传输线路>
    数字信道
    计算机
    MODEM1
    MODEM2
    terminal

    对一个通信系统来讲,必须要考虑的问题有以下几个方面:

    1. 信道的带宽和数据的传输速率
    2. 信号的调制与解调
    3. 串行通信的信号格式 等

    数据的传输方式

    1. 单工方式:只允许数据按照一个固定的方向传送
    2. 半双工方式:要求收发双方均具备接受和发送数据的能力,由于只有一条信道,数据不能同时在两个方向上传送
    3. 全双工方式:在全双工方式中,收发双方可同时进行数据传送(至少两根线)

    串行异步通信协议

    标准数据格式

    起始位 数据位 奇偶校验位 停止位
    1位 5~8位 0~1位 1、1.5、2 位
    逻辑‘0’ 0,1代码 0或1 逻辑‘1’

    • 数据位先发低字节
    • 奇偶校验位(可有可无):通信双方约定采用一致的奇偶校验方式,由发送方设置校验位,由接受方负责校验
      • 奇校验:数据位与校验位中’1’的个数为奇数
      • 偶校验:数据位与校验位中’1’的个数为偶数

    一帧数据发送时序

    异步通信时,
    一帧字符以起始位’0’开始,紧跟着是数据位(先发数据最低位,再是高位)奇偶校验位,最后以停止位结束(停止位可以是1位、1.5位或者2位的逻辑1信号)。无数据传送时,通信线长时间逻辑’1’。

    通信速率(传输速率)

    通信速率,又称波特率,表示每秒钟传送的0、1代码个数(包括起始位、校验位、停止位),单位为“波特”。
    (bite per second—— bps)—— 1

    异步通信传送中,收发双方必须约定:

    • 收发双方的通信速率必须一致
    • 收发双方的数据帧格式必须一致

    信号的调制与解调(了解)

    • 调制:用一个信号控制另一个信号的某个参数随之变化的过程,叫调制。

      这两个信号分别叫调制信号和被调信号,被调信号只作为传输过程中信息的载体,也叫载波。
    • 解调: 将已经调制的信号恢复成原来的数字信号的过程。

    通常情况下,通信是双向的,调制器和解调器设置在同一个装置中,称为调制解调器(MODEM,猫,ADSL )。这个设备在远距离通信中具有重要作用!

    RS232C标准——串行通信接口标准

    要进行串行通信,还要解决一个问题:计算机与MODEM怎样连接? —— 通过接口电路——串行接口电路 连接。
    这个接口其: 机械特性、电气特性、功能特性 都要遵循一定的规范,也就是要有一个标准。

    目前计算机通信使用最普遍的是RS-232C标准。它对两方面作了规定:信号的电平标准和控制信号的定义。

    1. 控制信号的定义(机械特性)早期的PC系列机一般有两个串行口:即COM1和COM2,使用9针和25针两种连接器,符合RS-232C接口标准。
      RS-232C使用25芯连接器和9芯连接器
    25针连接器中通信中常用的9个端子
    25针连接器端子号 名称 方向(从微机出发) 功能
    2 TXD 输出(DTE→DCE) 发送数据(Transmit Data)
    3 RXD 输入(DCE→DTE) 接收数据(Receive Data)
    4 RTS 输出(DTE→DCE) 请求发送(Request To Send)
    5 CTS 输入(DCE→DTE) 允许发送(Clear To Send)
    6 DSR 输入(DCE→DTE) 数据设备准备好(Data Set Ready)
    7 GND/SG 信号地(Signal Ground)
    8 DCD 输入(DCE→DTE) 载波检测(Carrier DeteCt)
    20 DTR 输出(DTE→DCE) 数据终端准备好(Data Term Ready)
    22 RI 输入(DCE→DTE) 振铃指示(Ring Indicator)
    信号电平标准(电器特性)

    标准规定:

    • 逻辑“1”信号,电平在 –3V ~ -15V 之间;
    • 逻辑“0”信号,电平在 +3V ~ +15V 之间;
      因此,使用RS-232C与微机接口时,需要将TTL电平2 (0 ~ 5V)与RS-232C电平进行转换。

    在这里插入图片描述

    9.2 可编程串行异步通信接口芯片8250

    详细见:可编程串行异步通信接口芯片8250

    • 能实现数据串\Leftrightarrow并变换,实现全双工异步通信支
    • 持异步通信协议,数据格式、通信速率等由初始化编程设定
    • 内部有MODEM控制器,可直接和MODEM相连
    • 内部有中断机制,CPU可用查询、中断方式与之交换信息
    • 以Ins 8250为核心器件的微机串行口,基于RS-232C标准,微机之间既通过连接调制解调器实现通过电话线路的远距离通信,也可以
    • 直接连接进行短距离的点到点通信。

    PC机有2个串行口,端口I/O地址分别为主串口3FXH、辅串口2FXH(高档微机中,8250的功能被一些多功能芯片取代)

    在这里插入图片描述

    • **串行数据发送过程:**CPU执行OUT指令,将待发送的数据→发送保持寄存器暂存,当发送移位寄存器空闲时自动装入,后者在发送器时钟控制下将并行数据添加起始位、校验位、停止位,一位一位发出。

    • **串行数据接收过程:**在接收器时钟控制下,接收移位寄存器一位一位地接收串行数据,自动的去掉起始位、校验位、停止位,并转换成并行数据→接收缓冲寄存器暂存,在接收过程中对一帧数据自动进行校验。

    内部结构

    TIP:寄存器不一定有口地址,口地址一样的寄存器不一定是同一个寄存器,口地址相同不会同时访问两个寄存器

    1. 发送保持寄存器(3F8H/2F8H)
      该寄存器保存CPU传送来的并行数据,并转移至发送移位寄存器
      注:只有在发送保持寄存器空闲时,CPU才能写入下一个数据。

    2. 接收缓冲寄存器(3F8H/2F8H)
      接收移位寄存器,去掉起始位,校验位和停止位,转换成并行数据,转换后的并行数据存入接收缓冲寄存器,等待CPU接收。
      注:只有当一帧数据收完后,CPU才能用IN指令读接收缓冲寄存器

    3. 通信线状态寄存器(3FDH/2FDH):D0与D5最重要,D1到D5之间的是

    • D0位:接收数据准备好(接收缓冲器满)标志位。 D0=1,表示接收器已接收到一帧完整的数据,并已转换成并行数据,存入接收缓冲寄存器。(CPU接收数据时一定要查询)
    • D5位:***发送保持寄存器***空闲标志位。D5=1,表示数据已从发送保持寄存器转移到发送移位寄存器,发送保持寄存器空闲,CPU可以写入新数据。当新数据送入发送保持寄存器后, D5置0。
    • D7位:恒为0。

    注意:D0位(接收数据准备好)和D5位(发送保持寄存器空)是串行接口最基本的标志位,它们决定了CPU能不能向8250进行读写操作,只有当D0=1时,CPU才能读数;只有当D5=1或D6=1时,CPU才能写数据。

    1. 中断允许寄存器(3F9H/2F9H)
    2. 中断识别寄存器(3FAH/2FAH)
    3. MODEM控制寄存器(3FCH/2FCH)
    4. 除数寄存器( 高8位3F9H/2F9H ,低8位3F8H/2F8H )
    5. 通信线控制寄存器(3FBH/2FBH)
    6. MODEM状态寄存器(3FEH/2FEH)

    9.3 8250初始化编程

    • 直接对8250端口操作
    • 利用BIOS通信软件(INT 14H)(了解)

    直接对8250端口进行 初始化编程 步骤:

    1. 确定波特率 —— 设置除数锁存器3FBH9行

    2. 确定数据格式 —— 设置通信线路控制寄存器;3行

    3. 确定是否使用中断方式 —— 若使用,需设置中断允许寄存器的相应位置“1”,否则对应位置“0”;3行

    4. 设置MODEM 控制寄存器 3行

    子程序一定要有ret

    I8250    PROC
    ;除数锁存器(分频系数)
    MOV       DX,3FBH;
    MOV       AL,80H
    OUT        DX,AL;通讯线路控制寄存器最高位置“1”
    MOV       DX,3F9H;D7设置
    MOV       AL,0
    OUT        DX,AL;除数低位送入 除数锁存器 LSB (低8位)
    MOV       DX,3F8H
    MOV       AL,60H
    OUT        DX,AL;除数高位送入 除数锁存器 MSB (高8位)
    
    MOV       DX,3FBH;定义数据帧格式
    MOV       AL,03H
    OUT        DX,AL
    MOV       DX,3F9H;中断允许寄存器
    MOV       AL,0
    OUT        DX,AL
    MOV       DX,3FCH;MODERM控制寄存器
    MOV       AL,10H
    OUT        DX,AL
    RET
    I8250  ENDP
    

    9.4 串行通信的外部环境

    1. 短距离(无MODEM)点——点全双工通信

    1. 短距离单工通信

    1. 外环自发/自收

    9.5 串行通信程序设计举例

    设计时需要考虑:

    ① 题型:单端自发自收,点—点通信(全双工、单工)

    ② CPU与串口交换信息的方式:查询?中断?

    ③ 编程手段:对端口直接编程?调用BIOS通信软件

    ④ 根据题目要求组织相应的外部环境

    1. 对端口直接操作发送和接收数据,
      程序中查询联络线,可以按“有联络线”方式接线
      程序中不查询联络线,可以按“无联络线”方式接线

    2. BIOS通信软件是一个全双工的通信软件,发送和接收之前都要使用联络线与对端“握手”,只有联络畅通,才能发送或接收数据!

    3. 当8250设置为内环自检方式的时候,只能采用查询方式,而且只能采用对端口直接操作的编程手段,完成数据的发送和接收。


    1. 注:本书中的信号传输是使用二进制信号进行的,此处的波特率(数据信号速率)也指比特率(数据通信速率)。 ↩︎

    2. 注:计算机处理器中数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。 ↩︎

    展开全文
  • IBMPC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS功能调用两种:DOSINT21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOSINT14H有4组功能调用为串行...
  • 转载请注明出自:blog.csdn.net/...1.2串口通信的传输方式  1.3串口通信的同步技术  1.4串行接口标准  二 API函数实现串口通信  2.1打开串口  2.1.1串口是否有驱动  2.1.2连接串口  2.1.3串口逻辑端
  • 串行通信入门:uart、i2c、spi

    千次阅读 2015-11-18 21:08:09
    文章图片皆来自互联网,本文讲述方式也为看图说话uart uart设备连接图 uart内部连接图 uart时序图 特点:连接图:Tx, Rx两根线,无时钟线;全双工异步;一对一连接 内部图:需波特率生成器;有uart还提供输入输出...
  • 在一些应用系统通信设计中,PC机与单片机间常常采用串行异步通信方式。因为这种通信方式,硬件电气连接简单在PC机上针对串口编程方便。但是串行异步通信受传输速率限制,通常最高波特率设定在9 600 b/s左右。...
  • UART综述 UART即通用异步接收器和发送器(Universal Asynchronous Receiver and Transmitter),是一种用于连接两个计算系统简单、低成本的串行接口,对高速率串行通信具有更高可靠性,需要线缆数目要少于并行...
  • 文中以8位单片机AT89C52作为微控制器,它利用自带的异步串口与电平转换芯片MAX232和GPRS模块连接,使用AT命令对GPRS模块LT8030进行控制,从而实现SOCKET通信。详细介绍SOCKET通信中要用到AT命令,并给出实现SOCKET...
  • 关键词:UART 多点通信 FPGA 知识产权在通信和控制系统中,常使用异步串行通信实现多块单板之间辅助通信,各个单板通过总线方式连接。为了实现点对点通信,需要由软件定义一套较复杂的通信协议,过滤往来数据,...
  • Cyber UART通信学习

    2020-12-08 23:26:27
    小白专属通信接口背景知识通信方式并行通信串行通信串行通信数据传输方向:通信方式:STM32串口通信基础UART异步通信方式引脚连接方法UART异步通信方式特点串口通信过程STM32中UART通信需要定义参数 -Lxy 通信接口...
  • 通信协议三要素

    千次阅读 2019-12-03 22:34:04
    一、通信接口标准 通信接口标准是通信的硬件协议,提供机械...在串行异步通信中,通信双方必须就通信数据传输方式,传送的数据长度,校验方法和传输速率进行统一设置,这样才能保证双方通信的正确。这种双方进行统一...
  • 第1章 串行通信概述1.1 串行通信的基本概念1.1.1 通信与通信方式1.1.2 串行通信的数据传输方式1.1.3 串行通信的基本参数1.1.4 串行通信的基本方式1.2 串行通信协议1.2.1 异步串行通信协议1.2.2 同步串行...
  • 文中以8位单片机AT89C52作为微控制器,它利用自带的异步串口与电平转换芯片MAX232和GPRS模块连接,使用AT命令对GPRS模块LT8030进行控制,从而实现SOCKET通信。详细介绍SOCKET通信中要用到AT命令,并给出实现SOCKET...
  • STM32F10xx串口通信

    2020-06-09 23:40:37
    二、UART 异步通信方式引脚连接方法: RXD:数据输入引脚,数据接收 TXD:数据输出引脚,数据发送。 PC机里CPU也是含有发送引脚和接收引脚,他们通过主板引出已经被转化为RS232电平,然后通过
  • 串行通信是工业现场仪器或设备常用的通信方式,它是将一条信号各位数据按顺序逐 位传送。计算机串行通信(简称串口)采用RS232 协议,允许一个发送设备连接到一个接 收设备以传送数据,最大速率为115200bps。计算机...
  • 51单片机串口通信

    2019-10-06 20:31:19
    1.通信方式分类 (1)并行通信发送方和接收方用多根数据线连接,多位...异步串行通信:所谓“异步”,指是双方设备使用各自时钟,以字符为单位传输,采用一种特殊格式称为“帧”(如下图),且各字符之间间...
  • 异步通信与同步通信的各自特点这里不赘述,总之我们选择使用同步方式进行连接。 一、SPI简介 SPI(Serial Peripheral Interface),串行外设接口。是摩托罗拉公司开发的一种同步全双工通信协议。依靠收发两端的...

空空如也

空空如也

1 2 3 4 5 6
收藏数 116
精华内容 46
关键字:

串行异步通信的连接方式