如下是我的malab程序,为什么报错,如何修改.:IS=0.25; % 设置前导无话段长度 wlen=200; % 设置帧长为25ms inc=80; % 求帧移 [xx,fs]=audioread('C:\Users\Administrator\Desktop\C4_2_y.wav'); % 读入数据 xx=xx-mean(xx); % 消除直流分量 x=xx/max(abs(xx)); % 幅值归一化 N=length(x); % 取信号长度 time=(0:N-1)/fs; % 设置时间 wnd=hamming(wlen); % 设置窗函数 NIS=fix((IS*fs-wlen)/inc +1); % 求前导无话段帧数 % y=enframe(x,wnd,inc)'; % 分帧 % fn=size(y,2); % 求帧数 th1=1.1; th2=1.3; [voiceseg,vsl,SF,NF,Rum]=vad_corr(x,wnd,inc,NIS,th1,th2);% 自相关函数的端点检测 fn=length(SF); frameTime=FrameTimeC(fn, wlen, inc, fs);% 计算各帧对应的时间 % 作图 subplot 211; plot(time,x,'k'); title('纯语音波形'); ylabel('幅值'); axis([0 max(time) -1 1]); subplot 212; plot(frameTime,Rum,'k'); title('短时自相关函数'); axis([0 max(time) 0 1]); xlabel('时间/s'); ylabel('幅值'); for k=1 : vsl % 标出语音端点 nx1=voiceseg(k).begin; nx2=voiceseg(k).end; subplot 211; line([frameTime(nx1) frameTime(nx1)],[-1 1],'color','r','LineStyle','-'); line([frameTime(nx2) frameTime(nx2)],[-1 1],'color','b','LineStyle','--'); subplot 212; line([frameTime(nx1) frameTime(nx1)],[-1 1],'color','r','LineStyle','-'); line([frameTime(nx2) frameTime(nx2)],[-1 1],'color','b','LineStyle','--'); end

时间: 2024-04-29 11:19:30 浏览: 314
这段 Matlab 代码报错的具体信息没有给出,不过可以看出其中使用了自己编写的 vad_corr 函数,可能是该函数出现了问题导致报错。 需要检查以下几个方面: 1. 确保 vad_corr 函数的输入参数与本代码中调用该函数的参数一致; 2. 检查 vad_corr 函数的输入信号 x 是否已经进行了幅值归一化,如果没有,可以尝试添加该步骤; 3. 检查 vad_corr 函数中使用的自相关函数计算方法是否正确; 4. 检查所有的变量命名是否正确,是否有重名的变量导致了代码出错。 如果以上步骤无法解决问题,建议提供具体的错误信息,以便更好地定位问题。
相关问题

将matlab语句win=sin((0.5:frameLen-0.5)/frameLen*pi).'; frameNum=floor(nsampl/frameLen*2);%帧数 % 最后一帧补零 x=[x;zeros((frameNum+1)*frameLen/2-nsampl,nchan)]; swin=ones((frameNum+1)*frameLen/2,1); swin(1:frameLen/2,1)=win(1:frameLen/2);%整体窗函数 swin(frameNum*frameLen/2+1:end,1)=win(frameLen/2+1:frameLen); %%帧数wlen,帧移wlen/2 y=zeros(frameNum,frameLen,nchan); for i=1:nchan%麦克风通道 for t=0:frameNum-1%帧数 %%% 加窗方法1 frame=x(t*frameLen/2+1:t*frameLen/2+frameLen,i).*win./swin(t*frameLen/2+1:t*frameLen/2+frameLen); y(t+1,:,i)=frame; end end return;改成python语句

以下是将MATLAB代码转换为Python代码的示例: ```python import numpy as np frameLen = 192000 nsampl = 1920000 nchan = 2 pi = np.pi win = np.sin((0.5 + np.arange(frameLen - 0.5)) / frameLen * pi).reshape(-1, 1) frameNum = int(np.floor(nsampl / frameLen * 2)) x = np.concatenate((x, np.zeros(((frameNum + 1) * frameLen // 2 - nsampl, nchan))), axis=0) swin = np.ones(((frameNum + 1) * frameLen // 2, 1)) swin[:frameLen // 2, 0] = win[:frameLen // 2].flatten() swin[frameNum * frameLen // 2:, 0] = win[frameLen // 2:frameLen].flatten() y = np.zeros((frameNum, frameLen, nchan)) for i in range(nchan): for t in range(frameNum): frame = x[t * frameLen // 2:(t * frameLen // 2 + frameLen), i] * win.flatten() / swin[t * frameLen // 2:(t * frameLen // 2 + frameLen)] y[t, :, i] = frame return y ``` 需要注意的是,这只是一个简单的示例,你可能需要根据你的具体需求进行适当的调整和修改。

matlab语句function [y,frameNum]=enframe(x,frameLen) %定义正弦窗 win=sin((0.5:frameLen-0.5)/frameLen*pi).'; frameNum=floor(nsampl/frameLen*2);%帧数 % 最后一帧补零 x=[x;zeros((frameNum+1)*frameLen/2-nsampl,nchan)]; swin=ones((frameNum+1)*frameLen/2,1); swin(1:frameLen/2,1)=win(1:frameLen/2);%整体窗函数 swin(frameNum*frameLen/2+1:end,1)=win(frameLen/2+1:frameLen); %%帧数wlen,帧移wlen/2 y=zeros(frameNum,frameLen,nchan); for i=1:nchan%麦克风通道 for t=0:frameNum-1%帧数 %%% 加窗方法1 frame=x(t*frameLen/2+1:t*frameLen/2+frameLen,i).*win./swin(t*frameLen/2+1:t*frameLen/2+frameLen); y(t+1,:,i)=frame; end end return; 转成python

你可以将上述的MATLAB代码转换为Python代码如下: ```python import numpy as np def enframe(x, frameLen): # 定义正弦窗 win = np.sin((np.arange(0.5, frameLen - 0.5) / frameLen) * np.pi) frameNum = int(np.floor(len(x) / frameLen * 2)) # 帧数 # 最后一帧补零 x = np.concatenate((x, np.zeros(((frameNum + 1) * frameLen // 2 - len(x))))) swin = np.ones(((frameNum + 1) * frameLen // 2,)) swin[:frameLen // 2] = win[:frameLen // 2] # 整体窗函数 swin[frameNum * frameLen // 2:] = win[frameLen // 2:frameLen] y = np.zeros((frameNum, frameLen)) for t in range(frameNum): # 帧数 frame = x[t * frameLen // 2:t * frameLen // 2 + frameLen] * win / swin[t * frameLen // 2:t * frameLen // 2 + frameLen] y[t] = frame return y, frameNum ``` 请注意,由于在MATLAB代码中没有给出变量`nsampl`和`nchan`的定义,无法直接转换为Python代码。你需要根据实际情况进行定义和调整。
阅读全文

相关推荐

/*************************************************************************** * @file bsp_serial1.c * Created on: 2025-03-18 * Author: YL Monitor Software group ****************************************************************************/ #include "main.h" #include "power_data.h" /************************ Private macros *************************/ #if SERIAL1_DMATx_ENABLE //开启串行通信1 DMA 发送中断 -- 1 /* 串行通信 DMA发送缓冲区大小 */ #define SERIAL_TX_BUFF_SIZE 400 #endif #if SERIAL1_DMARx_ENABLE //开启串行通信1 DMA 接收中断 /* 串行通信 DMA接收缓冲区大小 */ #define SERIAL_RX_BUFF_SIZE 400 #endif /************************ Private variables *************************/ #if SERIAL1_DMATx_ENABLE //开启串行通信1 DMA 发送中断 -- 1 /* 串行通信 DMA发送缓存 */ static uint8_t DMA_TxBuff[SERIAL_TX_BUFF_SIZE]; #endif #if SERIAL1_DMARx_ENABLE //开启串行通信1 DMA 接收中断 /* 串行通信 DMA接收缓存 */ static uint8_t DMA_RxBuff[SERIAL_RX_BUFF_SIZE]={0XFF}; //接收缓冲区初始化为非0值(可选,仅在首次接收前需要) //注意:DMA会覆盖有效数据部分,剩余未覆盖部分无需初始化,但处理时仅取rlen长度 //static uint8_t DMA_RxBuff[SERIAL_RX_BUFF_SIZE] = {0xFF}; // 初始化为非0值 #endif /* 串行通信 接收数据队列 */ //static QueueHandle_t queueRecvData = NULL; static SemaphoreHandle_t mutexSerialSend = NULL; /* 串行通信2 数据接收离线状态时间计数器 * 在硬件定时器中进行累加 * DMA接收中断中清零 * 当离线超过5ms,接收结束,或者设备离线,可以进行数据转发至上位机*/ static uint16_t recv_offline_timer_count = 0; /**************************************** * @funName : BSP_HwInitSerial1 * @Description : 串行通信口1 硬件资源初始化 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 ********************************************/ void BSP_HwInitSerial1(void) { GPIO_InitTypeDef GPIO_InitStructure ={0}; USART_InitTypeDef USART_InitStructure ={0}; NVIC_InitTypeDef NVIC_InitStructure ={0}; DMA_InitTypeDef DMA_InitStructure ={0}; /****************Tx****************/ GPIO_InitStructure.GPIO_Pin = SERIAL1_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SERIAL1_TX_PORT, &GPIO_InitStructure); /****************Rx****************/ GPIO_InitStructure.GPIO_Pin = SERIAL1_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(SERIAL1_RX_PORT, &GPIO_InitStructure); /* 串行通信初始化 */ USART_DeInit(SERIAL1); USART_InitStructure.USART_BaudRate = SERIAL1_BAUD_RATE; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(SERIAL1, &USART_InitStructure); #if SERIAL1_IT_ENABLE //开启串行通信1中断 NVIC_InitStructure.NVIC_IRQChannel = SERIAL1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = SERIAL1_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif #if SERIAL1_DMATx_ENABLE //开启串行通信1 DMA 发送中断 /* DMA发送初始化 */ DMA_DeInit(SERIAL1_DMATx_Channel); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&SERIAL1->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DMA_TxBuff; //(uint32_t)(USART3.pbRx) 目标BUF 既是要写在哪个数组中 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = SERIAL_TX_BUFF_SIZE; //DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //内存字节为单位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存字节为单位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA_Mode_Circular DMA_Mode_Normal-工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //4优先级之一的(高优先级) DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非内存到内存 DMA_Init(SERIAL1_DMATx_Channel, &DMA_InitStructure); /* DMA发送中断优先级设置 */ NVIC_InitStructure.NVIC_IRQChannel = SERIAL1_DMATx_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = SERIAL1_DMATx_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(SERIAL1_DMATx_Channel, DMA_IT_TC, ENABLE); //使能DMA1传输完成中 DMA_Cmd(SERIAL1_DMATx_Channel, ENABLE); //启用DMA1通道 #endif #if SERIAL1_DMARx_ENABLE //开启串行通信1 DMA 接收中断 /* DMA接收初始化 */ DMA_DeInit(SERIAL1_DMARx_Channel); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&SERIAL1->DR); //源头是BUF既是(&(SERIAL1->DR)) DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DMA_RxBuff; //(uint32_t)(USART3.pbRx) 目标BUF 既是要写在哪个数组中 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设做源头-外设是作为数据传输的目的地还是来源 DMA_InitStructure.DMA_BufferSize = SERIAL_RX_BUFF_SIZE; //DMA缓存的大小! 单位在下边设定 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设字节为单位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存字节为单位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //循环模式DMA_Mode_Circular DMA_Mode_Normal-工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA_Priority_VeryHigh,DMA_Priority_High,DMA_Priority_Medium(初始使用); ---------------- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非内存到内存 DMA_Init(SERIAL1_DMARx_Channel, &DMA_InitStructure); /* DMA接收中断优先级设置 */ NVIC_InitStructure.NVIC_IRQChannel = SERIAL1_DMARx_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = SERIAL1_DMARx_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(SERIAL1_DMATx_Channel, DMA_IT_TC, ENABLE); //使能DMA1传输完成中 //DMA_ITConfig(SERIAL1_DMARx_Channel, DMA_IT_TC, DISABLE); //禁用DMA1传输完成中 DMA_Cmd(SERIAL1_DMARx_Channel, ENABLE); #endif USART_DMACmd(SERIAL1, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE); //使能USART3的DMA发送,接收请求 //USART_ITConfig(SERIAL1, USART_IT_RXNE, ENABLE); USART_ITConfig(SERIAL1, USART_IT_IDLE, ENABLE); //启用的USART3中断 USART_Cmd(SERIAL1, ENABLE); } /********************************************* * @funName : BSP_SwInitSerial1 * @Description : 串行通信口1 软件资源初始化 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 ************************************************/ void BSP_SwInitSerial1(void) { // if(NULL == queueRecvData) // { // queueRecvData = xQueueCreate(SERIAL_DATA_QUEUE_SIZE, sizeof(uint8_t)); // // /* 数据接收队列创建失败 */ // if(NULL == queueRecvData) // { // } // } if(NULL == mutexSerialSend) { mutexSerialSend = xSemaphoreCreateBinary(); /* 数据发送互斥量创建失败 */ if(NULL == mutexSerialSend) { } else { /* 释放数据发送互斥量 */ xSemaphoreGive(mutexSerialSend); } } } /****************************************** * @funName : SERIAL1_IRQHandler * @Description : 串行通信口1 中断,用于处理空闲接收中断, * 获取DMA接收的数据,并缓存至数据队列 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 **************************************************/ void SERIAL1_IRQHandler(void) { //uint8_t byte = 0; uint16_t i = 0, rlen = 0; //if(USART_GetITStatus(SERIAL1, USART_IT_RXNE) != RESET)//接收数据寄存器不空中断 if(USART_GetITStatus(SERIAL1, USART_IT_IDLE) != RESET)//检查UART4中断是否发生 空闲线路检测中断 { // portBASE_TYPE xRecvWoken = pdFALSE; USART_ReceiveData(SERIAL1);//返回USART3外设最近接收到的数据 // if(recv_offline_timer_count > 45) // { // xQueueReset(queueRecvData); // } // recv_offline_timer_count = 0; #if SERIAL1_DMARx_ENABLE//接收中断 rlen = SERIAL_RX_BUFF_SIZE - DMA_GetCurrDataCounter(SERIAL1_DMARx_Channel); DMA_Cmd(SERIAL1_DMARx_Channel, DISABLE);//禁止DMA1接收 //DMA_ClearFlag(SERIAL1_DMARx_FLAG);//清除DMA2通道的挂起标志 if(recv_offline_timer_count > 45) { MD_PowerDataPush(POWER_DEVICE_1, true, DMA_RxBuff, rlen); } else { MD_PowerDataPush(POWER_DEVICE_1, false, DMA_RxBuff, rlen); } recv_offline_timer_count = 0; // if(recv_offline_timer_count > 45) // { // xQueueReset(queueRecvData); // } // recv_offline_timer_count = 0; // if(rlen > 0 && NULL != queueRecvData) // { // /* DMA接收数据存入数据队列 */ // for(i = 0; i < rlen;i ++)//i++不能写错 // { // //recv_offline_timer_count = 0; // if(errQUEUE_FULL == xQueueSendFromISR(queueRecvData, &DMA_RxBuff[i], &xRecvWoken))//队列从ISR发送 // { // break; // } // } // } DMA_SetCurrDataCounter(SERIAL1_DMARx_Channel, SERIAL_RX_BUFF_SIZE);//设置当前DMA2通道3传输中的数据单元数 DMA_Cmd(SERIAL1_DMARx_Channel, ENABLE); recv_offline_timer_count=0; //清零离线计数器 #else USART_ClearITPendingBit(SERIAL1, USART_IT_RXNE);//清除USART3的中断挂起位 xQueueSendFromISR(queueRecvData, &byte, &xRecvWoken);//调用xQueueGenericSendFromISR()的宏 #endif USART_ClearITPendingBit(SERIAL1, USART_IT_IDLE); } /* 全部数据发送完成,产生该标记 */ // if (USART_GetITStatus(SERIAL1, USART_IT_TC) != RESET)//检查USART3中断是否发生 // { // USART_ClearITPendingBit(SERIAL1, USART_IT_TC); //清除USART3的中断挂起位-传输完全中断 // } } #if SERIAL1_DMATx_ENABLE /***************************************** * @funName : SERIAL1_DMATx_IRQHandler * @Description : 串行通信口1 DMA 发送中断 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/24 *******************************************/ void SERIAL1_DMATx_IRQHandler(void) { portBASE_TYPE xSendWoken = pdFALSE; if(RESET != DMA_GetITStatus(SERIAL1_DMATx_IT_TC)) { /* 关闭 DMA */ DMA_Cmd(SERIAL1_DMATx_Channel, DISABLE); /* 清除标记 */ DMA_ClearITPendingBit(SERIAL1_DMATx_IT_TC); /* 清除数据长度 */ DMA_SetCurrDataCounter(SERIAL1_DMATx_Channel, 0); USART_ITConfig(SERIAL1, USART_IT_TC, DISABLE); if(NULL != mutexSerialSend) { /* 释放 OS 数据发送权限 */ xSemaphoreGiveFromISR(mutexSerialSend, &xSendWoken); portYIELD_FROM_ISR(xSendWoken); } } } #endif /********************************************** * @funName : BSP_Send2Serial1 * @Description : 串行通信口1 DMA发送启动 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 **********************************************/ void BSP_Send2Serial1(uint8_t* sbuf, const uint16_t slen) { uint16_t len = slen; if(slen == 0||NULL == sbuf) { return; } if(len > SERIAL_TX_BUFF_SIZE) { len = SERIAL_TX_BUFF_SIZE; } /******************************************** *获取OS 数据发送权限 * <DMA发送完成后,在串行通信中断服务中释放> *********************************************/ if(NULL != mutexSerialSend) { xSemaphoreTake(mutexSerialSend, portMAX_DELAY); } #if SERIAL1_DMATx_ENABLE // else // { // while(!DMA_GetFlagStatus(SERIAL1_DMATx_IT_TC)); // } #endif #if SERIAL1_DMATx_ENABLE DMA_SetCurrDataCounter(SERIAL1_DMATx_Channel, len); /*发送DMA流的地址不自增*/ //SERIAL1_DMATx_Channel->CCR |= (1 << 10);//----------- /*设置接收和发送的内存地址*/ SERIAL1_DMATx_Channel->CMAR = (uint32_t)sbuf; DMA_Cmd(SERIAL1_DMATx_Channel, ENABLE); USART_DMACmd(SERIAL1, USART_DMAReq_Tx, ENABLE); #else { uint16_t i = 0; while(i < len) { USART_SendData(SERIAL1, sbuf[i]); } if(NULL != mutexSerialSend) { xSemaphoreGive(mutexSerialSend); } } #endif } #if 0 /******************************************** * @funName : BSP_Recv4Serial1 * @Description : 从串口1接收数据队列获取数据 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 **********************************************/ void BSP_Recv4Serial1(uint8_t * rbuf, uint16_t* rlen) { int iCnt = 0, len; *rlen = 0; if(NULL == queueRecvData || NULL == rbuf) { return; } len = uxQueueMessagesWaiting(queueRecvData);//排队等待消息 for(iCnt = 0; iCnt < len; ++iCnt) { if(pdFALSE == xQueueReceive(queueRecvData, &rbuf[iCnt], 0)) { break; } } *rlen = iCnt; } /********************************************* * @funName : BSP_GetCurRecv4Serial1 * @Description : 获取串口1接收数据队列当前数据长度 * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/4/03 *************************************************/ uint16_t BSP_GetCurRecv4Serial1(void) { //等待中的消息队列(通信 接收数据队列) return uxQueueMessagesWaiting(queueRecvData); } #endif /**************************************** * @funName : BSP_SetRecvOffline4Serial1 * @Description : 对数据监听离线状态时间计数进行更新(硬件定时器中执行) * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/4/02 ********************************************/ void BSP_SetRecvOffline4Serial1(void) { ++recv_offline_timer_count; } /********************************************** * @funName : BSP_GetRecvOffline4Serial1 * @Output : 离线状态时间计数 * @Description : 读取数据监听离线状态时间计数(硬件定时器中执行) * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/4/02 *********************************************/ uint16_t BSP_GetRecvOffline4Serial1(void) { return recv_offline_timer_count; } /************************ End of file *************************/ //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART3->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } /*************************************************************************** * @file power_data.c * @brief * **************************************************************************** * @attention * * Created on: 2025-05-12 * Author: YL Monitor Software group * **************************************************************************** * @description * 功率部件的数据信息处理模块 * * ****************************************************************************/ /************************ Includes *************************/ #include "power_data.h" #include "main.h" /************************ Private types *************************/ /************************ Private constants *************************/ /************************ Private macros *************************/ /************************ Private variables *************************/ /* 一级数据缓存:用于功率部件接收数据的实时缓存 */ uint8_t power1_data_cache_L1[POWER_DEVICE_DATA_SIZE] = {0}; uint8_t power2_data_cache_L1[POWER_DEVICE_DATA_SIZE] = {0}; /* 二级数据缓存:用于系统状态监控 */ uint8_t power1_data_cache_L2[POWER_DEVICE_DATA_SIZE] = {0}; uint8_t power2_data_cache_L2[POWER_DEVICE_DATA_SIZE] = {0}; static SemaphoreHandle_t mutex_RW_Power1_L1 = NULL; static SemaphoreHandle_t mutex_RW_Power1_L2 = NULL; static SemaphoreHandle_t mutex_RW_Power2_L1 = NULL; static SemaphoreHandle_t mutex_RW_Power2_L2 = NULL; /* 一级缓存当前数据写入位置 */ uint16_t power1_L1_wPos = 0; uint16_t power2_L1_wPos = 0; /* 二级缓存状态:0xAA已上传,0x55未上传 */ uint8_t power1_L2_status = 0x55; uint8_t power2_L2_status = 0x55; /************************ Functions *************************/ /************************************************************ * @funName : MD_SwInitPowerData * @Input : NULL * * @Output : ***************** * @Description : 数据缓存模块软件资源初始化 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/5/12 * *************************************************************/ void MD_SwInitPowerData(void) { if(NULL == mutex_RW_Power1_L1) { mutex_RW_Power1_L1 = xSemaphoreCreateBinary(); /* 数据读写互斥量创建失败 */ if(NULL == mutex_RW_Power1_L1) { } else { /* 释放数据读写互斥量 */ xSemaphoreGive(mutex_RW_Power1_L1); } } if(NULL == mutex_RW_Power1_L2) { mutex_RW_Power1_L2 = xSemaphoreCreateBinary(); /* 数据读写互斥量创建失败 */ if(NULL == mutex_RW_Power1_L2) { } else { /* 释放数据读写互斥量 */ xSemaphoreGive(mutex_RW_Power1_L2); } } if(NULL == mutex_RW_Power2_L1) { mutex_RW_Power2_L1 = xSemaphoreCreateBinary(); /* 数据读写互斥量创建失败 */ if(NULL == mutex_RW_Power2_L1) { } else { /* 释放数据读写互斥量 */ xSemaphoreGive(mutex_RW_Power2_L1); } } if(NULL == mutex_RW_Power2_L2) { mutex_RW_Power2_L2 = xSemaphoreCreateBinary(); /* 数据读写互斥量创建失败 */ if(NULL == mutex_RW_Power2_L2) { } else { /* 释放数据读写互斥量 */ xSemaphoreGive(mutex_RW_Power2_L2); } } } /************************************************************ * @funName : prvUpdatePowerL2 * @Input : device-功率部件序号 * * @Output : ***************** * @Description : 更新功率部件二级缓存数据 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/5/12 * *************************************************************/ void prvUpdatePowerL2(const uint8_t device) { switch(device) { case POWER_DEVICE_1: { portBASE_TYPE xRecvWoken = pdFALSE; xSemaphoreTakeFromISR(mutex_RW_Power1_L2, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); memcpy(power1_data_cache_L2, power1_data_cache_L1, POWER_DEVICE_DATA_SIZE); power1_L2_status = 0x55;/* 未发送 */ xRecvWoken = pdFALSE; xSemaphoreGiveFromISR(mutex_RW_Power1_L2, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); }break; case POWER_DEVICE_2: { portBASE_TYPE xRecvWoken = pdFALSE; xSemaphoreTakeFromISR(mutex_RW_Power2_L2, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); memcpy(power2_data_cache_L2, power2_data_cache_L1, POWER_DEVICE_DATA_SIZE); power2_L2_status = 0x55;/* 未发送 */ xRecvWoken = pdFALSE; xSemaphoreGiveFromISR(mutex_RW_Power2_L2, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); }break; } } /************************************************************ * @funName : MD_PowerDataPush * @Input : device-功率部件序号 * bFirst-是否为第一个数据 * wbuf-数据 * wlen-数据长度 * * @Output : ***************** * @Description : 更新功率部件一级缓存数据 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/5/12 * *************************************************************/ void MD_PowerDataPush(const uint8_t device, const bool bFirst, const uint8_t* wbuf, const uint16_t wlen) { uint16_t len = wlen; if(wlen <= 0) { return; } switch(device) { case POWER_DEVICE_1: { if(bFirst) { power1_L1_wPos = 0; } if(len > POWER_DEVICE_DATA_SIZE - power1_L1_wPos) { len = POWER_DEVICE_DATA_SIZE - power1_L1_wPos; } portBASE_TYPE xRecvWoken = pdFALSE; xSemaphoreTakeFromISR(mutex_RW_Power1_L1, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); memcpy((uint8_t*)&power1_data_cache_L1[power1_L1_wPos], wbuf, len); power1_L1_wPos += len; xRecvWoken = pdFALSE; xSemaphoreGiveFromISR(mutex_RW_Power1_L1, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); if(POWER_DEVICE_DATA_SIZE <= power1_L1_wPos){ prvUpdatePowerL2(device); } }break; case POWER_DEVICE_2: { if(bFirst) { power2_L1_wPos = 0; } if(len > POWER_DEVICE_DATA_SIZE - power2_L1_wPos) { len = POWER_DEVICE_DATA_SIZE - power2_L1_wPos; } portBASE_TYPE xRecvWoken = pdFALSE; xSemaphoreTakeFromISR(mutex_RW_Power2_L1, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); memcpy((uint8_t*)&power2_data_cache_L1[power2_L1_wPos], wbuf, len); power2_L1_wPos += len; xRecvWoken = pdFALSE; xSemaphoreGiveFromISR(mutex_RW_Power2_L1, &xRecvWoken); portYIELD_FROM_ISR(xRecvWoken); if(POWER_DEVICE_DATA_SIZE <= power2_L1_wPos) { prvUpdatePowerL2(device); } }break; } } /********************功率部件一级缓存数据********************/ /************************************************************ * @funName : MD_ReadPowerL2 * @Input : device-功率部件序号 * rbuf-数据输出缓存 * pos-数据读取位置 * rlen-数据读取长度 * * @Output : ***************** * @Description : 获取功率部件二级缓存数据 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/5/13 * *************************************************************/ bool MD_ReadPowerL2(const uint8_t device, uint8_t *rbuf, const uint16_t pos, const uint16_t rlen) { if(rlen > POWER_DEVICE_DATA_SIZE || pos >= POWER_DEVICE_DATA_SIZE || POWER_DEVICE_DATA_SIZE - pos < rlen) { return false; } switch(device) { case POWER_DEVICE_1: { xSemaphoreTake(mutex_RW_Power1_L2, portMAX_DELAY); memcpy(rbuf, (uint8_t*)&power1_data_cache_L2[pos], rlen); xSemaphoreGive(mutex_RW_Power1_L2); }break; case POWER_DEVICE_2: { xSemaphoreTake(mutex_RW_Power2_L2, portMAX_DELAY); memcpy(rbuf, (uint8_t*)&power2_data_cache_L2[pos], rlen); xSemaphoreGive(mutex_RW_Power2_L2); }break; } return true; } /************************************************************ * @funName : MD_GetPowerL2 * @Input : device-功率部件序号 * rbuf-数据缓存地址 * * @Output : ***************** * @Description : 获取功率部件二级缓存地址 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/5/13 * *************************************************************/ bool MD_GetPowerL2(const uint8_t device, uint8_t *rbuf) { bool ret = false; switch(device) { case POWER_DEVICE_1: { xSemaphoreTake(mutex_RW_Power1_L2, portMAX_DELAY); if(0x55 != power1_L2_status) { ret = false; } else { rbuf = (uint8_t*)power1_data_cache_L2; power1_L2_status = 0xFF; //power1_L2_status = 0x55; ret = true; } xSemaphoreGive(mutex_RW_Power1_L2); }break; case POWER_DEVICE_2: { xSemaphoreTake(mutex_RW_Power2_L2, portMAX_DELAY); if(0x55 != power2_L2_status) { ret = false; } else { rbuf = (uint8_t*)power2_data_cache_L2; power2_L2_status = 0xAA; ret = true; } xSemaphoreGive(mutex_RW_Power1_L2); }break; } return ret; } /************************ End of file *************************/ /*************************************************************************** * @file bsp_hmi_eth.c * @brief **************************************************************************** * @attention * Created on: 2025-03-18 * Author: YL Monitor Software group **************************************************************************** * @description ****************************************************************************/ #include "main.h" /************************ Private macros *************************/ /* 人机交互网络通信 DMA 发送中断缓存大小 */ #if HMI_ETH_DMATx_ENABLE #define HMI_ETH_TX_BUFF_SIZE 64 #endif /* 人机交互网络通信 DMA 接收中断缓存大小 */ #if HMI_ETH_DMARx_ENABLE #define HMI_ETH_RX_BUFF_SIZE 400//64 #endif /************************ Private variables *************************/ #if HMI_ETH_DMATx_ENABLE /* 通信 DMA发送缓存 */ static uint8_t DMA_TxBuff[HMI_ETH_TX_BUFF_SIZE] = {0}; #endif #if HMI_ETH_DMARx_ENABLE /* 通信 DMA接收缓存 */ static uint8_t DMA_RxBuff[HMI_ETH_RX_BUFF_SIZE] = {0}; #endif /* 通信 接收数据队列 */ static QueueHandle_t queueRecvData = NULL; static SemaphoreHandle_t mutexHmiEthSend = NULL; /************************ Functions *************************/ /************************************************************ * @funName : BSP_HwInitHmiEth * @Input : NULL * * @Output : ***************** * @Description : 人机交互网络通信 硬件资源初始化 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 * *************************************************************/ void BSP_HwInitHmiEth(void) { GPIO_InitTypeDef GPIO_InitStructure ={0}; USART_InitTypeDef USART_InitStructure ={0}; NVIC_InitTypeDef NVIC_InitStructure ={0}; DMA_InitTypeDef DMA_InitStructure ={0}; /****************Tx****************/ GPIO_InitStructure.GPIO_Pin = HMI_ETH_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(HMI_ETH_TX_PORT, &GPIO_InitStructure); /****************Rx****************/ GPIO_InitStructure.GPIO_Pin = HMI_ETH_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Mode_IN_FLOATING; GPIO_Init(HMI_ETH_RX_PORT, &GPIO_InitStructure); /* 串行通信初始化 */ USART_DeInit(HMI_ETH); USART_InitStructure.USART_BaudRate = HMI_ETH_BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(HMI_ETH, &USART_InitStructure); #if HMI_ETH_IT_ENABLE NVIC_InitStructure.NVIC_IRQChannel = HMI_ETH_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = HMI_ETH_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //USART_ITConfig(HMI_ETH, USART_IT_IDLE, ENABLE); USART_ITConfig(HMI_ETH, USART_IT_RXNE, ENABLE); #endif #if HMI_ETH_DMATx_ENABLE /* DMA发送初始化 */ DMA_DeInit(HMI_ETH_DMATx_Channel); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&HMI_ETH->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DMA_TxBuff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = HMI_ETH_TX_BUFF_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular DMA_Mode_Normal DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(HMI_ETH_DMATx_Channel, &DMA_InitStructure); /* DMA发送中断优先级设置 */ NVIC_InitStructure.NVIC_IRQChannel = HMI_ETH_DMATx_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = HMI_ETH_DMATx_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(HMI_ETH_DMATx_Channel, DMA_IT_TC, ENABLE); USART_DMACmd(HMI_ETH, USART_DMAReq_Tx, ENABLE); DMA_Cmd(HMI_ETH_DMATx_Channel, DISABLE); #endif #if HMI_ETH_DMARx_ENABLE /* DMA接收初始化 */ DMA_DeInit(HMI_ETH_DMARx_Channel); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&HMI_ETH->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DMA_RxBuff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = HMI_ETH_RX_BUFF_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular DMA_Mode_Normal DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(HMI_ETH_DMARx_Channel, &DMA_InitStructure); /* DMA接收中断优先级设置 */ NVIC_InitStructure.NVIC_IRQChannel = HMI_ETH_DMARx_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = HMI_ETH_DMARx_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(HMI_ETH_DMARx_Channel, DMA_IT_TC, ENABLE); DMA_Cmd(HMI_ETH_DMARx_Channel, ENABLE); USART_DMACmd(HMI_ETH, USART_DMAReq_Rx, ENABLE); #endif USART_Cmd(HMI_ETH, ENABLE); } /************************************************************ * @funName : BSP_SwInitHmiEth * @Input : NULL * * @Output : ***************** * @Description : 人机交互网络通信 软件资源初始化 * * ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 * *************************************************************/ void BSP_SwInitHmiEth(void) { if(NULL == queueRecvData) { queueRecvData = xQueueCreate(HMI_ETH_RX_QUEUE_SIZE, sizeof(uint8_t)); /* 数据接收队列创建失败 */ if(NULL == queueRecvData) { } } if(NULL == mutexHmiEthSend) { mutexHmiEthSend = xSemaphoreCreateBinary(); /* 数据发送互斥量创建失败 */ if(NULL == mutexHmiEthSend) { } else { /* 释放数据发送互斥量 */ xSemaphoreGive(mutexHmiEthSend); } } } /************************************************************ * @funName : HMI_ETH_IRQHandler * @Input : NULL * @Output : ***************** * @Description : 人机交互网络通信 中断,用于处理空闲接收中断, * 获取DMA接收的数据,并缓存至数据队列 ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 *************************************************************/ void HMI_ETH_IRQHandler(void) { if(USART_GetITStatus(HMI_ETH, USART_IT_RXNE) != RESET) { uint8_t byte = 0; uint16_t i = 0, rlen = 0; portBASE_TYPE xRecvWoken = pdFALSE; byte = USART_ReceiveData(HMI_ETH); #if HMI_ETH_DMARx_ENABLE rlen = HMI_ETH_RX_BUFF_SIZE - DMA_GetCurrDataCounter(HMI_ETH_DMARx_Channel); DMA_Cmd(HMI_ETH_DMARx_Channel, DISABLE); DMA_ClearFlag(HMI_ETH_DMARx_FLAG); if(rlen > 0 && NULL != queueRecvData) { /* DMA接收数据存入数据队列 */ for(i = 0; i < rlen; ++i){ //recv_offline_timer_count = 0; if(errQUEUE_FULL == xQueueSendFromISR(queueRecvData, &DMA_RxBuff[i], &xRecvWoken)) { break; } } } USART_ClearITPendingBit(HMI_ETH, USART_IT_IDLE); DMA_SetCurrDataCounter(HMI_ETH_DMARx_Channel, HMI_ETH_RX_BUFF_SIZE); DMA_Cmd(HMI_ETH_DMARx_Channel, ENABLE); #else USART_ClearITPendingBit(HMI_ETH, USART_IT_RXNE); xQueueSendFromISR(queueRecvData, &byte, &xRecvWoken); #endif } /* 全部数据发送完成,产生该标记 */ if (USART_GetITStatus(HMI_ETH, USART_IT_TC) != RESET) { USART_ClearITPendingBit(HMI_ETH, USART_IT_TC); } } #if HMI_ETH_DMATx_ENABLE /************************************************************ * @funName : HMI_ETH_DMATx_IRQHandler * @Input : NULL * @Output : ***************** * @Description : 人机交互网络通信 DMA 发送中断 ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/24 *************************************************************/ void HMI_ETH_DMATx_IRQHandler(void) { portBASE_TYPE xSendWoken = pdFALSE; if(RESET != DMA_GetITStatus(HMI_ETH_DMATx_IT_TC)) { /* 关闭 DMA */ DMA_Cmd(HMI_ETH_DMATx_Channel, DISABLE); /* 清除完成标记 */ DMA_ClearITPendingBit(HMI_ETH_DMATx_IT_TC); /* 清除数据长度 */ DMA_SetCurrDataCounter(HMI_ETH_DMATx_Channel, 0); USART_ITConfig(HMI_ETH, USART_IT_TC, DISABLE); if(NULL != mutexHmiEthSend){ /* 释放 OS 数据发送权限 */ xSemaphoreGiveFromISR(mutexHmiEthSend, &xSendWoken); portYIELD_FROM_ISR(xSendWoken); } } } #endif /************************************************************ * @funName : BSP_Send2HmiEth * @Input : NULL * @Output : ***************** * @Description : 人机交互网络通信 DMA 数据发送 ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 * *************************************************************/ void BSP_Send2HmiEth(uint8_t* sbuf, const uint16_t slen) { uint16_t len = slen; if(len == 0 ||NULL == sbuf) { return; } /******************************************** *获取OS 数据发送权限 * <DMA发送完成后,在串行通信中断服务中释放> *********************************************/ if(NULL != mutexHmiEthSend) { xSemaphoreTake(mutexHmiEthSend, portMAX_DELAY); } #if HMI_ETH_DMATx_ENABLE /* 开启人机交互网络通信 DMA 发送中断 */ else { //检查是否设置了DMA1通道标志 DMA1_IT_TC4 while(!DMA_GetFlagStatus(HMI_ETH_DMATx_IT_TC)); } #endif #if HMI_ETH_DMATx_ENABLE //开启人机交互网络通信 DMA 发送中断 //设置当前DMA1通道传输中的数据单元数 DMA_SetCurrDataCounter(HMI_ETH_DMATx_Channel, len);//DMA1_Channel4 /*发送DMA流的地址不自增*/ HMI_ETH_DMATx_Channel->CCR |= (1 << 10); /*设置接收和发送的内存地址*/ HMI_ETH_DMATx_Channel->CMAR = (uint32_t)sbuf; //启用DMA1通道4 DMA_Cmd(HMI_ETH_DMATx_Channel, ENABLE); //启用USART1的DMA接口 USART DMA传输请求 USART_DMACmd(HMI_ETH, USART_DMAReq_Tx, ENABLE); #else { uint16_t i = 0; while(i < len) { USART_SendData(HMI_ETH, sbuf[i]); } if(NULL != mutexHmiEthSend) { xSemaphoreGive(mutexHmiEthSend); } } #endif } /************************************************************ * @funName : BSP_Send2QueueHmiEth * @Input : NULL * @Output : ***************** * @Description: 从人机交互网络通信接收数据队列获取数据 ***************** * @Athor : YL Software Group * @Version : V0.0.0 * @Data : 2025/3/22 *************************************************************/ void BSP_Recv4HmiEth(uint8_t *rbuf, uint16_t *rlen) { uint16_t iCnt = 0; *rlen = 0; if(NULL == queueRecvData || NULL == rbuf) { return; } for(iCnt = 0; iCnt < HMI_ETH_RX_QUEUE_SIZE; ++iCnt){ if(pdFALSE == xQueueReceive(queueRecvData, &rbuf[iCnt], 0)){ break; } } *rlen = iCnt; } /************************ End of file *************************/ STM32F105 USART3收到400个字节数据后再通过USART1发送给上位机,但上位机最终接收到的400个字节有215个结果都为0,数据发生异常,该如何解决,用标准库写出详细代码和注释

static void pl011_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port); unsigned int lcr_h, old_cr; unsigned long flags; unsigned int baud, quot, clkdiv; if (uap->vendor->oversampling) clkdiv = 8; else clkdiv = 16; baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / clkdiv); if (baud > port->uartclk/16) quot = DIV_ROUND_CLOSEST(port->uartclk * 8, baud); else quot = DIV_ROUND_CLOSEST(port->uartclk * 4, baud); switch (termios->c_cflag & CSIZE) { case CS5: lcr_h = UART01x_LCRH_WLEN_5; break; case CS6: lcr_h = UART01x_LCRH_WLEN_6; break; case CS7: lcr_h = UART01x_LCRH_WLEN_7; break; default: // CS8 lcr_h = UART01x_LCRH_WLEN_8; break; } if (termios->c_cflag & CSTOPB) lcr_h |= UART01x_LCRH_STP2; if (termios->c_cflag & PARENB) { lcr_h |= UART01x_LCRH_PEN; if (!(termios->c_cflag & PARODD)) lcr_h |= UART01x_LCRH_EPS; if (termios->c_cflag & CMSPAR) lcr_h |= UART011_LCRH_SPS; } if (uap->fifosize > 1) lcr_h |= UART01x_LCRH_FEN; spin_lock_irqsave(&port->lock, flags); uart_update_timeout(port, termios->c_cflag, baud); pl011_setup_status_masks(port, termios); if (UART_ENABLE_MS(port, termios->c_cflag)) pl011_enable_ms(port); old_cr = pl011_read(uap, REG_CR); pl011_write(0, uap, REG_CR); if (termios->c_cflag & CRTSCTS) { if (old_cr & UART011_CR_RTS) old_cr |= UART011_CR_RTSEN; old_cr |= UART011_CR_CTSEN; port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; } else { old_cr &= ~(UART011_CR_CTSEN | UART011_CR_RTSEN); port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS); } if (uap->vendor->oversampling) { if (baud > port->uartclk / 16) old_cr |= ST_UART011_CR_OVSFACT; else old_cr &= ~ST_UART011_CR_OVSFACT; } if (uap->vendor->oversampling) { if ((baud >= 3000000) && (baud < 3250000) && (quot > 1)) quot -= 1; else if ((baud > 3250000) && (quot > 2)) quot -= 2; } pl011_write(quot & 0x3f, uap, REG_FBRD); pl011_write(quot >> 6, uap, REG_IBRD); pl011_write_lcr_h(uap, lcr_h); pl011_write(old_cr, uap, REG_CR); spin_unlock_irqrestore(&port->lock, flags); 详细分析这段代码中哪些部分是设置波特率,哪些是设置校验位,哪些是设置停止位,哪些是设置数据位宽,细致拆分出来

大家在看

recommend-type

Labview以太网络MC协议实现三菱FX系列PLC通讯控制,Labview三菱FX系列以太网MC协议通讯实现方案,labview 编写的三菱fx系列,以太网MC协议通讯 ,核心关键词:LabVIEW

Labview以太网络MC协议实现三菱FX系列PLC通讯控制,Labview三菱FX系列以太网MC协议通讯实现方案,labview 编写的三菱fx系列,以太网MC协议通讯 ,核心关键词:LabVIEW; 三菱FX系列; 以太网MC协议通讯; 编程通讯,基于LabVIEW的三菱FX系列以太网MC协议通讯实现
recommend-type

HVDC_高压直流_cigre_CIGREHVDCMATLAB_CIGREsimulink

自己在matlab/simulink中搭建cigre高压直流,如有不足,请多指教
recommend-type

canopenOnF28335-master.zip

CANopen 基于DSP 和canfestival实现
recommend-type

C# Rest方式访问Hbase Microsoft.HBase.Client

C# 使用Microsoft.HBase.Client类库以Rest方式访问HBase数据库。实现了基本的增、删、改、查操作。方便新手入门学习。同时提供了Microsoft.HBase.Client源码。这源码是微软提供的,微软已经拥抱开源。
recommend-type

白盒测试基本路径自动生成工具制作文档附代码

详细设计任务: 1.为模块进行详细的算法设计。 要求:获取一个想要的指定文件的集合。获取E:\experience下(包含子目录)的所有.doc的文件对象路径。并存储到集合中。 思路: 1,既然包含子目录,就需要递归。 2,在递归过程中需要过滤器。 3,满足条件,都添加到集合中。 2.为模块内的数据结构进行设计,对于需求分析,概要设计确定的概念性的数据类型进行确切的定义。 对指定目录进行递归。 (1)通过listFiles方法,获取dir当前下的所有的文件和文件夹对象。 (2)遍历该数组。 (3)判断是否是文件夹,如果是,递归。如果不是,那就是文件,就需要对文件进行过滤。 (4)通过过滤器对文件进行过滤 3编写详细设计说明书 过程设计语言(PDL),也称程序描述语言,又称为“伪码”。它是一种用于描述模块算法设计和处理细节的语言。 for(遍历文件){ if (是文件夹) { 递归 } Else { if (是.doc文件) { 添加到集合中 } } }

最新推荐

recommend-type

地球科学基于Google Earth Engine的Planet NICFI影像可视化脚本:墨西哥地区月度和半年度影像拼接展示系统

内容概要:本文档提供了一套用于在Google Earth Engine平台上可视化Planet/NICFI提供的墨西哥地区月度和半年度影像镶嵌图的脚本。文档首先声明了数据使用的非商业性限制,并提供了访问Planet数据的链接。接着定义了一系列变量,包括不同时间段的影像数据以及颜色配置参数。通过创建左右两个地图面板,允许用户选择不同的影像进行对比查看,同时设置了行政边界和国际边界的显示。最后,初始化了一个分割面板来容纳左右地图,并设置了初始的地图中心位置。 适合人群:地理信息系统(GIS)专业人员,遥感技术研究人员,环境监测与保护工作者。 使用场景及目标:①用于研究特定时间段内的地表变化情况;②帮助科研人员对比分析不同时间点的地貌特征;③支持环境科学领域的教学和研究工作。 阅读建议:此脚本主要用于展示Planet/NICFI影像数据,因此读者应熟悉Google Earth Engine平台的基本操作,同时需要了解如何利用这些影像进行进一步的空间分析。在实际应用中,可以根据自己的研究需求调整影像的选择范围和显示参数。
recommend-type

CAD教学设计1-.doc

CAD教学设计1-.doc
recommend-type

iBatisNet基础教程:入门级示例程序解析

iBatisNet是一个流行的.NET持久层框架,它提供了数据持久化层的解决方案。这个框架允许开发者通过配置文件或XML映射文件来操作数据库,从而将数据操作与业务逻辑分离,提高了代码的可维护性和扩展性。由于它具备与Java领域广泛使用的MyBatis类似的特性,对于Java开发者来说,iBatisNet易于上手。 ### iBatisNet入门关键知识点 1. **框架概述**: iBatisNet作为一个持久层框架,其核心功能是减少数据库操作代码。它通过映射文件实现对象与数据库表之间的映射,使得开发者在处理数据库操作时更加直观。其提供了一种简单的方式,让开发者能够通过配置文件来管理SQL语句和对象之间的映射关系,从而实现对数据库的CRUD操作(创建、读取、更新和删除)。 2. **配置与初始化**: - **配置文件**:iBatisNet使用配置文件(通常为`SqlMapConfig.xml`)来配置数据库连接和SQL映射文件。 - **环境设置**:包括数据库驱动、连接池配置、事务管理等。 - **映射文件**:定义SQL语句和结果集映射到对象的规则。 3. **核心组件**: - **SqlSessionFactory**:用于创建SqlSession对象,它类似于一个数据库连接池。 - **SqlSession**:代表一个与数据库之间的会话,可以执行SQL命令,获取映射对象等。 - **Mapper接口**:定义与数据库操作相关的接口,通过注解或XML文件实现具体方法与SQL语句的映射。 4. **基本操作**: - **查询(SELECT)**:使用`SqlSession`的`SelectList`或`SelectOne`方法从数据库查询数据。 - **插入(INSERT)**:使用`Insert`方法向数据库添加数据。 - **更新(UPDATE)**:使用`Update`方法更新数据库中的数据。 - **删除(DELETE)**:使用`Delete`方法从数据库中删除数据。 5. **数据映射**: - **一对一**:单个记录与另一个表中的单个记录之间的关系。 - **一对多**:单个记录与另一个表中多条记录之间的关系。 - **多对多**:多个记录与另一个表中多个记录之间的关系。 6. **事务处理**: iBatisNet不会自动处理事务,需要开发者手动开始事务、提交事务或回滚事务。开发者可以通过`SqlSession`的`BeginTransaction`、`Commit`和`Rollback`方法来控制事务。 ### 具体示例分析 从文件名称列表可以看出,示例程序中包含了完整的解决方案文件`IBatisNetDemo.sln`,这表明它可能是一个可视化的Visual Studio解决方案,其中可能包含多个项目文件和资源文件。示例项目可能包括了数据库访问层、业务逻辑层和表示层等。而`51aspx源码必读.txt`文件可能包含关键的源码解释和配置说明,帮助开发者理解示例程序的代码结构和操作数据库的方式。`DB_51aspx`可能指的是数据库脚本或者数据库备份文件,用于初始化或者恢复数据库环境。 通过这些文件,我们可以学习到如何配置iBatisNet的环境、如何定义SQL映射文件、如何创建和使用Mapper接口、如何实现基本的CRUD操作,以及如何正确地处理事务。 ### 学习步骤 为了有效地学习iBatisNet,推荐按照以下步骤进行: 1. 了解iBatisNet的基本概念和框架结构。 2. 安装.NET开发环境(如Visual Studio)和数据库(如SQL Server)。 3. 熟悉示例项目结构,了解`SqlMapConfig.xml`和其他配置文件的作用。 4. 学习如何定义和使用映射文件,如何通过`SqlSessionFactory`和`SqlSession`进行数据库操作。 5. 逐步实现增删改查操作,理解数据对象到数据库表的映射原理。 6. 理解并实践事务处理机制,确保数据库操作的正确性和数据的一致性。 7. 通过`51aspx源码必读.txt`学习示例项目的代码逻辑,加深理解。 8. 在数据库中尝试运行示例程序的SQL脚本,观察操作结果。 9. 最后,尝试根据实际需求调整和扩展示例程序,加深对iBatisNet的掌握。 ### 总结 iBatisNet是一个为.NET环境量身定制的持久层框架,它使数据库操作变得更加高效和安全。通过学习iBatisNet的入门示例程序,可以掌握.NET中数据持久化的高级技巧,为后续的复杂数据处理和企业级应用开发打下坚实的基础。
recommend-type

【Dify工作流应用搭建指南】:一站式掌握文档图片上传系统的构建与优化

# 1. Dify工作流应用概述 在现代IT行业中,工作流自动化逐渐成为推动效率和减少人为错误的关键因素。本章将介绍Dify工作流应用的基本概念、核心优势以及应用场景,以助于理解其在企业流程中的重要性。 ## 工作流的定义与重要性 工作流是一系列按照既定顺序完成任务的过程,它旨在实现任务分配、管理和监控的自动化。在企业环境中,工作流应用可以提高任务执行效率、降低
recommend-type

Tree-RAG

<think>我们正在讨论Tree-RAG技术,需要结合用户提供的引用和之前对话中的技术背景。用户之前的问题是关于电力行业设备分析报告中Fine-tuned LLM与RAG的结合,现在转向Tree-RAG技术原理、应用场景及与传统RAG的对比。 根据引用[1]和[4]: - 引用[1]提到GraphRAG与传统RAG的7大区别,指出GraphRAG有更好的数据扩展性,但索引创建和查询处理更复杂。 - 引用[4]提到RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval),这是一种Tree-RAG的实现,通过层次
recommend-type

VC数据库实现员工培训与仓库管理系统分析

### VC数据库实例:员工培训系统、仓库管理系统知识点详解 #### 员工培训系统 员工培训系统是企业用来管理员工教育和培训活动的平台,它使得企业能够有效地规划和执行员工的培训计划,跟踪培训进程,评估培训效果,并且提升员工的技能水平。以下是员工培训系统的关键知识点: 1. **需求分析**:首先需要了解企业的培训需求,包括员工当前技能水平、岗位要求、职业发展路径等。 2. **课程管理**:系统需要具备创建和管理课程的能力,包括课程内容、培训方式、讲师信息、时间安排等。 3. **用户管理**:包括员工信息管理、培训师信息管理以及管理员账户管理,实现对参与培训活动的不同角色进行有效管理。 4. **培训进度跟踪**:系统能够记录员工的培训情况,包括参加的课程、完成的课时、获得的证书等信息。 5. **评估系统**:提供考核工具,如考试、测验、作业提交等方式,来评估员工的学习效果和知识掌握情况。 6. **报表统计**:能够生成各种统计报表,如培训课程参与度报表、员工培训效果评估报表等,以供管理层决策。 7. **系统集成**:与企业其它信息系统,如人力资源管理系统(HRMS)、企业资源规划(ERP)系统等,进行集成,实现数据共享。 8. **安全性设计**:确保培训资料和员工信息的安全,需要有相应的权限控制和数据加密措施。 #### 仓库管理系统 仓库管理系统用于控制和管理仓库内部的物资流转,确保物资的有效存储和及时供应,以及成本控制。以下是仓库管理系统的关键知识点: 1. **库存管理**:核心功能之一,能够实时监控库存水平、跟踪库存流动,预测库存需求。 2. **入库操作**:系统要支持对物品的接收入库操作,包括物品验收、编码、上架等。 3. **出库操作**:管理物品的出库流程,包括订单处理、拣货、打包、发货等环节。 4. **物料管理**:对物料的分类管理、有效期管理、质量状态管理等。 5. **仓库布局优化**:系统应具备优化仓库布局功能,以提高存储效率和拣选效率。 6. **设备管理**:管理仓库内使用的各种设备,如叉车、货架、输送带等的维护和调度。 7. **数据报表**:生成各类数据报表,如库存报表、周转报表、成本报表等,提供管理决策支持。 8. **条码与RFID技术**:通过条码扫描或RFID技术,实现仓库作业的自动化和快速识别。 9. **系统集成**:与供应链管理系统(SCM)、制造执行系统(MES)、订单管理系统等进行集成,提升整个供应链的效率。 #### 文件名称列表解读 1. **第04章仓库管理系统**:这部分内容很可能是整个培训或教学材料中关于仓库管理系统的核心章节。它可能详细介绍了仓库管理系统的功能模块、操作流程、数据结构、安全性和维护等内容。 2. **第03章员工培训系统**:这一章节专注于讲解员工培训系统的设计和实施。可能包含培训系统的架构设计、用户交互设计、数据库设计、安全性考虑、系统测试及案例分析等。 通过对以上系统的学习和应用,可以理解IT系统在企业管理中所扮演的角色,提升企业管理效率和员工技能水平。同时,掌握这些系统的设计与实现,对于IT专业人员来说具有重要的实践价值。
recommend-type

【IFIX 4.5 MB1 驱动更新深度解析】:专家分享关键步骤,避免更新陷阱

# 摘要 本文全面介绍了IFIX 4.5 MB1驱动更新的各个方面,包括技术基础、更新的必要性、实践步骤、避免更新陷阱的策略和案例分析。首先概述了IFIX 4.5 MB1的驱动更新概览和技术架构,强调了更新对于提升系统性能和安全性的重要性。然后,具体阐述了更新前的准备、具体操作步骤以及更新后的验证和问题处理。为规避风险,文章接着提出风险评估、预防措施以及更新后的监控和维护方法。最后,通过成功和失败的案例分析,提供了实用的专
recommend-type

display: grid;瀑布流

<think>我们正在解决使用CSS Grid实现瀑布流布局时的重排问题。瀑布流布局中,项目通常具有不同的高度,并按列排列,每列项目依次填充,形成类似瀑布的效果。使用Grid布局时,如果不采取特殊措施,项目会严格遵循网格轨道,导致出现空白间隙或破坏视觉顺序的重排问题。 引用[1]提到Grid布局提供了强大的布局能力,但需要平衡功能性和性能。引用[2]和引用[3]都提到了瀑布流布局的动态内容排版问题,以及使用容器查询和JavaScript计算的方法。 解决方案思路: 1. 使用Grid布局创建列结构,但允许项目跨越多个行,从而避免严格网格带来的空白。 2. 结合JavaScript动
recommend-type

C++实现高效文件传输源码解析

根据给定的信息,可以看出我们主要讨论的是“C++文件传输源码”。以下是关于C++文件传输源码的详细知识点: 1. C++基础知识点: - C++是一种静态类型的、编译式的、通用的编程语言。 - 它支持面向对象编程(OOP)的多个概念,比如封装、继承和多态。 - 文件传输功能通常涉及到输入输出流(iostream)和文件系统库(file system)。 - C++标准库提供了用于文件操作的类,如`<fstream>`中的`ifstream`(文件输入流)和`ofstream`(文件输出流)。 2. 文件传输概念: - 文件传输通常指的是在不同系统、网络或存储设备间传递文件的过程。 - 文件传输可以是本地文件系统的操作,也可以是通过网络协议(如TCP/IP)进行的远程传输。 - 在C++中进行文件传输,我们可以编写程序来读取、写入、复制和移动文件。 3. C++文件操作: - 使用`<fstream>`库中的`ifstream`和`ofstream`类可以进行简单的文件读写操作。 - 对于文件的读取,可以创建一个`ifstream`对象,并使用其`open`方法打开文件,然后使用`>>`运算符或`getline`函数读取文件内容。 - 对于文件的写入,可以创建一个`ofstream`对象,并同样使用`open`方法打开文件,然后使用`<<`运算符或`write`方法写入内容。 - 使用`<filesystem>`库可以进行更复杂的文件系统操作,如创建、删除、重命名和移动目录或文件。 4. 网络文件传输: - 在网络中进行文件传输,会涉及到套接字编程(socket programming)。 - C++提供了`<sys/socket.h>`(在Unix-like系统中)和`<winsock2.h>`(在Windows系统中)用于网络编程。 - 基本的网络文件传输流程包括:创建服务器和客户端套接字,绑定和监听端口,连接建立,数据传输,最后关闭连接。 - 在C++中进行网络编程还需要正确处理异常和错误,以及实现协议如TCP/IP或UDP/IP来确保数据传输的可靠性。 5. 实现文件传输的源码解读: - C++文件传输源码可能会包含多个函数或类,用于处理不同的文件传输任务。 - 一个典型的源码文件可能会包含网络监听、数据包处理、文件读写等功能模块。 - 代码中可能会涉及多线程或异步IO,以提高文件传输的效率和响应速度。 - 安全性也是重要的考虑因素,源码中可能会实现加密解密机制以保护传输数据。 6. 实践中的应用: - 在实际应用中,C++文件传输源码可能被用于文件共享服务、分布式系统、网络备份工具等。 - 了解和掌握文件传输的源码,可以为开发者提供定制和优化文件传输服务的机会。 - 考虑到性能和资源限制,进行文件传输的源码优化也是必要的,比如在大数据量传输时实现缓冲机制、流控制、重传机制等。 7. 常见问题与调试技巧: - 编写文件传输代码时,常见的问题包括路径错误、权限问题、网络中断和数据不完整等。 - 调试时可以使用C++的断点调试、日志记录和单元测试来检查和确认代码的正确性。 - 处理网络文件传输时,还可能需要借助网络分析工具来诊断网络问题。 以上知识点涵盖了C++文件传输源码的多个方面,包括基础编程、文件操作、网络编程、安全性以及实践应用等。对于想要深入理解和实现C++文件传输功能的开发者来说,这些知识是必备的。掌握这些知识可以大大提高在C++环境下开发文件传输功能的效率和质量。
recommend-type

【IFIX 4.5 MB1 驱动安装与配置指南】:专业步骤解析,确保一次性成功安装

# 摘要 本文针对IFIX 4.5 MB1驱动进行了全面的探讨,涵盖了系统要求、安装前准备、详细的安装步骤、配置与优化,以及案例分析。首先介绍了IFIX 4.5 MB1驱动的功能与应用环境,然后详细阐述了安装前的系统要求、准备工作以及如何获取并验证驱动资源。第三章详细说明了驱动安装向导的使用、系统检测、实际安装操作步骤及后续的验证和测试。第四章则深入探讨了驱动的配置、性能优化、故障排查与修复。最后,在第五章中,通过不同场景下的应用案例,展示了驱动的实际应用价值和与其他设备驱动协同工作的能力,同时对未来驱动的更新和维护提出了展望。本文旨在为技术人员提供一个全面的指南,以确保IFIX 4.5 MB