首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【STM32H7教程】第30章 STM32H7USART应用之八个串口FIFO实现

电阻R130作用是避免CPU复位期间,TX为高阻串口线上出现异常数据。   检测SP3232E好坏可以采用回环方式,即短接T1OUT和R1IN,对应到DB9插座上就是短接引脚2和引脚3。...主要用于RS485切换到发送模式) */ void (*SendOver)(void); /* 发送完毕回调函数指针(主要用于RS485发送模式切换为接收模式) */ void...如果超过了FIFO大小,就需要等待有空间可用,针对这种情况有个重要知识点,就是当缓冲刚刚填满时候要判断发送空中断是否开启了,如果填满了还没有开启,就会卡死while循环中,所以多了一个刚填满判断...函数comSendBuf中调用了一个函数pUart = ComToUart(_ucPort),这个函数是整数COM端口号转换为UART结构体指针。...因为printf函数形参功能很强大,它支持各种数值转换。比如整数、浮点数转换为字符串,支持整数左对齐、右对齐显示等。 我们设计很多裸机例子都是用printf函数输出运行结果

2.9K50

【STM32H7教程】第66章 STM32H7低功耗串口LPUART应用之串口FIFO和停机唤醒实现

电阻R130作用是避免CPU复位期间,TX为高阻串口线上出现异常数据。   检测SP3232E好坏可以采用回环方式,即短接T1OUT和R1IN,对应到DB9插座上就是短接引脚2和引脚3。...由于这里是TTLRS232,如果电脑端自带DB9串口,可以找根交叉线直接接上。如果电脑端没有,就需要用RS232USB串口线。这里要注意是RS232USB,不是TTLUSB。...主要用于RS485切换到发送模式) */ void (*SendOver)(void); /* 发送完毕回调函数指针(主要用于RS485发送模式切换为接收模式) */ void...函数lpcomSendBuf中调用了一个函数pUart = ComToLPUart(_ucPort),这个函数是整数COM端口号转换为LPUART结构体指针。...因为printf函数形参功能很强大,它支持各种数值转换。比如整数、浮点数转换为字符串,支持整数左对齐、右对齐显示等。 我们设计很多裸机例子都是用printf函数输出运行结果

2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    实际工程中 C++ 模板

    我们知道,C++ 模板有个规则是 SFINAE,这不是一个单词,而是 Substitution Failure Is Not An Error 缩写,也就是说,编译器基于模板生成代码,如果模板类型参数置换为给定类型...以扑克牌举例,一种表示方式是基于花色和数字表示,使用一个 uint8_t 表示花色,同时一个 uint8_t 表示数字,另一种是直接基于牌编码方式,也就是牌从 0 编号到 54,只需要一个 uint8...(num, shp); // 仍然能正常编译 虽然我们声明了类型别名,但是这个类型别名本质上还是原来类型,我们仍然无法避免出现前面的错误。...,如果我们想将类型别名作为 std::map key 就会直接报错: // using Number = uint8_t; std::map cardNumCount{}...{}; // 编译出错 这是因为 std::map 要求 key 能够使用 < 进行比较,而当我们直接使用 using 起类型别名,这个 < 就是 uint8_t <,而 StrongAlias<

    2.1K20

    libjpeg:实现jpeg内存解压缩塈转换色彩空间压缩分辨率

    前一篇博客《libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置》实现了jpeg图像内存压缩,本文来讨论jpeg图像内存解压缩过程以及让libjpeg解压缩就将图像灰度或其他色彩空间...图像像素数据保存在类型为std::vector 向量对象中。...align为每行像素数据内存对齐方式,如:为2,以22次幂,就是4字节对齐,默认为0。...对图像解码出现处理方式参见前一篇博客《libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置》。 example,解压缩灰或压缩分辨率 下面代码为调用示例。...图像解压缩就可以图像转换为指定色彩空间,也可以图像分辨率按比例压缩。

    1.4K30

    第10期 | ringbuff,通用FIFO环形缓冲区实现库

    数据类型:比如0x3F表示这是通道1数据,0x4E表示通道2数据; 数据长度:表示后面跟着有效数据长度; 有效数据:有效字节数; 校验数据:省略; 接下来演示如何用环形缓冲区做到不丢包解析。...要想做到不丢包,就需要将200ms内接收到所有数据包都存进缓冲区,所以缓冲区大小至少为:200/10*7 = 140 个字节。 保险起见,可以缓冲区适当扩大一下,设置为150个字节。 3.3....数据处理 数据处理while(1)中进行,每隔200ms缓冲区数据全部读出进行处理: /* USER CODE BEGIN WHILE */ while (1) { /* USER...丢包测试 经过3.2节计算,不丢包最小缓冲区大小是140个字节,接下里我们缓冲区大小修改为100个字节,测试一下是否产生丢包: //开辟一块内存用于缓冲区 #define USART1_BUFFDATA_SIZE...100 //会发生丢包 //#define USART1_BUFFDATA_SIZE 150 //10ms接收7byte协议包不丢包 uint8_t usart1_buffdata[USART1

    1.7K11

    C++数据类型详解:从基本类型到自定义类型

    我们可以使用sizeof关键字来查看每种数据类型占用字节数。...引用可以看作是指针另一种表现形式,它相当于是被引用变量别名,所以不需要使用解引用符。引用类型一般用于函数参数传递和赋值操作,可以减少拷贝和提高程序效率。...C++提供了强制类型转换方法,可以一种数据类型换为另一种数据类型。...main() {     int a = static_cast(3.14);        // 浮点数3.14换为整型     cout << "a值:" << a << endl...了解C++数据类型,有助于提高我们编程效率和代码质量。实际开发中,要选择合适数据类型避免使用不必要数据类型避免数据溢出和精度丢失。

    73830

    C++ 使用Socket实现主机间UDPTCP通信

    文中写函数原型均为windows平台,部分函数返回类型或参数类型POSIX会有不同。 头文件 根据_WIN32标志区分,导入头文件。...默认情况下, buf: 接收数据包缓冲区。 len: buf可以存储最大字节数。到达数据包剩余字节将被丢弃。 flags: 同sendto flags。...buf: 待发送数据起始地址指针。可以是任何能够被转为char*数据类型。 len: 待发送数据大小。尽量避免发送数据大于1300字节数据包,详见p75。...注意:和UDP不同,是数据放到socket输出缓冲区中,由socket库来决定在将来某一刻发出。 len: 传输字节数量。注意:与UDP不同,不需要保持这个值低于链路层MTU。...服务器还是使用linux系统,所有客户端本地windows执行: 注意:server代码linux编译要加入-lpthread.h选项: g++ -g tcpServer_multiConnection.cpp

    2.8K40

    一种高效串口自定义16进制通信协议嵌入式应用开发解决方案

    摘要:本文探讨传统数据收发不足之后,介绍如何使用带FIFO串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法;之后介绍一种特殊串口数据发送方法,可在避免使用串口发送中断情况下,...绝大多数现代单片机(ARM7、Cortex-M3)串口都带有一定数量硬件FIFO,本文介绍如何使用硬件FIFO来减少接收中断次数,提高发送效率。...写入发送FIFO字节个数受FIFO最大深度影响,通常一次写入最多允许16字节。上述列举数据跟具体硬件有关,CPU类型不同,特性也不尽相同,使用前应参考相应数据手册。...这样,当接收到大量数据,每8个字节或者14个字节才会产生一次中断(最后一次接收除外),相比接收一个字节即产生一个中断,这种方法串口接收中断次数大大减少。...256字节 校验:异或和校验(1字节)或者CRC16校验(2字节),本例使用CRC16校验 下面介绍如何接收到数据按照图3-1所示格式打包成一帧。

    2K20

    一种串口高效收发数据思路及方案

    1 本文探讨传统数据收发不足之后,介绍如何使用带FIFO串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法;之后介绍一种特殊串口数据发送方法,可在避免使用串口发送中断情况下,...绝大多数现代单片机(ARM7、Cortex-M3)串口都带有一定数量硬件FIFO,本文介绍如何使用硬件FIFO来减少接收中断次数,提高发送效率。...写入发送FIFO字节个数受FIFO最大深度影响,通常一次写入最多允许16字节。上述列举数据跟具体硬件有关,CPU类型不同,特性也不尽相同,使用前应参考相应数据手册。 3....这样,当接收到大量数据,每8个字节或者14个字节才会产生一次中断(最后一次接收除外),相比接收一个字节即产生一个中断,这种方法串口接收中断次数大大减少。...256字节 校验:异或和校验(1字节)或者CRC16校验(2字节),本例使用CRC16校验 下面介绍如何接收到数据按照图3-1所示格式打包成一帧。

    74420

    第10期 | ringbuff,通用FIFO环形缓冲区实现库

    ) 本文设计一个简单不定长串口协议如下: 数据类型:比如0x3F表示这是通道1数据,0x4E表示通道2数据; 数据长度:表示后面跟着有效数据长度; 有效数据:有效字节数; 校验数据:省略; 接下来演示如何用环形缓冲区做到不丢包解析...要想做到不丢包,就需要将200ms内接收到所有数据包都存进缓冲区,所以缓冲区大小至少为:200/10*7 = 140 个字节。 保险起见,可以缓冲区适当扩大一下,设置为150个字节。 3.3....数据处理 数据处理while(1)中进行,每隔200ms缓冲区数据全部读出进行处理: /* USER CODE BEGIN WHILE */ while (1) { /* USER...丢包测试 经过3.2节计算,不丢包最小缓冲区大小是140个字节,接下里我们缓冲区大小修改为100个字节,测试一下是否产生丢包: //开辟一块内存用于缓冲区 #define USART1_BUFFDATA_SIZE...100 //会发生丢包 //#define USART1_BUFFDATA_SIZE 150 //10ms接收7byte协议包不丢包 uint8_t usart1_buffdata[USART1

    1.2K30

    C++多字节与宽字符串相互转换

    字节字符实际上是由多个字节来表示一个字符,各个国家和地区采用不同编码方案,不同编码方案字符码值是不同,比如常见中国大陆GBK和GB18030、中国台湾同胞Big5,以及国际通用UTF8编码等...C/C++中char*表示多字节字符串,wchar_t*表示宽字符串,由于编码不同,所以char*和wchar_t*之间无法使用强制类型转换。考察如下程序。...//字节编码转换为字节编码 size_t mbstowcs (wchar_t* dest, const char* src, size_t max); //字节编码转换为字节编码 size_t...*************************** *@brief:Unicode指定编码字符串 *@pram:wcpWcs:宽字符串;cpMbs:多字节字符串缓冲区;dBuffLen:多字节字符串缓冲区大小...如果设置为0,函数返回所需缓冲区大小而忽略lpMultiByteStr; lpDefaultChar:指向字符指针,指定编码里找不到相应字符使用此字符作为默认字符替代。

    4.9K21

    C语言不完全类型是什么?有什么用途?

    C语言分为三个不同类型集合: 函数类型、对象类型和不完全类型,具体说明如下所示: 函数类型:函数就是C语言模块、一系列 C 语句集合,有较强独立性,能完成某个特定功能,可以相互调用; 对象类型...不完全类型是暂时没有完全定义好类型,编译器不知道这种类型该占几个字节存储空间,例如以下定义方式: int str[]; //不完全类型数组str定义 … int str[10]; //定义str...3、不完全类型实践应用 举个例子,项目开发中需要用到环形缓存(一种用于表示一个固定尺寸、头尾相连缓冲区数据结构,适合缓存数据流),于是小伙伴这个任务交给了你。...ring_buffer_read(rcb_t *const p_rcb, uint8_t *pdata, size_t len); /* 检查缓存已使用字节数 */ err_t ring_buffer_check...并且,以后修改内部实现也更方便了,甚至外部接口都不需要做更改。 从用户角度,知道细节越少越好,即减少了记忆成本,也避免了一些不必要麻烦。 ---- 本文参考:麦克泰技术文章。

    1.2K30

    GCC -O2 踩坑指南:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)

    1.1 类型双关(type punning) 别名(alias)最常见用途就是类型双关(type punning)。有时我们想绕过类型系统,一个对象解释为不同类型,这就是所谓类型双关。...类型双关经常应用在编译器、序列化、网络传输等领域。 类型双关一般做法是通过别名(alias)来实现,通过获取对象地址,将其转换为我们想要重新解释类型指针,然后访问该值。...int a;float *ptr = (float *)&a;printf("%f\n", *ptr); 2、什么是严格别名 严格别名就是编译器当看到多个别名(alias),会在一定规则下默认它们指向不同内存区域...char 类型严格别名规则下银弹,可以作为任何类型别名。不只是 char 类型,unsigned char,uint8_t, int8_t 也满足这条规则。... C11 标准 3.4.3 小结对未定义行为进行了明确定义: 未定义行为:当使用不可移植或者错误程序/错误数据导致不可预期结果。典型例子就是整数溢出行为。

    1.2K10

    第11章、数据类型

    BINARY填充字节是0x00。字节比较中很重要,包括ORDER BY与DISTINCT操作。0x00与空格比较是不一样,0x00要小于空格。...使用磁盘会导致性能损失,因此只有确实需要查询结果中包含 BLOB或TEXT列。例如,避免使用 SELECT *,它会选择所有列。...MySQL则根据对应模式进行处理: 如果启用严格模式,则将抛出异常并回滚事务; 如果未启用严格模式,MySQL列设置为列数据类型隐式默认值。...当启用严格模式,三条指令均抛出异常并回滚。 当未启用严格模式,仅第三条指令会抛出异常并回滚。前两个语句插入隐式默认值,但第三个失败,因为缺省值(i)不能产生值。...当然这个数据不包括:BLOB、TEXT类型(对于 BLOB、TEXT 列而言,它只65535中贡献9至12字节);对于 BLOB、TEXT类型,真实数据内容并不存储在行缓冲区,故它们值所占用内存不受行缓冲区限制

    1.7K20

    结构体对齐原则在自定义协议解析妙用之法

    根据这样原理,MCU协议数据解析时候就很有作用了,比如下面这个例子,目前小车上用: //结构体,用于存储解析数据 typedef struct { //帧头(固定解析为FF) uint8...while (1) { if(1 == Recv_Flag) { Recv_Flag = 0 ; //接收缓冲区数组强制转换为一个结构体指针...printf("帧尾:0x%x\n", Car_Procol->frame_tail); rx_count = 0 ; } } } 从这里可以看到,串口接收数据是一个字节一个字节进行接收...,所以接收每个数据类型一致,我们就可以直接定义一个结构体,按照协议定义顺序,数据缓冲区数据依次读取出来。...小熊派上运行结果: ? 我写上位机涉及到与MCU进行协议通信时候,经常都是这么干,这个方法不得不说真的超方便。 案例下载 公众号后台回复:protocol 即可获取本节案例下载链接。

    71021

    传输层协议——UDP

    netstat -naup ,显示所有udp服务 a:显示所有的条目 3. pidof 服务器查看服务器进程id,非常方便 输入 pidof +进程 ,获取对应进程和子进程PID 4....报头是固定长度 8字节,剩下就是有效载荷 通过16位UDP长度,整体 减去 8字节 即 有效载荷长度 2. 有效载荷如何做到向上交付?...UDP报头中包含16位目的端口号,一个报文发送到主机上,根据目的端口号向上交付给应用层,绑定该端口号进程 报头(协议)本质:结构化数据 基于 struct 有两种数据类型,一种为结构体,另一种为位段...struct udp_header 结构体 内部 包含 源端口号、目的端口号 、udp长度、校验和 借助位段方式,取整形int4字节16个比特位 缓冲区数据从应用层拷贝给操作系统内部...类型 ,指向结构体中源端口号、目的端口号 、udp长度、校验和 该报文经过网络,经过协议栈被对方收到了 再定义一个指针s,,让s+8,再次指向有效载荷 s强转成 struct udp_header类型

    21810

    使用WebRTC开发Android Messenger:第2部分

    由于释放m_buf结构和安全地重新分配内存之间不需要发生网络通信,因此避免了OpenSSL问题。...如果这是另一种类型,则会导致问题,因为usrsctp发送数据包之前会遍历整个mbuf链。...重置序列号需要完全等于初始化连接设置序列号(INIT或COOKIE_ECHO块中),还需要等于SctpTransport指针低位四个字节。...事实证明,使用FWD_TSN块类型是可行,该类型允许一个对等方请求另一个对等方将其累积TSN最多向前移动4096字节。通过重复发送此块类型,可以累积TSN向前移动足够多位,以使第31位翻转。...假对象将在同一个缓冲区中有一个假vtable,它将指向system,后者运行shell命令。 缺少一环是如何在已知位置填充堆内存。

    1.6K43

    为什么一个还没毕业大学生能够把 IO 讲这么好?

    1 上图 ByteArrayInputStream 封装成 DataInputStream,可以输入字节数组转换为对应数据类型数据。...DataOutputStream、BufferedOutputStream 是处理流,前者可以字节数据转换成基本数据类型写出到文件中;后者是缓冲字节数组,只有缓冲区,才会将所有的字节写出到目的地...,其原理是写出各个数据类型数据统一换为 String 类型,我会在讲解完 字符流对象 字符流对象也会有对应关系,大多数类可以认为是操作数据从字节数组变为字符,类功能和字节流对象是相似的。...在读取文件,读入也是一个一个字节组成字节序列,而 Java 虚拟机通过字节序列,按照2个字节为单位转换为 Unicode 字符,实现字节到字符映射。...,读入数据放入字符缓冲区中,实现高效地读取字符 InputStreamReader 是一种转换流,可以实现从字节流转换为字符流,字节数据转换为字符 Writer Reader 是字符输出流抽象基类

    60130
    领券