1:

串口字符串传输和单字节传输的差异体现在字节与字节间是或在停止位后有空闲位的插入(下图红箭头处,没有插入),即 uart_send("123")  和 uart_send('1')   uart_send('2')   uart_send('3') 在接收机上会有不同的效果。

这样在有RXFIFO的芯片上,如果RXFIFO设置为1时,而串口助手发送"123"时,接收端芯片每次都只能收到第一个字符0x31;而串口助手分三次发送字符  1 2 3时,接收端则可以每次收到不同的值;但对于没有RXFIFO的芯片,二者无区别。

哪为什么不把RXFIFO的值设置成3呢? 如果发送方不把数据截取成RXFIFO长度的小段逐一发送,而是采用 uart_send("123456")  这样一次性发送时(串口助手发送字符串时就是这样一起性发送的,字节中间没有添加空闲位),接收端每次都只能收到前3个字符。

上述的理解是错误的,硬件fifo其实只是个缓存区,当数据攒到fifo设定的阈值时会触发操作一次性处理;无fifo的芯片可以理解为fifo阈值为1的芯片;

串口在接收字节流的时候大多是没有停止位的,即数据一个接一个的在传输,即使是stm32的串口也是这种模式;区别在于中断模式的编程,串口的中断函数处理时间要求决不超过下一字节8bit从移位寄存器收齐并传给数据寄存器的时间(可以降低bps给中断函数更长的执行时间),中断的处理只需要将数据放到接收buf并设置接收指示或发送信号量即可完成退出,不建议在中断中做数据的解析;接收buf最好采用软件fifo的方式给前台处理程序预留处理时间。整体的模式就是前后台的方式,前台while会一直处理接收buf中的数据,不用在意其处理速度,如果处理不过来可以增大软件fifo的大小,总之前台while只要没有被中断或被其他任务抢占就会不停的处理接收buf中的数据,如果处理的中途触发了接收中断,则在中断中只需要将数据放入接收buf并设置接收指示或发送信号量即可完成退出,之后前台while会接着前面被打断的地方继续处理;有了硬件fifo后会降低中断的触发频率,延长前台while的处理时间。

uart 理解的更多相关文章

  1. [tty与uart]理解线路规程的作用

    转自:http://biancheng.dnbcw.info/linux/336240.html Linux OS的设备驱动有相当经典的抽象思想以及分层思想.与通信世界里面的思想相一致. 一.在Lin ...

  2. [uart]理解线路规程的作用

    转自:http://biancheng.dnbcw.info/linux/336240.html Linux OS的设备驱动有相当经典的抽象思想以及分层思想.与通信世界里面的思想相一致. 一.在Lin ...

  3. UART,SPI,IIC的一点理解

    转自:http://bbs.21ic.com/icview-253715-1-1.html UART通用异步收发器,UART是通用的异步传输模式,在它这种基础上加上其他接口或者解码器就衍生出多种异步传 ...

  4. UART Explained(转载)

    做嵌入式开发,UART几乎是必不可少的,调试串口.GPS.GPRS.Bluetooth等模块很多都是用的UART接口.时下火热的IoT也不乏UART的身影,串口的BLE.WIFI.Zigbee.Lor ...

  5. uart串口的调试学习

    用FPGA设计了数据接收和发送模块,FIFO模块,此处FIFO调用的是Show-ahead模式,在下一篇博客中将会分析这个问题. 用串口调试工具发送数据,数据接收模块将接收到的串行数据转换为并行数据( ...

  6. 单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解

    嵌入式设备一般要满足实时性的要求,而实时性是要求数据输入和输出的延时满足一定的要求.当然嵌入式一般都便携性都比PC要好,功能没有PC多,PC是通用,他是专用,一般只专注某些功能的实现,比如DSP专注数 ...

  7. nrf51822裸机教程-UART

    art硬件模块通常都有内置的硬件接收buff,比如51822的硬件uart模块图如下 因为通常接收到uart数据时都会做一些处理.比如保存到数据,或者对数据做一些判断之类的. 如果uart的波特率设置 ...

  8. [tty与uart]3.tty驱动分析

    转自:http://www.wowotech.net/linux_kenrel/183.html 目录: 1 首先分析设备驱动的注册 1.1 uart_register_driver分析 1.2 tt ...

  9. 深入理解7816(1)---- 关于F/D和etu

    对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭.尤其是在看到复位应答中的F和D设置,以及对应的etu的时候,会觉得有些复杂和难以理解. 其实 ...

  10. 蓝牙协议 基于TI cc2540 模块的理解(转)

    源:蓝牙协议 基于TI cc2540 模块的理解 Bluetooth 4.0开发 Platform:TI IC:cc2540 Environment:windows 7 tools:IAR 8.20. ...

随机推荐

  1. centos下安装部署nginx

    1.在安装Nginx之前,要确保已经安装了需要的软件:gcc.pcre-devel.zlib-devel.openssl-devel.如果没有安装,执行下面命令. yum -y install gcc ...

  2. 第一个helloworld程序

    ; hello.asm section .data msg db "hello, world",13,10,0 section .bss section .text global ...

  3. fillder弱网测试

    打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多. 二.设置弱网参数:菜单Rules-> ...

  4. MYSQL-数据操作DDL,DML,DCL,DQL

    前言:MYSQL数据操作语言分为四种 1.DDL(数据定义语言):用来创建数据库中的表.索引.视图.存储过程.触发器等. 2.DML(数据操作语言):用来对表内数据的添加.更新.删除等. 3.DCL( ...

  5. 【广告】UEOI 招聘减章

    欢迎加入UEOI! 招聘目标:>=25人 各位++rp.

  6. WebApi EF Core 2.1 Code First 设置导航属性,外键

    Nuget: Microsoft.AspNetCore.All Microsoft.EntityFrameworkCore//Include 导航属性在此空间 Microsoft.EntityFram ...

  7. bottle库上传文件

    安装bottle库 pip install bottle 上传代码 import bottle @bottle.get('/upload') def upload_get(): return bott ...

  8. Unit mysqld.service could not be found.

    具体命令 service mysqld status systemctl status mysqld 结果 Unit mysqld.service could not be found. 查看mysq ...

  9. react ts 上传

    public MessageObjectPO<UploadPO> OnPostUpload(UploadRO uploadRO) { var response = new MessageO ...

  10. 8. C程序测试用数组个人技巧

    在测试程序的时候经常用到用于测试的数组. 这时,数组定义\声明时,最好不要填上元素个数. 当执行某种循环操作(例如将数组中的元素利用循环插入链表中时), 用sizeof(array_name)/siz ...