-
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_FreeRTOS_USART串口通信接收不定长数据
2021-06-16 15:16:57stm32 使用cubemx 创建的Freertos系统下的串口通信接收不定长数据的demo -
串口通信接收端将串口接收过来的数据显示在数码管上.rar
2020-06-03 10:20:26上机作业:两台8051单片机之间通过串口通信,晶振频率为11.0592M,通信波特率为19200,发送端连续发送0到9的数码管段码值,接收端将串口接收过来的数据显示在数码管。 (要求发送和接收都用串口中断实现) -
C# 串口监听 串口助手 串口通信 串口打印 串口数据完整接收
2019-09-09 14:18:201.解决了接收数据不完整、不连续、丢数据等问题。 2.基本达到了超级终端的接收效果。 3.委托+线程+终止符,三项组合才能完美解决上述问题。 4.注意波特率设置应根据发送方效率而选择。 5.完整代码、非常简洁,拿来... -
51单片机串口通信并用数码管显示接收数据
2020-12-10 18:00:24通过数码管将51单片机从电脑上接收来的数据进行转换并显示出来! 通过数码管将51单片机从电脑上接收来的数据进行转换并显示出来! -
C#多串口通信数据接收处理
2017-03-28 19:24:10本源码在VS2013平台上,使用C#编程,实现了多串口通信的数据接收处理,实用性强,代码简洁,内置使用说明 -
STM32串口中断接收发送数据
2018-07-11 10:31:03该程序编写了STM32F103三个串口初始化程序,可快速调用,同时支持接收和发送单个字符和多个字符,并存储数据,方便接收数据后的通信协议校验,支持自定义接收数据最大长度,重写printf函数。 -
串口使用超时判断接收数据帧
2020-07-17 09:23:15配合定时器中断,通过超时的方法,完成串口数据帧的接收。 -
Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法
2020-08-19 13:11:08主要介绍了Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法,需要的朋友可以参考下 -
串口通信多线程接收数据,发送数据
2016-12-25 18:17:31串口通信,多线程接收数据,并可以发送数据 -
基于C#简单的串口数据接收
2019-11-14 19:08:34对于做嵌入式、单片机的人来说,会开发上位机挺重要的,在开发的过程经常会用到...这个垃圾简单的串口助手可以设置波特率、选择串口号啥的,至于数据位那些就不能改了,采用默认的数值。 -
qt写的绘制串口接收到数据的实时曲线
2018-07-25 10:38:56qt写的绘制串口接收到数据的实时曲线,单片机串口发送格式为“AAA%-5d” -
Python使用线程来接收串口数据的示例
2020-09-19 04:24:16今天小编就为大家分享一篇Python使用线程来接收串口数据的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
rs232转485通信在串口助手只能发送数据而接受不到数据,求大神解答
2021-01-06 05:09:20我是用电脑usb连接rs232然后232两根AB线接到485模块,然后485模块的...然后用SSCOM串口工具发送数据,却不能接收到返回来的数据,求大神解答,对了,我的芯片没刷程序,能收到并返回我发送的数据吗 作者:stanxiaobao -
c#串口通信程序,包含打开串口,接收数据和发送数据等功能
2018-09-19 21:37:53这是一个我写的用C#实现串口通信的程序,可以扫描串口,然后选择串口,打开串口之后,如果打开成功,打开串口旁边的方框会变绿,这个可以验证是否成功打开,打开串口旁边还有关闭串口命令。 打开串口之后,在发送的... -
C#上位机串口接收数据并绘图
2021-06-04 16:48:10采用C#开发,将下位机发送的数据显示并绘制曲线,配套FPGA频率计下位机 -
Linux串口接收不定长数据和文件
2017-08-22 10:06:37Linux 串口接收不定长数据,网上查找好久都没有找到能用的资源,就自己写了个(ARM能正常使用),最大2K缓冲,接收文件时大于1K写一次缓冲,防止读写次数过多对flash损害。 -
对python3 Serial 串口助手的接收读取数据方法详解
2020-09-19 07:59:24今天小编就为大家分享一篇对python3 Serial 串口助手的接收读取数据方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
串口通信接收发送数据
2020-08-13 10:06:06串口通信接收发送数据 -
51单片机串口通信的发送与接收
2020-08-12 03:19:4351单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI置 1。无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机... -
MFC SerialPort串口通讯边接收数据边实时绘图
2018-12-29 09:46:04MFC基于SerialPort类串口通讯工具,边接收数据边实时绘图。非常实用,网上很少找到类似的例子。 -
qt 写的绘制串口接收到数据的实时曲线
2019-03-20 19:08:32qt 写的绘制串口接收到数据的实时曲线。 qt写的绘制串口接收到数据的实时曲线,单片机串口发送格式为“AAA%-5d” qt 串口 实时曲线 -
单片机串口通信接收发送数据程序
2013-01-06 11:34:4051系列单片机 单片机串口通信接收发送数据程序 -
stm32h7 UART dma接收不到数据_串口通信(UART)介绍
2020-11-22 07:27:20首先先来介绍以下同步和异步通信,同步是指,发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式;异步是指,发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。换句话说,同步...通用异步收发传输器(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提供波特率生成模块的初始时钟信号。有关控制器部分,在这里使用逻辑电路来实现,具体控制输出/接收使能,设备使能等。
在目前的微控制器上,数字电路控制部分已被封装,现在只需要操作对应寄存器的对应位即可实现对UART的控制。以手上芯片STM32F411为例,下图是UART框图:
波特率生成模块:
USART 的发送器和接收器使用相同的波特率。有以下的计算公式
其中,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。
数据寄存器:
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寄存器:
USART_CR2寄存器:
USART_CR3寄存器:
之后会基于STM32继续介绍怎样配置并使用UART,包括串口轮询/中断/DMA方式发送/接收数据。
撑腰会儿:串口(UART)STM32实现zhuanlan.zhihu.comUART寄存器配置介绍:
撑腰会儿:【嵌入式Linux基础】2.裸机UARTzhuanlan.zhihu.com -
fpga串口接收发送数据,通过ram存储数据。
2019-10-23 20:30:02PC上位机通过串口发送数据至fpga,fpga存储数据至ram并将接收的数据通过串口发送至pc上位机 -
解决使用MSComm控件进行串口数据的接收数据不完整.txt
2021-06-09 21:32:24串口通信、MFC入门 -
stm32F03 串口通过usart1实现与电脑通信,usart2与传感器通讯,使用IDLE模式接收帧数据
2019-09-28 13:29:21stm32F03 串口通过usart1实现与电脑通信,usart2与传感器通讯,使用IDLE模式接收帧数据, 使用接收中断与空闲中断相结合的方法 -
串口通信——串口接收数据,发送数据
2021-10-18 19:18:43十六进制 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; } }
串口接收数据