串口

1004.串口收发数据集成bug

我与影子孤独终老i 提交于 2019-12-02 15:34:23
最近一个碰到一个串口数据解析的bug,调试了整整7天,从排除问题,优化代码,到真正发现问题所在, 期间经历感觉好像找到了bug,其实是找到的另外一个bug,期间不断排雷, 不断惊喜,不断 失望,以为找到问题所在,其实并没有找到核心问题。 现在对此记录一下。 1 场景描述: 模块功能:以100ms 速度,对外发送各种不同类型数据,都是接受相同类型的数据。 测试: A1 程序运行在ubuntu上,通过usb转串口,连接无线小模块,进行数据收发。 A2 程序运行在另外一台ubuntu上,通过usb转串口,连接无线小模块,进行数据收发。 2 诡异现象描述 每次都在 new 一个对象处出现段错误,由于此对象是由google的protobuf 框提供的技术,进行创建 ,由该第3库进行内存管理, new后,框架进行释放。所以 一开始,将问题定在此处,以为是内存不足导致。经实际以top进行观察,发现内存的 使用率,并不高,大概在0.3%左右进行波动,那么排除内存不足 问题。 错误信息提示,memory corruption (fast) . 显示内存溢出,又继续查看所有的线程中使用的new,发现 仍然一无所获 ,实在 调不 下去了。 3 改变调试思路 1 只运行A1程序,取消串口上的无线小模块,将串口的收发互联进行测试。代码可以一直跑下去,不出错误。 2 使用2台电脑,进行互测取消掉,无线模块

CSR8675 使用串口 UART 收发功能

冷暖自知 提交于 2019-12-02 15:16:11
CSR8675 使用串口 UART 收发功能 CSR8675 实现 UART 功能有两种方式,一种是 托管连接 ,另一种是 直接连接 。 托管连接:不直接操作 Stream,通过 VM 层创建 Source 和 Sink 来实现数据传输,由库进行处理,实现比较方便。 直接连接:直接操作 Stream ,源是一个存储区域,通过对内存进行操作实现数据传输,处理数据传输效率更高。 此处暂时先用 托管连接 的方式来介绍,后面有空再更新 直接连接 。 1、使用 RAW 传输 在工程属性下,将 Transport 属性改为 RAW。 2、打开调试宏 在 sink_debug.h 中加入调试宏 3、编辑串口代码,实现 loopback 功能 主要实现4个函数 消息处理函数 串口初始化函数 串口接收函数 串口发送函数 <sink_uart.h> # ifndef __UART_H_ # define __UART_H_ void UARTStreamMessageHandler ( Task pTask , MessageId pId , Message pMessage ) ; void uart_data_stream_rx_data ( Source src ) ; void uart_data_stream_tx_data ( const uint8 * data , uint16

STM32第一周复习

Deadly 提交于 2019-12-02 14:45:58
资料可以去意法半导体官网 最底层(了解)CM3权威指南/CM4权威指南 芯片参考手册(了解)STM32F10x中文参考手册 官方其他资源教程(了解)固件库包(含参考源码),官方培训PPT 熟练掌握C语言 熟练掌握一种开发环境 库函数和寄存器对比学习 入门一款单片机的学习目标 基本外设 GPIO输入输出, 外部中断 定时器 串口 基本外设接口 SPI IIC WDG FSMC ADC/DAC SDIO 高级功能 UCOS FATFS EMWIN 外什么选择STM32 什么是STM32 Cortex-M3属于ARMv7架构 A系列 面对尖端的基于虚拟内存系统的操作系统和用户 R系列 针对于实时系统 M系列 对微控制器 性价比高,更稳定,所以可以替换ARM7 芯片有哪些资源 ZET6 144个引脚 112个IO 512K 64K RCT6 64个引脚 51个IO 256K 48K 强大的时钟系统 上电复位,掉电复位 低功耗 AD 3个12位 内置参考电压 内置温度 DA 2个12位 DMA 12个DMA通道 定时器 多达11个定时器 通信接口 2个I2C 5个串口 3个SPI 1个CAN2.0 1个USB FS 1个SDIO 最小系统 供电 复位 时钟 boot启动模式选择 下载电路 后备电池 程序下载 串口下载 STM32的ISP下载只能通过串口1,也就是对应的PA9,PA10

STM32+串口空闲中断实现不定长数据接收

北城余情 提交于 2019-12-02 11:41:42
常见的数据帧断帧方式有两种,一种是通过固定的协议格式断帧,另外一个是通过两帧数据的时间断帧,下面介绍最后一种,利用STM32F1的串口空闲中断实现不定长的数据断帧。笔者使用的标准官方库。 空闲中断是接受数据后出现 一个字节 的空闲状态,就会触发空闲中断。利用该特性区分两个不同数据帧。 1.初始化USART ​ 按照官方的初始化流程配置,需要注意一点就是需要开启接收中断和空闲中断。 /** * @brief USART初始化. * @param * @arg BaudRate 波特率 * @retval None */ void Usart_Init ( uint32_t baudrate ) { USART_DeInit ( USART1 ) ; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1 , ENABLE ) ; USART_InitStructure . USART_BaudRate = baudrate ; USART_InitStructure . USART_WordLength = USART_WordLength_8b ; USART_InitStructure . USART_StopBits = USART_StopBits_2 ; USART_InitStructure . USART_Parity =

[pyserial]使用Python控制串口

∥☆過路亽.° 提交于 2019-12-02 11:07:50
最近在折腾树莓派,用到了串口,为了在自己的程序(基于Python)中可以控制串口的收发,便研究了下如何使用Python控制串口 在Python中控制串口,我使用的是pyserial模块,为了方便自己在其他地方的使用,封装了一个串口访问的类方便调用,在这记录下,整体类代码如下,仅供学习交流。 # coding:UTF-8 import serial import time import serial.tools.list_ports ''' 串口功能封装,实现的功能包括 1.自动获取计算机中的列表 2.配置串口参数包括串口号、波特率、数据位、校验位、停止位 3.收发数据 4.打开关闭串口 ''' class serial_tools: ''' 初始化:实例化类后执行的函数,实现功能如下 1.调用串口 2.设置runing状态标志位,判断串口是否处于打开状态,用于后面返回接口状态并根据状态进行打开关闭串口操作 3.打印初始化信息 ''' def __init__(self,window): self.ser=serial.Serial() self.runing=True print('from '+window+' initialing serial tools...') def Com_list(self): ''' 获取串口列表:获取计算机中所有串口,以列表形式返回

STM32 F765的串口DMA+IDLE中断的发送接收不定长数据

别等时光非礼了梦想. 提交于 2019-12-02 11:04:04
项目上正好用到了这个功能,特此记录下来备忘,方便后人 简单说要注意的几个点 串口DMA的初始化 串口IDLE中断的处理 接收和发送的逻辑控制 F7的D-Cache一致性的问题 串口DMA的初始化 我这里用的是串口3 对应的接收和发送DMA mode用的是Normal,不是Circle 初始化完引脚,时钟,DMA后记得使能对应的串口中断 然后还需要编写一个接收使能的函数,如下 执行这个函数会进入一次IDLE中断,这里需要自行处理这种情况 可以通过标志位的方式屏蔽掉这个不正常的进入,或者清除标志位的方式都可以吧 uint8_t UART_Init(void) { uint8_t res = HAL_OK; MX_DMA_Init(); res = MX_USART1_UART_Init(); if (res == HAL_OK) { UART1_RX_EN(); } res = MX_USART3_UART_Init(); if (res == HAL_OK) { UART3_RX_EN(); } return res; } void UART3_RX_EN(void) { __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE); HAL_UART_Receive_DMA(&huart3,Uart3.Rx_Buf,UART_DMA_BUF_LEN); }

串口异或校验字C++代码实现

孤人 提交于 2019-12-02 05:28:00
串口异或效验 C++代码实现 直接上代码片段 QString str="32000"; str += QString::number(ui->lightBox->value()); char* ch; QByteArray ba = str.toLatin1(); ch = ba.data(); j = ch[0]; for (int i = 1; i < str.length(); i++) { j = j^ch[i];//返回10进制的效验码 } //换算16进制 for (; k > 0;) { if (j < 10) { str += "0" + QString::number(j); k = 0; } else if (j > 9 && j < 16) { if (j == 10) str += "0A"; if (j == 11) str += "0B"; if (j == 12) str += "0C"; if (j == 13) str += "0D"; if (j == 14) str += "0E"; if (j == 15) str += "0F"; k = 0; } else { int a = j / 16; int b = j % 16; if (a< 10) { str +=QString::number(a); if (b < 10) { str +

串口助手1.0.0

别等时光非礼了梦想. 提交于 2019-12-01 19:05:10
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ChuanKou { public partial class Serial : Form { public Serial() { InitializeComponent(); } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { } /// <summary> /// form页面加载数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param>