精华内容
下载资源
问答
  • 串口通讯数据接收代码
    千次阅读
    2022-01-18 10:45:08

    先说一下串口通信,有兴趣的可以看看,了解的直接拉到下方看使用的方式。

    串行通信的三种方式:单工/半双工全双工

    串行通讯的基本概念:与外界的信息交换称为通讯.基本的通讯方式有并行通讯和串行通讯两种.
    一条信息的各位数据被同时传送的通讯方式称为并行通讯.并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯.。
    一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯.串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢.串行通讯的距离可以从几米到几千米。
    根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种.信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。
    串行通讯又分为异步通讯和同步通讯两种方式.在单片机中,主要使用异步通讯方式.
    全双工的串行通讯只需要一根输出线和一根输入线.数据的输出又称发送数据(TXD),数据的输入又称接收数据(RXD).串行通讯中主要有两个技术问题,一个是数据传送、另一个是数据转换.数据传送主要解决传送中的标准、格式及工作方式等问题.数据转换是指数据的串并行转换.具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数据转换为并行数据.
    单工/半双工和全双工的定义:
    如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工.
    如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输.
    如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工.


    分享一个串口通讯接收数据的代码,可以接收数据并以十六进制的形式显示出来:
    打开的设备为/dev/ttyUSB0,使用时需要修改权限:

    sudo chmod 777 /dev/ttyUSB0

    或者修改group的权限。
    可以通过cutecom工具查看自己的数据接收对不对。
    cutecom工具使用的方法

    #include <stdio.h>
    #include <unistd.h>                     //Used for UART
    #include <fcntl.h>                      //Used for UART
    #include <termios.h>                    //Used for UART
    
    typedef unsigned char uint8;
    
    void dump8(uint8 *buf, int len)
    {
            for(int icnt = 0; icnt < len; icnt++)
            {
                    printf("0x%x,",buf[icnt]);
            }
    
            printf("\n\t");
    }
    
    
    int main(void)
    {
        int data_num = 0;
    
        printf("\nUART test\n\n");
    
        int uart0_filestream = -1;
    
        uart0_filestream = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_NDELAY);                //Open in non blocking read/write mode
        if (uart0_filestream == -1)
        {
            printf("Error - Unable to open UART.  Ensure it is not in use by another application\n");
            return -1;
        }
    
    
        struct termios options;
        tcgetattr(uart0_filestream, &options);
        options.c_cflag = B921600 | CS8 | CLOCAL | CREAD;         //<Set baud rate
        options.c_iflag = IGNPAR;
        options.c_oflag = 0;
        options.c_lflag = 0;
        tcflush(uart0_filestream, TCIFLUSH);
        tcsetattr(uart0_filestream, TCSANOW, &options);
    
        printf("init complete, listening...\n\n");
    
    
        while(1)
        {
    
            if (uart0_filestream != -1)
            {
                unsigned char buf1[2];
                int n = read(uart0_filestream, buf1, 2);
                if ((n > 0) && (buf1[0] == 0xff) &&(buf1[1] == 0xff))
                {
                    unsigned char buf2[2];
                    dump8(buf1,2);
                    n = read(uart0_filestream, buf2, 2);
                    dump8(buf2,2);
                    if (n > 0 && (buf2[0] == 0x40) &&(buf2[1] == 0x01))
                    {
    
                        unsigned char buf3[640];
    
                        data_num = read(uart0_filestream, buf3, 640);
    
                        if(data_num > 0)
                        {
    
                            dump8(buf3,data_num);
                        }
    
                    
                    }
                }
            }
        }
    
    }
    

    代码在Ubuntu系统上运行的没有问题。

    如果路过的朋友有对深度学习计算机视觉感兴趣的,或者想入门的可以支持一下图书**《深度学习计算机视觉实战》与《学习OpenCV 4:基于Python的算法实战》**,两本书都以通俗易懂的讲解、丰富的案例帮助初学者学习视觉与图像方向的知识。欢迎前往gzh“**计算机视觉与OpenCV”**获取更多的学习资料。

    更多相关内容
  • stm32 使用cubemx 创建的Freertos系统下的串口通信接收不定长数据的demo
  • 上机作业:两台8051单片机之间通过串口通信,晶振频率为11.0592M,通信波特率为19200,发送端连续发送09的数码管段码值,接收端将串口接收过来的数据显示在数码管。 (要求发送和接收都用串口中断实现)
  • 1.解决了接收数据不完整、不连续、丢数据等问题。 2.基本达到了超级终端的接收效果。 3.委托+线程+终止符,三项组合才能完美解决上述问题。 4.注意波特率设置应根据发送方效率而选择。 5.完整代码、非常简洁,拿来...
  • 通过数码管将51单片机从电脑上接收来的数据进行转换并显示出来! 通过数码管将51单片机从电脑上接收来的数据进行转换并显示出来!
  • 本源码在VS2013平台上,使用C#编程,实现了多串口通信数据接收处理,实用性强,代码简洁,内置使用说明
  • 该程序编写了STM32F103三个串口初始化程序,可快速调用,同时支持接收和发送单个字符和多个字符,并存储数据,方便接收数据后的通信协议校验,支持自定义接收数据最大长度,重写printf函数。
  • 配合定时器中断,通过超时的方法,完成串口数据帧的接收
  • 主要介绍了Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法,需要的朋友可以参考下
  • 串口通信,多线程接收数据,并可以发送数据
  • 对于做嵌入式、单片机的人来说,会开发上位机挺重要的,在开发的过程经常会用到...这个垃圾简单的串口助手可以设置波特率、选择串口号啥的,至于数据位那些就不能改了,采用默认的数值。
  • qt写的绘制串口接收到数据的实时曲线,单片机串口发送格式为“AAA%-5d”
  • 今天小编就为大家分享一篇Python使用线程来接收串口数据的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 我是用电脑usb连接rs232然后232两根AB线接到485模块,然后485模块的...然后用SSCOM串口工具发送数据,却不能接收到返回来的数据,求大神解答,对了,我的芯片没刷程序,能收到并返回我发送的数据吗 作者:stanxiaobao
  • 这是一个我写的用C#实现串口通信的程序,可以扫描串口,然后选择串口,打开串口之后,如果打开成功,打开串口旁边的方框会变绿,这个可以验证是否成功打开,打开串口旁边还有关闭串口命令。 打开串口之后,在发送的...
  • 采用C#开发,将下位机发送的数据显示并绘制曲线,配套FPGA频率计下位机
  • Linux 串口接收不定长数据,网上查找好久都没有找到能用的资源,就自己写了个(ARM能正常使用),最大2K缓冲,接收文件时大于1K写一次缓冲,防止读写次数过多对flash损害。
  • 今天小编就为大家分享一篇对python3 Serial 串口助手的接收读取数据方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 串口通信接收发送数据
  • 51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI置 1。无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机...
  • MFC基于SerialPort类串口通讯工具,边接收数据边实时绘图。非常实用,网上很少找到类似的例子。
  • qt 写的绘制串口接收到数据的实时曲线。 qt写的绘制串口接收到数据的实时曲线,单片机串口发送格式为“AAA%-5d” qt 串口 实时曲线
  • 51系列单片机 单片机串口通信接收发送数据程序
  • 首先先来介绍以下同步和异步通信,同步是指,发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式;异步是指,发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。换句话说,同步...

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。

    首先先来介绍以下同步和异步通信,同步是指,发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式;异步是指,发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。换句话说,同步通信是阻塞方式,异步通信是非阻塞方式。在常见通信总线协议中,I2C,SPI属于同步通信而UART属于异步通信。同步通信的通信双方必须先建立同步,即双方的时钟要调整到同一个频率,收发双方不停地发送和接收连续的同步比特流。异步通信在发送字符时,发送端可以在任意时刻开始发送字符,所以,在UART通信中,数据起始位和停止位是必不可少的。

    硬件层

    常用RS-232标准,这里不详细解释,主要是对应设备的Tx线和Rx线要对应正确。

    协议层

    协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通信双方的数据包格式要约定一致才能正常收发数据 。

    波特率:异步通信中由于没有时钟信号,所以2个通信设备需约定好波特率,常见的有4800、9600、115200等。

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

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

    数据校验:在有效数据之后,有一个可选的数据校验位。由于数据通信相对容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。

    奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。0 校验是不管有效数据中的内容是什么,校验位总为“0”,1 校验是校验位总为“1”。

    UART功能框图剖析

    这张图是当年上学时使用System C对UART建模的模块图。对于接口部分,重要的即为Tx,Rx数据输出,接收接口,clk提供波特率生成模块的初始时钟信号。有关控制器部分,在这里使用逻辑电路来实现,具体控制输出/接收使能,设备使能等。

    3868c9551c8a7a36956ce873d1e2131a.png

    在目前的微控制器上,数字电路控制部分已被封装,现在只需要操作对应寄存器的对应位即可实现对UART的控制。以手上芯片STM32F411为例,下图是UART框图:

    781a2304eb1c99082ff2f214367ea6a1.png

    波特率生成模块:

    USART 的发送器和接收器使用相同的波特率。有以下的计算公式

    2d7896b885aca5f499a809639f7ecdab.png

    其中,fck为 USART 时钟, USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。

    例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此时 USART_BRR 值为0x18A;那么USARTDIV的小数位10/16=0.625;整数位24,最终USARTDIV的值为24.625。

    波特率的常用值有 2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。我们知道 USART1 使用APB2总线时钟,最高可达72MHz,其他USART的最高频率为36MHz。我们选取USART1作为实例讲解,即fck=72MHz。为得到115200bps的波特率,此时:115200=72000000/(16∗USARTDIV),解得USARTDIV=39.0625,可算得DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即应该设置USART_BRR的值为0x171。

    5eaca5344b098d829e59dcc2aa25f188.png

    数据寄存器:

    UART数据寄存器(USART_DR)只有低9位有效,并且第9位数据是否有效要取决于UART控制寄存器1(USART_CR1)的M位设置,当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8位数据字长。

    USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器,一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提取RDR数据。

    TDR和RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。

    UART支持DMA传输,可以实现高速数据传输(不经过CPU),使能UART的DMA功能需要将USART_CR1寄存器DMAT位置1。

    控制器:

    UART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等。使用UART之前需要向USART_CR1寄存器的UE位置1使能UART,UE位用于开启供给串口的时钟。发送或者接收数据字长可选8或9位,由USARTT_CR1的M位控制。

    1)发送器
    当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,低位在前,高位在后。

    一个字符帧发送需要3部分:起始位、数据帧、停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间 ;数据帧就是我们要发送的8或9位数据,数据是最低位开始传输的;停止位是一定时间周期的高电平。

    停止位的时间长短可以通过UART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5个、1个、1.5个、2个停止位。默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5和1.5个停止位用于智能卡模式。

    当发使能位TE置1之后,发送器开始会发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。在写入最后一个数据后,需等待UART状态寄存器(USART_SR)的TC位为1,表示数据传输完成。USART_CR1寄存器的TCIE位置1,则产生中断。

    发送数据时,几个重要的标志位如下:

    TE:发送使能。

    TXE:发送寄存器为空,发送单个字节时使用。

    TC:发送完成,发送多个字节数据时候使用。

    TXIE:发送完成中断使能。

    2)接收器

    将CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。在确定起始位后,就根据RX线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器的数据移到PDR内,并把USART_SR寄存器的RXNE位置。如果USART_CR2寄存器的RXNEIE置1可以产生中断。

    接收数据时,几个重要的标志位如下:

    RE: 接收使能。

    RXNE:读数据寄存器非空。

    RXNEIE:发送完成中断使能。

    USART_CR1寄存器:

    055974faa742095637386c6df3baa496.png

    USART_CR2寄存器:

    9fa11987d2c60da1862df15f178b1657.png

    USART_CR3寄存器:

    6366bae65d88e19f9ce34d8199670d01.png

    之后会基于STM32继续介绍怎样配置并使用UART,包括串口轮询/中断/DMA方式发送/接收数据。

    撑腰会儿:串口(UART)STM32实现​zhuanlan.zhihu.com

    UART寄存器配置介绍:

    撑腰会儿:【嵌入式Linux基础】2.裸机UART​zhuanlan.zhihu.com
    展开全文
  • PC上位机通过串口发送数据至fpga,fpga存储数据至ram并将接收数据通过串口发送至pc上位机
  • 串口通信、MFC入门
  • stm32F03 串口通过usart1实现与电脑通信,usart2与传感器通讯,使用IDLE模式接收数据, 使用接收中断与空闲中断相结合的方法
  • 十六进制 HEX /hexadecimal /ˌheksəˈdesɪml/ 十进制 DEC /decimalism/'desiməlizəm/ 二进制 BIN /binary/ˈbaɪnəri/ 八进制 OCT /octonary /ˈ...串口向电脑发送数据: #include <REGX52.H> void...

    十六进制        HEX /hexadecimal   /ˌheksəˈdesɪml/

    十进制            DEC /decimalism     /'desiməlizəm/

    二进制            BIN /binary            /ˈbaɪnəri/

    八进制            OCT /octonary        /ˈɒktənəri/

    波特率计算:

     串口向电脑发送数据:

    #include <REGX52.H>
    void Delayms(unsigned int time);
    void UartInit(void);
    void UART_SendByte(unsigned char Byte);
    
    main(){
    	unsigned char Sec;
    	UartInit();
    	while(1){
    			UART_SendByte(Sec);
    			Sec++;
    			Delayms(1000);
    	}
    }
    #include <REGX52.H>
    /**
      * @brief  串口初始化,4800bps@11.0592MHz
      * @param  
      * @retval  
      */
    
    void UartInit(void)		//4800bps@11.0592MHz
    {
    	PCON |= 0x80;		//使能波特率倍速位SMOD
    	SCON = 0x40;		//8位数据,可变波特率
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xF4;		//设定定时初值
    	TH1 = 0xF4;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    }
    /**
      * @brief  像串口发送一个字节的数据
      * @param  Byte要发送的数据
      * @retval  
      */
    
    void UART_SendByte(unsigned char Byte){
    	SBUF=Byte;//写入即可自动发出; 
    	while(TI==0);//检测是否发出,发出则为1;
    	TI=0;     //重置;
    }

    串口接收数据,并返回

    #include <REGX52.H>
    void UartInit(void);
    void UART_SendByte(unsigned char Byte);
    
    main(){
    	UartInit();
    	while(1){
    	}
    }
    
    void Uart_Routine() interrupt 4{
    	if(RI==1){     //保证当单片机接收数据时执行
    		P2=SBUF; 
    		UART_SendByte(SBUF);//单片机返回接收的数据
    		RI=0;
    	}
    }

    串口接收数据

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,077
精华内容 46,030
关键字:

串口通信接收到的数据是00