获取盘符,并对盘符进行循环类型监测

本文介绍如何在MFC环境下通过Windows API函数GetLogicalDriveStrings和GetDriveType来获取并判断硬盘盘符的类型,包括可移动、固定、CD-ROM、RAM磁盘或远程磁盘。

MFC下写了段获取盘符的代码,现笔记如下:

采用一下函数

DWORD WINAPI GetLogicalDriveStrings(
  __in          DWORD nBufferLength,
  __out         LPTSTR lpBuffer
);

将系统中有效的盘符以字符串的形式存在buffer中:

UINT WINAPI GetDriveType(
  __in          LPCTSTR lpRootPathName
);

确定一个盘符的类型,有removable, fixed, CD-ROM, RAM disk, or network drive.

Return codeDescription

DRIVE_UNKNOWN

The drive type cannot be determined.

DRIVE_NO_ROOT_DIR

The root path is invalid; for example, there is no volume is mounted at the path.

DRIVE_REMOVABLE

The drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.

DRIVE_FIXED

The drive has fixed media; for example, a hard drive or flash drive.

DRIVE_REMOTE

The drive is a remote (network) drive.

DRIVE_CDROM

The drive is a CD-ROM drive.

DRIVE_RAMDISK

The drive is a RAM disk.

 

函数代码如下:

int CMarsTestDlg::SearchDrive() 
{   
 UINT DriveNumber = NULL;
 TCHAR DriveBuffer[100];
 TCHAR *pDriveName = NULL;
 DWORD DriverLength = sizeof(DriveBuffer);
 int iResult = GetLogicalDriveStrings(DriverLength,(LPTSTR)DriveBuffer);
 if(iResult == 0)
 {
  MessageBox( TEXT("获取盘符出错!"), TEXT("Intretech"), MB_OK);
  return 0;
 }
 pDriveName = DriveBuffer;
 while(*pDriveName != NULL)
 {
  DriveNumber = GetDriveType((LPCTSTR)pDriveName);
  if(DriveNumber == DRIVE_REMOVABLE)
  {
   //监测到可移动盘的代码
  }
  pDriveName += wcslen(pDriveName) + 1;
 }
 return 0;
 

项目是监测公交车平稳度的,我的模块大致就是:当监测到有急刹或这类似于刹车触发时,会判断情况,从而触发JQ8900-16P语音模块进行播报,以此来警示驾驶员的驾驶行为,大致按平常情况例如:当MPU监测到紧急刹车时触发"您急刹了,请注意安全"“请不要频繁制动”,利用中断处理,当然还分为好多种语音触发进行提醒,你在帮我完善完善,用ESP32S3R8n8开发版搭载ESP-IDF5.16版本开发环境开发JQ8900-16P语音模块,其中ESP32S3R8n8的TX引脚为GPIO_01,RX引脚为GPIO_02,JQ8900-16P的TX引脚为GPIO_04,RX引脚为GPIO_03,本项目JQ8900-16P中不使用BUSY引脚,不做IO口对地触发,用的触发方式是串口(uart)触发,芯片中内置u盘存有八条语音,语音放在ZH文件夹下,ZH/ ├── 01.mp3 // "您急刹了,请注意安全" ├── 02.mp3 // "请不要频繁制动" ├── 03.mp3 // "超速警告" ├── 04.mp3 // "急转弯请注意" ├── 05.mp3 // "疲劳驾驶警告" ├── 06.mp3 // "碰撞预警" └── 07.mp3 // "系统故障"实现八个不同的条件进行触发播报,切记采用的是两线串口通信方式,然后帮我写一下实现语音播报功能模块的代码,将jq8900.h文件和jq8900.c文件分开,然后在主函数man.c文件下调用,还有将八条语音触发用switch...case语句写,这样逻辑会更加清晰明了 下面是两线串口通信指令的一些规则: 通信格式 起始码-指令类型-数据长度(n)-数据1-数据n-和检验(SM) 指令码 :固定为AA 指令类型 : 用来区分指令类型 数据长度 :指令中的数据的字节数 数据 :指令中的相关数据,当数据长度为1时,表示只有CMD,没有数据位 和检验 :为之前所有字节之和的低8位,即起始码到数据相加后取低8位 数据格式 :发送的数据或命令,高8位数据在前,低8位在后 8.2通信机制 1、我方做为从机处理,上电默认等待状态,所有播放操作全由主机控制。 2、从机不会主动发起通信,所有通信都是由主机发起 3、串口是3.3V的TTL电平,如果主机系统是5V电平请在中间串1K电阻。 4、如未特别说明,协议中所有数据都是表示十六进制数据 8.3协议约定 以下是本芯片返回和能识别的数据定义 播放状态定义 :系统上电处于停止状态 00(停止) 01(播放) 02(暂停) 盘符定义: 切换盘符后处于停止状态 USB:00 SD:01 FLASH:02 NO_DEVICE:FF 音量:音量总共为31级,0-30级,上电默认为20级 播放模式定义:上电默认为单曲停止 全盘循环(00):按顺序播放全盘曲目,播放完后循环播放 单曲循环(01):一直循环播放当前曲目 单曲停止(02):播放完当前曲目一次停止 全盘随机(03):随机播放盘符内曲目 目录循环(04):按顺序播放当前文件夹内曲目,播放完后循环播放,目录不包含子目录 目录随机(05): 在当前目录内随机播放,目录不包含子目录 目录顺序播放(06):按顺序播放当前文件夹内曲目,播放完后停止,目录不包含子目录 顺序播放(07):按顺序播放全盘曲目,播放完后停止 EQ定义: NORMAL(00) POP(01) ROCK(02) JAZZ(03) CLASSIC(04) 上电默认EQ为NORMAL(00) DAC输出通道定义:上电默认为MP3播放通道(00) MP3播放通道(00): 播放MP3通道,DAC输出的声音为音乐播放的声音 AUX通道(01):DAC输出的声音为P26和P27输入的声音 MP3+AUX(02):AUX通道MP3同时打开,DAC输出的声音是音乐播放的声音和P26、P27输入的声音混合输出 组合播放定义:组合播放是按文件名来组合,文件要求存储在“ZH”文件夹下,可以把要组合的文件名称更改为两个字节的名称,一般建议用数字表示。如: 01.mp3,02.mp3,也可以用两个字母或一个汉字命名 。 8.4通信指令 查询播放状态(01) 指令:AA 01 00 AB 返回:AA 01 01 播放状态 SM 说明:在任何时候都可以查询当前的播放状态 播放(02) 指令:AA 02 00 AC 返回:无 说明:在任何时候发此命令都会从头开始播放当前曲目 暂停(03) 指令:AA 03 00 AD 返回:无 停止(04) 指令:AA 04 00 AE 返回:无 上一曲(05) 指令:AA 05 00 AF 返回:无 下一曲(06) 指令:AA 06 00 B0 返回:无 指定曲目(07) 指令:AA 07 02曲目高 曲目低 SM 返回:无 例如: AA 07 02 00 08 BB指定播放当前盘符第8首,曲目数从1-65535 指定盘符指定路径播放(08) 指令:AA 08 长度 盘符 路径 SM 返回 :无 说明:长度=盘符长度+路径长度=1+路径长度 例如:/广告/小米手机.mp3,可以按如下格式 /广告*/小米*???, “广告*”代表前两个字为 “广告的文件夹”,*为通配符, “小米*???”代表文件前两个字为”小米”的文件,后面三个?号表示格式不限制,本芯片支持MP3和WAV两种格式。用上位机取模数据如下: 上位机生成的指令为:0xAA, 0x08, 0x10, 0x01, 0x2F, 0xB9, 0xE3, 0xB8, 0xE6, 0x2A, 0x2F, 0xD0, 0xA1, 0xC3, 0xD7, 0x2A, 0x3F, 0x3F, 0x3F, 0x77, 具体格式和方法参考附件“JQ8400路径格式说明.PDF” 查询当前在线盘符(09) 指令:AA 09 00 B3 返回: AA 09 01盘符 SM 说明:在线盘符是按位来区分的:USB:BIT(0) SD:BIT(1) FLASH:BIT(2) 此功能可以知道当前在线盘符,在切换盘符前建议先查询一下在线盘符 查询当前播放盘符(0A) 指令: AA 0A 00 B4 返回:AA 0A 01盘符 SM 切换到指定盘符(0B) 指令:AA 0B 01盘符 SM 返回: 无 说明:盘符切换指令,如果当前盘符在线,可以切换到相对应的盘符等待播放,切换后曲目为第1首,建议切 换前先查询一下盘符是否在线。 例如: AA 0B 01 00 B6 切换到U盘,切换后处于停止状态 AA 0B 01 01 B7 切换到TF卡,切换后处于停止状态 AA 0B 01 02 B8 切换到FLASH卡,切换后处于停止状态 查询总曲目(0C) 指令:AA 0C 00 B6 返回:AA 0C 02总曲目高 总曲目低 SM 查询当前曲目(0D) 指令:AA 0D 00 B7 返回:AA 0D 02 曲目高 曲目低 SM 上一文件夹目录(0E) 指令:AA 0E 00 B8 返回: 说明:切换后会播放文件夹里的第一首 下一文件夹目录(0F) 指令:AA 0F 00 B9 返回: 说明:切换后会播放文件夹里的第一首 结束播放(10) 指令:AA 10 00 BA 说明:此指令可以提前结束当前操作,会结束当前播放,如果是在插播等则会提前结束插播返回原来状态 查询文件夹目录首曲目(11) 指令:AA 11 00 BB 返回:AA 11 02 曲目高 曲目低SM 说明:为当前目录的第一首歌曲的序号 查询文件夹目录总曲目(12) 指令:AA 12 00 BB 返回:AA 12 02 曲目高 曲目低SM 说明:此曲目不包含子目录里的文件数 音量设置(13): 指令:AA 13 01 VOL SM 返回:无 例如:AA 13 01 14 D2 设置音量为20级 音量加(14): 指令:AA 14 00 BE 返回:无 音量减(15): 指令:AA 15 00 BF 返回:无 指定曲目插播(16) : 指令:AA 16 03 盘符 曲目高 曲目低 SM 返回:无 例如:AA 16 03 00 00 09 CC 插播U盘里的第9首 说明:插播结束后返回插播点继续播放 指定路径插播(17) : 指令:AA 17 长度 盘符 路径 SM 返回 :无 说明:长度=盘符长度+路径长度=1+路径长度 发送的指令为:0xAA, 0x17, 0x10, 0x02, 0x2F, 0xB9, 0xE3, 0xB8, 0xE6, 0x2A, 0x2F, 0xD0, 0xA1, 0xC3, 0xD7, 0x2A, 0x3F, 0x3F, 0x3F, 0x87, 结束插播: 指令:用结束播放指令 返回 :无 说明:在插播过程中可以提前结束插播 设置循环模式(18): 指令:AA 18 01 循环模式 SM 返回:无 举例:设置为单曲停止 : AA 18 01 03 C6 设置循环次数(19): 指令:AA 19 02 次数高 次数低 SM 返回:无 说明:此指令只在播放模式为 全盘循环、单曲循环、目录循环时有效、顺序播放。 例如:AA 19 02 00 06 CB 循环6次 EQ设置(1A) 指令:AA 1A 01 EQ SM 返回:无 例如:AA 1A 01 02 C7 设置EQ为ROCK 组合播放(1B) 指令:AA 1B 长度 曲目1名称高字节,曲目名称1低字节..... 曲目n名称高字节,曲目n名称低字节 SM 返回 :无 例如:AA1B04303130328C,文件名为“01”、“02”歌曲组合播放 说明:文件名组合会方便很多,比文件序号组更准确,不受拷贝顺序限制。 结束组合播放(1C) 指令:AA 1C 00 C6 返回:无 说明:结速组合播放,返回组合前的播放状态 设置通道(1D) 指令:AA 1D 01 通道 SM 返回:无 查询歌曲短文件名(1E) 指令:AA 1E 00 C8 返回:AA 1E 短文件名长度 短文件名 SM 选曲不播放(1F) 指令:AA 1F 02 曲目高 曲目低 SM 返回:无 复读控制(20) 指令:AA 20 04 起始分 起始秒 结束分 结束秒 SM 返回:无 结束复读(21) 指令:AA 21 00 CB 返回:无 指定时间快退(22) 指令:AA 22 02 时间高8位 时间低8位 SM 返回:无 说明:单位为秒 指定时间快进(23) 指令:AA 23 02 时间高8位 时间低8位 SM 返回:无 说明:单位为秒 获取当前曲目总时间(24) 指令:AA 24 00 CE 返回:AA 24 03 时 分 秒 SM 开启播放时间发送(25) 指令:AA 25 00 CF 返回:AA 25 03 时 分 秒 SM 说明:开启播放时间发送,时间更新时会自动返回 关闭播放时间发送(26) 指令:AA 26 00 D0 返回:无 说明:关闭播放时间发送
05-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值