STM32CubeMX中两种USB HID设备类的区别?

我想用STM32CubeMX代码生成工具生成USB的HID设备类驱动代码,发现在USB DEVICE下拉列表框选项中,有2中HID设备类选项可以选择,分别是Custom Human Interface Device Class和Human Interface Device Class,我查了USB官网上对USB设备类的列表,发现只有Human Interface Device Class这一种标准HID类设备。那么,工具中的Custom Human Interface Device Class是什么类型的HID设备呢?是否是用户可以自定义的HID类设备,它跟标准的HID类设备有什么异同?有没有这方面的资料可供参考呢?
STM32CubeMX中所支持的USB设备类

1个回答

Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID/DID。
Composite Device内只有一个Function,只有一套PID/VID/DID,通过将不同的interface定义为不同的类来实现
多个功能的组合。

Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID/DID。

Composite Device内只有一个Function,只有一套PID/VID/DID,通过将不同的interface定义为不同的类来实现多个功能的组
合。

很多人认为一个USB接口上实现多个设备,就是指复合设备,其实,这是不确切的,虽然USB Compound Device和USB Composite Device
都会被百度翻译为USB复合设备。

在一个USB接口上实现多个设备有2中方法,一种是Compound Device,就是复合设备;另一种是Composite Device,就是组合设备。

在USB2.0的标准协议中,定义如下:

When multiple functions are combined with a hub in a single package, they are referred to as a compound device.



A device that has multiple interfaces controlled independently of each other is referred to as a



composite device.
所以,复合设备其实就是几个设备通过一个USB Hub形成的单一设备;组合设备也就是具有多个接口的设备,每个接口代表一个独立的设备。

显然,如果是想同样的功能的话,组合设备的方法要简单很多(可以去看一下USB2.0协议中,USB2.0 Hub的复杂度)。

STM32F103实现的USB转多路串口,属于USB Composite Device,不内嵌Hub,三个CDC设备的PID和VID都是相同。

USB设备可以定义一个复合设备,复合设备分两种,一种是一个设备多个配置,还有一种是一个配置多个接口,在本例中采用一个配置多个接口的方式

首先修改设备描述符,标准设备描述符和报告描述符都不需要修改,只需要修改配置描述符即可

//usb配置描述符

const u8 DinkUsbConfigDescriptor[DINK_USB_SIZ_CONFIG_DESC] = {

/***************配置描述符***********************/

USB_CONFIGUARTION_DESC_SIZE, //bLength字段。配置描述符的长度为9字节。

USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段。配置描述符编号为0x02。

//wTotalLength字段。配置描述符集合的总长度,

//包括配置描述符本身、接口描述符、类描述符、端点描述符等。

WBVAL(

USB_CONFIGUARTION_DESC_SIZE + //配置描述符

USB_INTERFACE_DESC_SIZE + //接口1描述符

+ //hid描述符

USB_ENDPOINT_DESC_SIZE + //端点描述符

USB_ENDPOINT_DESC_SIZE + //端点描述符

USB_INTERFACE_DESC_SIZE + //接口描述符2

USB_ENDPOINT_DESC_SIZE + //端点描述符1

USB_ENDPOINT_DESC_SIZE //端点描述符2

),

0x02, //bNumInterfaces字段。该配置包含的接口数,复合设备,两个接口。

0x01, //bConfiguration字段。该配置的值为1。

0x00, //iConfigurationz字段,该配置的字符串索引。这里没有,为0。

USB_CONFIG_BUS_POWERED , //bmAttributes字段,该设备的属性

USB_CONFIG_POWER_MA(500), //bMaxPower字段,该设备需要的最大电流量



/*********************第一个接口描述符,hid设备**********************/

USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的长度为9字节。

USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的编号为0x04。

0x00, //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。

0x00, //bAlternateSetting字段。该接口的备用编号,为0。

0x02, //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点



USB_DEVICE_CLASS_HUMAN_INTERFACE, //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,



0x00, //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,

//只规定了一种子类:支持BIOS引导启动的子类。

//USB键盘、鼠标属于该子类,子类代码为0x01。

//但这里我们是自定义的HID设备,所以不使用子类。



0x00, //bInterfaceProtocol字段。如果子类为支持引导启动的子类,

//则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。

//自定义的HID设备,也不使用协议。



0x00, //iConfiguration字段。该接口的字符串索引值。这里没有,为0。



/*********************HID报告描述符*************************/

//bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。

0x09,



//bDescriptorType字段。HID描述符的编号为0x21。

0x21,



//bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。

0x10,

0x01,



//bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。

0x21,



//bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。

0x01,



//bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。

0x22,



//bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。

sizeof(HID_ReportDescriptor)&0xFF,

(sizeof(HID_ReportDescriptor)>>8)&0xFF,

/*********************端点描述符**********************************/

/* 端点描述符 /

USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。

USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。

USB_ENDPOINT_IN(1), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0为端点传输类型选择。

WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

0x01, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。

/
**********************端点描述符*******************************************/

USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。

USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。

USB_ENDPOINT_OUT(1), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0为端点传输类型选择。

WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

0x01, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。

/*******************第二个接口描述符 存储设备*********************/

USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的长度为9字节。

USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的编号为0x04。

0x01, //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。

0x00, //bAlternateSetting字段。该接口的备用编号,为0。

0x02, //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点



USB_DEVICE_CLASS_STORAGE, //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,

MSC_SUBCLASS_SCSI, //bInterfaceSubClass字段。SCSI透明命令集的子类代码为0x06。

MSC_PROTOCOL_BULK_ONLY, //bInterfaceProtocol字段。协议为仅批量传输,代码为0x50。

0x04, //iConfiguration字段。该接口的字符串索引值



/************************************* 端点描述符 *********************************************/

USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。

USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。

USB_ENDPOINT_IN(2), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

USB_ENDPOINT_TYPE_BULK, //bmAttributes字段。D1~D0为端点传输类型选择。

WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

0x00, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。



/************************************端点描述符********************************************************/

USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。

USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。

USB_ENDPOINT_OUT(2), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

USB_ENDPOINT_TYPE_BULK, //bmAttributes字段。D1~D0为端点传输类型选择。

WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

0x00, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。

};
修改描述符之后要同时记得修改描述符的长度,然后修改usb_prop文件,主要是两个多出来的命令GET_MAX_LEN用来获取当前存储设备的个数,还有一个用来复位当前存储设备,如下

RESULT DinkUsbData_Setup(u8 RequestNo)

{

u8 (*CopyRoutine)(u16);



CopyRoutine = NULL;

if ((RequestNo == GET_DESCRIPTOR)

&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

//获取报告描述符

if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)

{

CopyRoutine = DinkUsbGetReportDescriptor;

}

//获取HID描述符

else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)

{

CopyRoutine = DinkUsbGetHIDDescriptor;

}



}

/
** GET_PROTOCOL ***/

else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))

&& RequestNo == GET_PROTOCOL)

{

CopyRoutine = DinkUsbGetProtocolValue;//获取协议值

}

else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))

&& (RequestNo == GET_MAX_LUN) && (pInformation->USBwValue == 0)

&& (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x01))

{

CopyRoutine = Get_Max_Lun;

}





if (CopyRoutine == NULL)

{

return USB_UNSUPPORT;

}



pInformation->Ctrl_Info.CopyData = CopyRoutine;

pInformation->Ctrl_Info.Usb_wOffset = 0;

(*CopyRoutine)(0);

return USB_SUCCESS;

}
GET_MAX_LEN的函数体为

u8 Get_Max_Lun(u16 Length)

{

if (Length == 0)

{

pInformation->Ctrl_Info.Usb_wLength = LUN_DATA_LENGTH;

return 0;

}

else

{

return((u8
)(&Max_Lun));

}

}

renjiajin
renjiajin 回复zzzw0: 是的,浪费别人时间!
8 个月之前 回复
zzzw0
zzzw0 答非所问,不知道从哪复制过来的,浪费我时间看完了
大约一年之前 回复
polarisyj86
polarisyj86 我这个当然是一个composite device,通过定义不同的类,使用多个interface来实现不同的功能,所以说,那两个HID类有什么区别呢?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
观察到一个现象:usb HID设备在成功枚举完了之后就与主机不通讯了,怎么重新开始通讯呢?
stm32f103zet6,开发环境mdk517,用的是st官方给的hid的键盘的例程,usb能成功被枚举,而且显示有一个标准的输入设备,但是我再debug模式下起初在枚举阶段我能看到在中断函数中设置的中断点出停下来,说明主机给设备发了一些东西,但是当主机成功枚举之后,pc上显示这个设备运转正常,这个时候再在中断函数中任何地方设置断点都没有作用,也就是说这时主机就没有给设备发in包,那岂不是直接忽略了这个设备了?那这个设备的动作怎么发到主机上啊?我试过从设备管理器中禁用设备时,设备有发生中断,启用时也是,但是不管时就没数据交流,那么要实现鼠标的功能的话,鼠标动了主机根本不知道啊,怎么搞?
嵌入式linux与stm32 usb通信
linux为主机,stm32为从机,实现以下:stm32为一个无线传输设备,最大256字节,将接收到的数据通过usb发送给linux,linux将需要发送的信息通过usb发送给stm32。 (linux的usb-skeleton.c已经看过)有以下疑惑: 1.应用程序,发送可以直接使用write,那么我要接收怎么实现?一直read么?还是驱动中一直读取,然后告诉应用程序,具体实现方法? 2.使用那种方式比较好?HID、CDC什么的? 3.usb通信只能有主机发起,如何保证及时接收到数据? 4.usb一包数据是64字节,大于64字节需要分包发送,要如何判断接收到了完整的一包。
window环境下,触摸屏USB驱动开发,该设备属于HID类吗
大家好,最近在windos环境下开发USB驱动,目标设备是触摸屏,该触摸屏和PC机通过USB接口通讯。主要是上报触摸数据,以及PC机发送一些重要的数据到设备,进行存储。 我知道window提供了许多标准的设备类(Device Setup Classes)的驱动,其中鼠标、键盘等USB接口设备都是HID类设备,存在疑问的是,我这样的设备要求HID设备类能否满足,还是我应该在开发一个新的类
usb hid 报告字节数 变长传输
想请教一个关于hid通信过程中报告传输数据的字节数的问题。 1.下位机规定报告字节数最大为64字节 2.通信协议是不定长的,每条命令返回值长度不同,下位机不会自动补全64字节。 ** Q1、我在编写上位机过程中使用windows的 ReadFile 读取的时候,发现下位机返回数据不够64字节的时候ReadFile没有数据,只有够了64字节才会读到数据。而我想实现的是能够读取下位机返回的变长数据,因为下位机没有补全64字节,我可以怎么尝试?** 我自己也在网上查找了一些资料,了解到可能是ReadFile读取数据格式是{报告id+报告长度}的整数倍,下位机返回数据不够64字节就不放在ReadFile的缓冲区中?我使用bus hound监测,发现我的设备有两个选项,1.USB人体学输入设备 2.HID-compliant-device。在使用程序发送数据时,1能够监测到任何发送数据以及返回数据,而2只能够监测到发送数据,以及返回字节数满64字节的返回数据,不够64的就没有显示。 **Q2、想请问下 1.USB人体学输入设备 2.HID-compliant-device这两个东西直接的关系及区别?** 希望了解的人帮忙解答下,万分感谢!
C++ 如何读取HID USB设备的数据
这种设备是HID USB设备,它里面存了一些信息,无需驱动(和扫码枪类似),将卡贴在上面就可以显示出卡号,请问这个设备我要怎么获取里面的数据啊,不要说什么让控件获取焦点,我这个程序没有用户界面。谢谢了。 ![HID设备](https://img-ask.csdn.net/upload/201804/24/1524559698_243133.jpg)
用qt编写的Windows软件,需要与鼠标通讯,怎么实现软件与hid设备的usb通讯
当该hid设备通过usb连接到电脑时,软件可以检测到该设备,并且做出相应的响应,可以通讯,我是新手,求教大神们,就该如何下手。。。
安卓主板外接USB HID接口的红外触摸框,程序如何获取触摸框原始数据
公司自主研发的,安卓主板外接 红外触摸框,触摸框接口是通过usb hid串口方式连接与 发送数据的,请教下应用程序如何在触摸时能够获取触摸框的原始数据,而不是经过底层 处理后的MotionEvent中的触摸数据。之前尝试过用usbdevice 获取数据,但是在调用 openDevice()方法后,触摸框就不能与系统进行交互了(触摸失效),触摸框的数据只能被对应的程序获取到,。。。而且最近系统升级到了5.0版本的,程序虽然可以识别到触摸框设备,但是对应的usbdevice对象中的interface却是空的,怎么解决,希望有大神能够解答
C++关于HID编程,程序与USB设备通讯
要编写一个与USB设备通讯的程序,是不是要在DDK的环境下编写??请问哪里可以下载到 DDK???我在网上搜了一些资料,有些地方我没看明白 #pragma comment(lib, "hid.lib") #pragma comment(lib, "setupapi.lib") #include <stdio.h> #include <windows.h> #include <setupapi.h> #include <tchar.h> extern "C" { #include <hidsdi.h> } 代码中的#pragma comment(lib, "hid.lib") #pragma comment(lib, "setupapi.lib") extern "C" { #include <hidsdi.h> } 是什么意思,我之前没用用过这种语法规范
STM32 串口收发数据出错
#include "stm32f10x.h" #include <stdio.h> /************************************************* 函数: void RCC_Configuration(void) 功能: 复位和时钟控制 配置 参数: 无 返回: 无 **************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量 RCC_DeInit(); //复位RCC外部设备寄存器到默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好 if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好 { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后 FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时 RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟 while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟 { } } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures NVIC and Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //通道设置为串口3中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断 NVIC_Init(&NVIC_InitStructure); //初始化 } /******************************************************************************* 函数名:USART3_Configuration 输 入: 输 出: 功能说明: 初始化串口硬件设备,启用中断 配置步骤: (1)打开GPIO和USART3的时钟 (2)设置USART3两个管脚GPIO模式 (3)配置USART3数据格式、波特率等参数 (4)使能USART3接收中断功能 (5)最后使能USART3功能 */ void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第1步:打开GPIO和USART部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第3步:将USART Rx的GPIO配置为浮空输入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第4步:配置USART3参数*/ USART_InitStructure.USART_BaudRate = 9600; 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(USART3, &USART_InitStructure); /* 若接收数据寄存器满,则产生中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 第5步:使能 USART3, 配置完毕 */ USART_Cmd(USART3, ENABLE); /* 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART3, USART_FLAG_TC); // 清标志 } /*******************************************************************/ /* */ /* STM32向串口3发送1字节 */ /* */ /* */ /*******************************************************************/ void Uart3_PutChar(u8 ch) { USART_SendData(USART3, (u8) ch); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } /*******************************************************************/ /* */ /* STM32在串口3接收1字节 */ /* 说明:串口3接收中断 */ /* */ /*******************************************************************/ void USART3_IRQHandler(void) { u8 dat; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收数据寄存器满 { dat = USART_ReceiveData(USART3); Uart3_PutChar(dat); } } /************************************************* 函数: int main(void) 功能: main主函数 参数: 无 返回: 无 **************************************************/ int main(void) { u8 abc[]={0x11,0x12,0x13,0x14}; u8 i; RCC_Configuration(); NVIC_Configuration(); USART3_Configuration(); for(i=0;i<4;i++) {Uart3_PutChar(abc[i]);} while(1); }
Linux系统usb设备白名单
linux系统中怎样根据PID和VID做USB设备的白名单。只有在白名单里的usb设备才能上报数据。像鼠标键盘不在白名单里,插入鼠标键盘要不能上报数据。能实现???
STM32定时器1控制电机输出两路PWM波形问题
本人刚学stm32,用定时器1的CH1和CH2输出pwm波形是不知道为什么没有高电平输出,电机根本不转求大家看看 #include "include.h" /* 硬件连接: (PE9->EN1---TIME1_CH1 右) (PE11->EN2---TIME1_CH2 左) PA4->INT4 PA5->INT3 PA6->INT2 PA7->INT1 */ /*0011 1010--->_,_,EN1,EN2,INT4,INT3... */ void PWM_Foward(void) { GPIO_SetBits(GPIOA , GPIO_Pin_4|GPIO_Pin_6); GPIO_ResetBits(GPIOA , GPIO_Pin_5|GPIO_Pin_7); } /*0011 0101--->_,_,EN1,EN2,INT4,INT3... */ void PWM_Back(void) { GPIO_SetBits(GPIOA , GPIO_Pin_5|GPIO_Pin_7); GPIO_ResetBits(GPIOA , GPIO_Pin_4|GPIO_Pin_6); } /*0011 0110--->_,_,EN1,EN2,INT4,INT3... */ void PWM_Left(void) { GPIO_SetBits(GPIOA , GPIO_Pin_5|GPIO_Pin_6); GPIO_ResetBits(GPIOA , GPIO_Pin_4|GPIO_Pin_7); } /*0011 1001--->_,_,EN1,EN2,INT4,INT3... */ void PWM_Right(void) { GPIO_SetBits(GPIOA , GPIO_Pin_4|GPIO_Pin_7); GPIO_ResetBits(GPIOA , GPIO_Pin_5|GPIO_Pin_6); } /*参考固件库使用手册247*/ void Timer1_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /*Time1_Init*/ /*将寄存器重新设为缺省值*/ TIM_DeInit(TIM1); /*预分频为72M/3600=20KHZ*/ TIM_TimeBaseStructure.TIM_Prescaler=3600-1; /*时钟分割,采样频率设置,滤掉外界高频抖动,无外部设备介入设为0*/ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /*装载值:20 , 20KHZ/20=1Khz,计数值为1ms*/ TIM_TimeBaseStructure.TIM_Period=200; /*向上计数*/ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /*重复计数器,只限制在0X00--0XFF,stm32中文手册209*/ TIM_TimeBaseStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseStructure); /*设置通道*/ /*PWM输出通道选择,向上计数时,1:若计数值<装载值,为有效电平,否则无效,通道2相反*/ TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; /*正向通道有效,反向通道无效*/ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; /*占空比预设为10,为0.5ms,占空比不能超过装载值即周期*/ TIM_OCInitStructure.TIM_Pulse=100; /*输出极性,及在计数阶段IO口的电平*/ TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC1Init(TIM1 , &TIM_OCInitStructure); TIM_OC2Init(TIM1 , &TIM_OCInitStructure); TIM_Cmd(TIM1 , ENABLE); /*定时器1作为主输出*/ TIM_CtrlPWMOutputs(TIM1 , ENABLE); } void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /* (PE9->EN1---TIME1_CH1 右) (PE11->EN2---TIME1_CH2 左)*/ /*GPIO_Init*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); /*IO口的复用:作为输入输出是打开IO口模式复用,作为第二功能比如I2C时打开时钟复用*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); /*INT1----INT4*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); /*将TIM1完全重映射到GPIOE*/ GPIO_PinRemapConfig(GPIO_FullRemap_TIM1 ,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOE , &GPIO_InitStructure); Timer1_Config(); }
STM32F4DISCOVERY串口设置问题
如题,这个板子的串口怎么打开 是把usb连接到电脑就可以还是要另外配置什么啊 我的板子连接到了电脑也可以下载程序,设备管理器里也显示正确安装,可是串口调试助手里面就是没有啊 请问该怎么做啊
STM32F207ZGT中I2C SMBUS总线如何主模式读写?
STM32F207ZGT中I2C SMBUS总线如何主模式读写? 我需要使用STM32F207作为主模式,读电池的芯片BQ2060作为从模式走SMBUS总线,下面是我的一些基本设置和代码信息: void Battery_Init() { I2C_InitTypeDef I2C_InitStructure; Battery_LowLevel_Init(); /* I2C1 configuration: SMBus Host */ I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost; //设置基于SMBUS的主模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;//I2C_SLAVE_ADDRESS7=0x16从设备电池的地址 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; //I2C_SPEED=100000 /* Apply sEE_I2C configuration after enabling it */ I2C_Init(I2C1, &I2C_InitStructure); //初始化设置 /* I2C Peripheral Enable */ I2C_Cmd(I2C1, ENABLE); //使能I2C1 } //下面是我使用STM32F207ZGT作为主模式,电池芯片bq20600作为从模式,对电池芯片的进行读,代码如下: //I2Cx I2C1 //pBuffer 接收缓存 //CommandCode 字节地址 //NumByteToRead = 2读的字节数 uint32_t I2C_BatteryMasterReadbuffer(I2C_TypeDef* I2Cx,uint8_t* pBuffer, uint8_t CommandCode, uint16_t NumByteToRead) { /*----- receiver Phase -----*/ BatteryTimeout = BATTERY_LONG_TIMEOUT; while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); /* Test on I2C1 EV5 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Slave address */ I2C_Send7bitAddress(I2Cx, SMBusDefaultHeader, I2C_Direction_Transmitter);//SMBusDefaultHeader为电池地址0x16 /* Clear EV6 by setting again the PE bit */ // I2C_Cmd(I2C1, DISABLE); /* Test on I2C1 EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Command */ I2C_SendData(I2Cx, CommandCode); /*!< Test on EV8_2 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); /*!< Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Slave address */ I2C_Send7bitAddress(I2Cx, SMBusDefaultHeader, I2C_Direction_Receiver); /*!< Test on EV6 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } while(NumByteToRead) { if(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) //读取数据 { //调用库函数将数据取出到 pBuffer *pBuffer = I2C_ReceiveData(I2Cx); pBuffer++; //指针移位 NumByteToRead--;//字节数减 1 I2C_AcknowledgeConfig(I2Cx, ENABLE); /*!< Test on EV7 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } } if ((uint16_t)(NumByteToRead) == 1) { /* Wait on ADDR flag to be set (ADDR is still not cleared at this level */ // BatteryTimeout = BATTERY_FLAG_TIMEOUT; // while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_ADDR) == RESET) // { // if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); // } /*!< Disable Acknowledgment */ I2C_AcknowledgeConfig(I2Cx, DISABLE); /* Clear ADDR register by reading SR1 then SR2 register (SR1 has already been read) */ (void)I2Cx->SR2; /*!< Send STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); /* Wait for the byte to be received */ while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_RXNE) == RESET) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } *pBuffer = I2C_ReceiveData(I2Cx); NumByteToRead--; BatteryTimeout = BATTERY_FLAG_TIMEOUT; // while(I2Cx->CR1 & I2C_CR1_STOP) // { // if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); // } /*!< Re-Enable Acknowledgment to be ready for another reception */ I2C_AcknowledgeConfig(I2Cx, ENABLE); return Battery_OK; } } return Battery_OK; } 其中,使用F10单步跟进, 执行完 /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); I2C寄存器地址出现如下图片, 之后程序就死在了下面EV5的部分,不知道怎么解决,请求STM32高手指点: /* Test on I2C1 EV5 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } ![图片说明](https://img-ask.csdn.net/upload/201506/17/1434520392_849008.jpg)
Android UsbManager 获取不到HID设备
已经在AndroidManifest.xml配置了 ``` <uses-permission android:name="android.hardware.usb.host" /> <uses-permission android:name="android.hardware.usb.accessory" /> <uses-feature android:name="android.hardware.usb.host" android:required="true" /> ``` 安卓手机中添加了 ``` <?xml version="1.0" encoding="utf-8"?> <permissions> <feature name="android.hardware.usb.host" /> </permissions> ``` 下面是部分代码 ``` UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); int count =deviceList.size();//当外接U盘时,此处是1,当外接鼠标或自己的HID设备时,此处是0,搜索了一下资料,说是UsbManager的源码,里面有一个过滤名单,只要是设备的subclass=1都获取不到,但一直没找到subclass=1在哪 ```
HID设备描述符和在驱动程序中的体现
这两天一直再看HID的描述符方面的知识,但是看到很多文档都是单独讲解描述符, 缺少和驱动程序实际应用的结合,哪位高人能够提供一些好的文档给小弟参考下吗? 小弟不胜感激!!!
基于mfc 获取hid设备版本号
我知道设备的属性VersionNumber可以作为设备软件版本号 但这个版本号并不是我想要的,我请问hid设备还有其他的版本号吗?? 有的话,怎么去获取它,请各位帮忙解答,谢谢
用mfc编写usb hid上位机,readfile 总是返回错误6
CString szTemp; OVERLAPPED ReadOverlapped; char ReadReportBuffer[1024]; CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_SEARCH); /*************************************************************************************/ /* Get GUID for all System HIDs----获取guid */ HidD_GetHidGuid(&HidGuid); /* Get Device Information for all present devices ---获取设备信息群*/ DevInfo = SetupDiGetClassDevs(&HidGuid, NULL,NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE) ); if( INVALID_HANDLE_VALUE == DevInfo) { AfxMessageBox("DevInfo出错,退出"); return ; } DevData.cbSize = sizeof(DevData); DevDetail = NULL; Index = -1; /* Scan all Devices */ do { Index++; /* Device Interface Element of a Device Information set */ ok = SetupDiEnumDeviceInterfaces(DevInfo,0, &HidGuid,Index, &DevData); if (ok == FALSE) { AfxMessageBox("退出"); break; } /* Get Device Interface Details - Get Length */ ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &Length, NULL ); /* Allocate memory for Device Detailed Data---分配内存 */ DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(Length); /* Set cbSize in the DevDetail structure */ DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); /* Get Device Interface Details --真正的获取接口*/ ok = SetupDiGetDeviceInterfaceDetail(DevInfo,&DevData,DevDetail, Length, NULL, NULL ); if (!ok) { free(DevDetail); DevDetail = NULL; continue; } nDevDetail[Index] = (int)DevDetail; //free(DevDetail); //及时释放内存 /*********开始建立连接*************/ /* Create File for Device Read/Write */ DevHandle = CreateFile(DevDetail->DevicePath,NULL,FILE_SHARE_READ | FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (DevHandle == INVALID_HANDLE_VALUE) { free(DevDetail); DevDetail = NULL; continue; } /********************获取属性信息,包括pid vid */ DevAttributes.Size = sizeof(DevAttributes); ok = HidD_GetAttributes(DevHandle,&DevAttributes); if(!ok) { free(DevDetail); CloseHandle(DevHandle); DevDetail = NULL; continue; } if((DevAttributes.VendorID == 0x10c4 )&&(DevAttributes.ProductID == 0x8296 )) //DevDetail->DevicePath MyDevPathName { MyDevPathName = DevDetail->DevicePath; DevHandle=CreateFile(DevDetail->DevicePath, GENERIC_READ , FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); if( (DevHandle == INVALID_HANDLE_VALUE )&&(DevHandle == 0) ) { AfxMessageBox("读访问打开设备失败"); return; } Sleep(1000); } szTemp.Format("VID--%x PID--%x",DevAttributes.VendorID,DevAttributes.ProductID); pCombo ->AddString(szTemp); DevCount++; /*************************************************************************************/ } while(DevCount < 20); pCombo ->SetCurSel(0);
STM32F4DISCOVERY串口怎么打开
STLINK驱动已经正确安装,在设备管理器中串行总线设备可以中可以找到,但是这个板子的串口怎么打开?设备管理器没有显示有端口啊,应该怎么做啊,大神帮帮忙
linux 中自定义HID设备文件无法打开
我这里有一款精伦的HID身份证阅读器,在linux虚拟机下 可以打开读取数据;但是到了开发板上面却找不到/dev/usb 目录 ,我通过插拔发现会在dev目录下生成一个 '1-1.2'的设备文件,但是操作时却是无法打开。 查遍资料,重新编译了内核,仍然无法打开,有人说需要创建设备文件用mknod /dev/usb/hiddev0 186 96 ;我创建了,但是还是打开失败。求大神支招解决,已经困扰了一周了。孤立无援啊
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问