精华内容
下载资源
问答
  • 常见串口波特率
    2021-05-14 12:18:31

    我正在尝试制作一个程序来读取串口。在这个端口上,我收到波特率为875000的数据。这种情况并不常见,我没有成功修改它。我做了一个小C程序来做到这一点,但它不适用于875000 ...这里的代码的一部分与串口的编程:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include "test.h"

    void read_Serial_Port(const char* DEVICE_PORT)

    {

    int file;

    struct ktermios options;

    unsigned int nCountMax = 60;

    bool b;

    file = open(DEVICE_PORT, O_RDONLY | O_NOCTTY | O_NDELAY);

    if(file == -1){perror("Unable to open the serial port

    ");}

    //printf("Serial port open successful !

    ");

    int speed = atoi("875000");

    ioctl(file, TCGETS2, &options);

    options.c_ispeed = speed;

    options.c_ospeed = speed;

    options.c_cflag |= (CLOCAL | CREAD);

    options.c_cflag |= PARENB;

    options.c_cflag |= PARODD;

    options.c_cflag &= ~CBAUD;

    options.c_cflag |= BOTHER;

    options.c_cflag &= ~CSIZE;

    options.c_cflag |= CS8;

    ioctl(file, TCSETS2, &options);

    //printf("Reading serial port ...

    ");

    b = readMessage(file, nCountMax);

    if (b == 0){printf("Error while reading serial port

    ");}

    //else printf("

    Serial port read successful

    ");

    close(file);

    //printf("Serial port closed

    ");

    };

    答案

    最后我发现了另一个关于stackoverflow的话题,它已经完成并解决了我的问题:How to set baud rate to 307200 on Linux?

    这是我修改的代码:

    static int rate_to_constant(int baudrate) {

    #define B(x) case x: return B##x

    switch(baudrate) {

    B(50); B(75); B(110); B(134); B(150);

    B(200); B(300); B(600); B(1200); B(1800);

    B(2400); B(4800); B(9600); B(19200); B(38400);

    B(57600); B(115200); B(230400); B(460800); B(500000);

    B(576000); B(921600); B(1000000);B(1152000);B(1500000);

    B(2000000);B(2500000);B(3000000);B(3500000);B(4000000);

    default: return 0;

    }

    #undef B

    }

    int Custom_Baudrate(const char* Device, int rate)

    {

    /*Declaration of all the variables needed*/

    struct termios2 options;

    struct serial_struct serinfo;

    int file=-1;

    int speed = 0;

    int r=rate;

    /* Open and configure serial port */

    file = open(Device,O_RDWR|O_NOCTTY);

    if(file==-1){printf("

    ERROR : Unable to open the serial port

    ");return 1;}

    speed = rate_to_constant(r);

    /*Find best Baudrate*/

    if (speed == 0) {

    /* Custom divisor */

    serinfo.reserved_char[0] = 0;

    if (ioctl(file, TIOCGSERIAL, &serinfo) < 0) file=-1;

    serinfo.flags &= ~ASYNC_SPD_MASK;

    serinfo.flags |= ASYNC_SPD_CUST;

    serinfo.custom_divisor = ((serinfo.baud_base + (r / 2)) / r);

    if (serinfo.custom_divisor < 1)

    serinfo.custom_divisor = 1;

    if (ioctl(file, TIOCSSERIAL, &serinfo) < 0) file=-1;

    if (ioctl(file, TIOCGSERIAL, &serinfo) < 0) file=-1;

    if (serinfo.custom_divisor * r != serinfo.baud_base) {

    warnx("actual baudrate is %d / %d = %f",

    serinfo.baud_base, serinfo.custom_divisor,

    (float)

    serinfo.baud_base / serinfo.custom_divisor);

    }

    }

    /*Set the best Baudrate (if desired baudrate is unvailable, it's set automatically at 38400)*/

    fcntl(file, F_SETFL, 0);

    tcgetattr(file, &options);

    cfsetispeed(&options, speed ?: B38400);

    cfsetospeed(&options, speed ?: B38400);

    cfmakeraw(&options);

    options.c_cflag |= (CLOCAL | CREAD);

    options.c_cflag &= ~CRTSCTS;

    if (tcsetattr(file, TCSANOW, &options) != 0) file=-1;

    /*Read the serial port*/

    communicate_Serial_Port(file);

    close(file);

    return 1;

    }

    在此代码中,您只需要精确的波特率,它就可以找到最接近的值。此值基于设备的“基本波特率”,并搜索除数以设置最佳波特率。但是,某些波特率应始终不可用,因此该程序将38400作为基础(这是一个选择)。我用几个波特率测试它,它总是有效。

    我是stackoverflow的新手,我希望这篇文章能正确完成这个问题。

    更多相关内容
  • 串口通信波特率

    万次阅读 2021-05-25 08:42:42
    波特率的定义 波特率表示每秒钟传送的码元(符号)的个数,单位是波特(Baud,symbol/s)。 与比特率的关系 通过不同的调制方式,可以...串口模式下,若波特率是9600,1秒种只能传送9600/10=960Byte数据,而不是9600/8=12.
    1. 波特率的定义
      波特率表示每秒钟传送的码元(符号)的个数,单位是波特(Baud,symbol/s)。
    2. 与比特率的关系
      通过不同的调制方式,可以在一个码元符号上负载多个bit位信息。
      在这里插入图片描述
      其中I为传信率,S为波特率,N为每个符号承载的信息量。比特率=波特率*单个调制状态对应的二进制位数。
      但是在串口通信中,传输码元(符号)就是比特(bit),即波特率=比特率=时钟周期的数值。
    3. 串口通信按照字节传输,1Byte到底有几位?
      串口模式下,若波特率是9600,1秒种只能传送9600/10=960Byte数据,而不是9600/8=1200Byte数据。
      这是因为在网络传输的时候为了区别一个字节的开始和结束需要在每个字节前加一位0,后面加一位1。其中有8个b是表示数据,另外2b是控制信息。在串口模式下传送数据,传送1Byte有效数据需要10位。
      在这里插入图片描述
    4. FPGA中的串口通信
      版权声明:本文为CSDN博主「Crazzy_M」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      什么是波特率,波特率怎么计算

    假设系统时钟50M,波特率115200. 则传输1bit需要 1/115200s=8.68us。需要计数50*10^6/115200=434个。那么1Byte(串口传输格式为:1bit起始位+8bit数据位+1bit停止位)是不是循环计数10次434就可以传输完毕。
    在这里插入图片描述

    1. 什么时候去采样串口线上的数据呢?
        观察上图,Buad_Flag信号(通道2)表示了传输1Bit传输的间隔,每遇到1个Buad_Flag=1的信号,数据线上切换1次数据,所以两个Buad_Flag=1之间的数据是稳定的数据,根据抽样定理是不是应该在两个Buad_Flag=1信号的中间去采样数据呢,其实就是在1bit数据持续期间的中间点采样,才能得到最稳定的数据。
      ————————————————
    展开全文
  • 最大峰值串口波特率是指USB转串口芯片支持的最高串口波特率,连续通信最高波特率是指USB转串口芯片串口实现连续无间隔传输时支持的串口波特率。在实际应用中需加以甄别。

    串口波特率也称比特率,常用表示单位为bps(比特每秒,1秒钟可传输的bit总数)。以9600波特率为例:1秒钟串口信号线可以传输9600个bit位,1个位所需时间就是1/9600秒约104us。如下图所示:

    USB转串口设备,通常支持各类标准以及非标准串口波特率,由USB转串口芯片内部或外部时钟源通过倍频或分频先得到内部串口时钟,然后由内部串口时钟分频得到目标串口波特率。根据USB速率不同,USB转串口又可以划分为全速USB转串口和高速USB转串口。全速USB物理层为12Mbps,高速USB物理层为480Mbps。对于常规低波特率通信,使用全速USB转串口可以满足应用需要,对于高波特率串口通信以及多串口通信,使用高速USB转串口效果更佳。

    最大峰值串口波特率是指USB转串口芯片支持的物理最高串口波特率,串口双向通信的总带宽不会超过USB的总线速率,因此以全速USB转串口芯片为例,USB全速物理层为12Mbps半双工,考虑到USB协议及CRC等开销,收发双向使用6Mbps及以上速率串口通讯时,串口通讯必然为非连续传输。数据包之间会存在时间间隔。若要实现连续无间隔传输,可使用高速USB转串口芯片。

    连续通信最高波特率是指USB转串口芯片串口实现连续无间隔传输时支持的最高串口波特率,有别于最大峰值串口波特率,该参数强调的是串口数据通信的连续性,对于串口发送来说,在串口数据的停止位和下一个串口数据的起始位之间没有字节间时间间隔。对于串口接收来说,可以连续采样接收无字节间时间间隔的串口数据,缓存在芯片接收FIFO中,然后等待上传至USB主机。通过示波器和逻辑分析仪可得到该间隔时间,在不借助硬件仪器的前提下,也可以对USB转串口设备进行大数据或大文件传输测试,得到串口收发速度。

    简而言之,如果对于大数据量串口通信有速度和时间要求,就需要同步评估该芯片支持的最大峰值串口波特率与连续通信最高波特率。

    展开全文
  • 最近在整理串口通信的时候,敲完程序,想到能不能实现波特率自适应功能(起初想实现任意频率的波特率识别,后来发现能力不够,那就转为... 串口波特率与数据位参数自适应算法的研究与实现[J]. 计算机光盘软件与应用,

    最近在整理串口通信的时候,敲完程序,想到能不能实现波特率自适应功能(起初想实现任意频率的波特率识别,后来发现能力不够,那就转为常见波特率识别吧)。
    第一步查阅资料看看别人这是咋做的:波特率自适应常见方法:
    1.硬件检测波特率,一些硬件设备自带波特率检测功能例如一些STM32的单片机(硬件检测没啥好说的)。
    2.软件检测波特率:
    (1):特征值匹配:收发双方约定一个特殊字符,接收方根据接受的数据查表确定波特率。
    李斌斌,冯涛,谷丽. 串口波特率与数据位参数自适应算法的研究与实现[J]. 计算机光盘软件与应用,2014(3):279-280.
    (2):发送方发送超宽低电平脉冲,使接收方进入波特率调整状态,并对下一帧数据0x00确定新的波特率。
    孙夫文,郑采君,刘昕卓,等. 基于FPGA串口波特率自适应功能的设计与实现[J]. 电子设计工程,2019,27(9):69-73. DOI:10.3969/j.issn.1674-6236.2019.09.016.
    上述两种波特率调整方法都需要提前约定检测条件,那么如何设计一套不需要发送特殊字符也能正确调整波特率的算法呢?虽然波特率未知,但是起始位是确定可测的,如果我们采用0校验方式,则每帧数据的0校验位一直为低电平。那么我们已知起始位置,已知校验位点平,我们通过检验校验位位置电平即可知道当前波特率是否合适,如果不合适,则遍历已知波特率直到达到合适。通过这种方法就可以在更改波特率时不需要发送特殊字符给接收方,而接收方可以自动调节的功能。
    特点:更改波特率前不需要通知接收方,接收方自动调整、把0校验位作为判断依据,不需要改变帧结构、最重要是没看到有人这样做(可能没啥实用性吧,不过能够和别人不一样就行)。

    /*整体实现功能和串口接收程序一样只不过是多检测了一个0检验位,可以直接整合进串口接收程序,这里为了实现模块化,所以把波特率自适应功能单独做一个模块,方便直接添加进串口收发顶层文件中*/
    module bps_DR_detect(
    	input clk, 
    	input rst_n,
    	input rs232_rx,
    	output reg [2:0]baud_set
    );
    //同步寄存器,消除亚稳态
    reg s0_rs232_rx,s1_rs232_rx;
    reg temp0_rs232_rx,temp1_rs232_rx;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)begin
    			s0_rs232_rx<=1'b0;
    			s1_rs232_rx<=1'b0;
    		end
    		else begin
    			s0_rs232_rx<=rs232_rx;
    			s1_rs232_rx<=s0_rs232_rx;
    		end
    //检测下降沿-帧起始位
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)begin
    			temp0_rs232_rx<=1'b0;
    			temp1_rs232_rx<=1'b0;
    		end
    		else begin
    			temp0_rs232_rx<=s1_rs232_rx;
    			temp1_rs232_rx<=temp0_rs232_rx;
    		end
    wire nedege;
    assign nedege=!temp0_rs232_rx & temp1_rs232_rx;
    reg bps_clk;
    reg [15:0]div_cnt;
    reg uart_state;
    reg [15:0]bps_DR;
    //分频计数
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    		div_cnt<=16'd0;
    		else if(uart_state)begin
    				if(div_cnt==bps_DR)
    					div_cnt<=16'd0;
    				else
    					div_cnt<=div_cnt+1'b1;	
    		end
    		else
    				div_cnt<=16'd0;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			bps_clk<=1'b0;
    		else if(div_cnt==16'd1)
    			bps_clk<=1'b1;
    		else 
    		   bps_clk<=1'b0;
    reg [3:0]bps_cnt;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    		bps_cnt<=4'd0;
    		else if(bps_cnt==4'd10)
    				bps_cnt<=4'd0;
    		else if(bps_clk)
    				bps_cnt<=bps_cnt+1'b1;
    		else 
    				bps_cnt<=bps_cnt;
    reg Rx_done;
    //一帧接收完成
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			Rx_done<=1'b0;
    		else if(bps_cnt==4'd10)
    			Rx_done<=1'b1;
    		else
    			Rx_done<=1'b0;
    //读校验位电平
    reg r_data_bit;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    		r_data_bit<=1'b0;
    		else if(bps_cnt==4'd10)
    		r_data_bit<=s1_rs232_rx;
    		else
    		r_data_bit<=1'b0;
    //调整波特率
    reg [2:0]DR_cnt;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    		DR_cnt<=3'd0;
    		else if(DR_cnt==3'd4)
    		DR_cnt<=3'd0;
    		else if(r_data_bit)
    		DR_cnt<=DR_cnt+1'b1;
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)begin
    		baud_set<=3'd0;
    		bps_DR<=16'd5207;
    		end
    		else begin
    				case(DR_cnt)
    				   0:begin baud_set<=3'd0;bps_DR<=16'd5207;end
    					1:begin baud_set<=3'd1;bps_DR<=16'd2603;end
    				   2:begin baud_set<=3'd2;bps_DR<=16'd1301;end
    					3:begin baud_set<=3'd3;bps_DR<=16'd867;end
    					default:begin baud_set<=3'd0;bps_DR<=16'd5207;end
    				endcase
    		end
    //状态判断
    always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    		uart_state<=1'b0;
    		else if(nedege)
    		uart_state<=1'b1;
    		else if(Rx_done)
    		uart_state<=1'b0;
    		else
    			uart_state<=uart_state;
    endmodule
    

    仿真波形如下图所示,通过三帧数据实现了接收波特率等于发送波特率,实现了波特率自动调节和数据的正确接收。理论上最大调整时间为已有波特率数量-1;
    在这里插入图片描述

    展开全文
  • 描述波特率(Baud Rate) 单位 bps -- 每秒传送的字节数 Byte Per Second.。(BaudRate) 模拟线路信号的速率,也称调制速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行...
  • 之前,我们把rk3399的安卓源码编译好之后,插上USB转串口模块想进行调试以及查看启动log,发现是乱码,看了wiki后发现串口波特率是1500000,波特率很高,我用的是MobaXterm这个软件,发现没有1500000这个波特率选项...
  • 串口通信以及波特率计算方法

    千次阅读 2022-05-08 14:21:25
    串口通信 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信 RS-232 也称标准串口,最常用的一种串行通讯接口,比如我们的电脑主机的9针串口 ,最高...
  • 串口通信之波特率计算

    千次阅读 2021-05-06 23:25:53
    串口常见波特率有4800、9600、115 200等,此处我们选用9600的波特率进行讲解。 通信信道每秒传输的信息量称为位传输速率,简称“比特率”,其单位为“每秒比特数”(bps)。比特率可由波特率计算得出,公式为 ...
  • 可是在许多情况下,两种不同格式比如不同波特率的串口也要相互通信,这就必须进行串口波特率等格式的转换。本文介绍了如何实现串口波特率的转换。如果串口设备1与串口设备2之间需要通信,但是它们之间的通信波特率不...
  • 关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。 可能绝大部分知道的就是通过波特率一一匹配来实现,这种方法也是最常见,而且还比较有效...
  • 当通信线路上电平状态为1,表示当前线路上没有数据传送,串口处于空闲。1.起始位:先发出一个逻辑"0"的信号,表示传输字符的开始。2.数据位(8位或者9位):紧接着起始位之后,数据位的个数可以是4、5、6、7、8等,...
  • 串口常用参数

    千次阅读 2021-07-28 09:42:57
    中文名串口常用参数属性通用设备通信的协议相关特点计算机包含两个基于RS232的串口串口常用参数介绍编辑语音串口常用参数简介串口是一种非常通用的设备通信的协议(不要与通用串行总线Universa...
  • 波特率检查工具

    2021-07-27 05:39:53
    使用说明波特率就是一秒种传输0或1的个数,若波特率是9600那么它传输一位0或1的时间就是1/9600秒如果串口工作在方式一下波特率是9600晶振是11059200定时器选用TImer1的自动重装模式即1/9600=定时时间就是1/9600=(12*...
  • UART 波特率选择的认识与理解

    千次阅读 2021-09-24 20:33:46
    UART 波特率的认识与理解
  • Win7+Qt5.6的高波特率串口编程

    千次阅读 2018-07-09 20:20:09
    1 概述基于工作需要,要实现高波特率串口,所以之前使用MFC编程的时候,是利用的Moxa公司的pcomm库。现在转到Qt来编程,就特别希望使用Qt自身的类和访问系统的方式来实现高波特率串口访问。毕竟,第三方库也是...
  • 51单片机串行口波特率计算

    万次阅读 多人点赞 2019-06-19 21:48:58
    在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。 常用于串行口外接移位寄存器,以...
  • RS232在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口。九针串口分工头和母头公头上5...
  • #ifndef __UART_H__ #define __UART_H__ #include <reg52.h> sfr IPH_ =0xB7;//中断优先级高位寄存器 sfr SADEN_ =0xB9;//从机地址掩码寄存器 sfr SADDR_ =0xA9;...//串口初始化装载,使用定时器1产.
  • 4.10 如何添加其他的串口波特率? 答:添加路径内核源代码/driver/tty/serial/serial_core.c。 参考如下: ……… static const struct baud_rates baud_rates[] = { { 921600, B921600 }, { 460800, B460800 }, ...
  • STM32串口自动识别波特率

    千次阅读 2019-01-21 18:00:12
    置顶/星标公众号,不错过每一条消息! 最近有朋友问关于UART串口自动识别波特率的问题,今天就在这里写点相关内容。1写在前面关于自动识别UART串口波特率的这个问题...
  • 常见波特率应装的定时器初值

    千次阅读 2018-02-05 10:50:21
    图片来源:51单片机C语言教程--郭天祥
  • //111K 配置表 波特率 kbit/s CAN_SJW CAN_BS1 CAN_BS2 CAN_Prescaler 2 kbit/s CAN_SJW_2tq CAN_BS1_10tq CAN_BS2_6tq 1000 3 kbit/s CAN_SJW_2tq CAN_BS1_6tq CAN_BS2_4tq 1000 5 kbit/s CAN_SJW_2tq CAN_BS1_6tq...
  • USB转串口常见IC的极限波特率
  • 串口通讯(UART)是一种异步通讯,收发双方需要按照约定的波特率进行通讯。当波特率出现误差时,会导致通讯出错。那导致波特率出现误差的因素都有哪些呢,今天就来分析一下。1.分频误差首先,波特率是根据系统时钟...
  • 因为很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率,虽然严格来说没什么错误,但希望我们还是了解它们的区别。 5 TTL与RS-232电平标准 根据通讯使用的电平标准不同,串口通讯可分为...
  • 通俗易懂讲解什么是波特率

    万次阅读 多人点赞 2021-03-08 14:34:40
    接触过物联网的都应该常听到过这次词-波特率。对于工程师来说,这次肯定是很熟知的,但是对于刚开始了解物联网的同学来说,就比较陌生了。下面就来为你揭开迷雾,讲讲什么是...一般常见波特率是9600或者115200(低端
  • 在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。比如I2C通信速度100KHz,SPI最大通信速度支持150Mbps。1 Baud = log2M 其中M是信号的编码级数。这里...
  • NXP JN5169 UART 波特率设置一、系统时钟介绍1、高速(32MHz)系统时钟1、32MHz 晶体振荡器2、高速RC振荡器2、低速(32kHz)系统时钟1、32 kHz RC 振荡器2、32 kHz 晶体振荡器3、32 kHz 外部时钟二、UART 时钟三、串口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,381
精华内容 2,552
关键字:

常见串口波特率