历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2018年09月11日 | STM32串口使用详解

2018-09-11 来源:eefocus

一、关于串口需要了解的几个知识点:

1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。

   波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。

   串口的传输与网络等其他的传输有着相似之处,比如常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。

2.单工,半双工,全双工:

   单工:只能一个方向传输

   半双工:可以两个方向传输,但需要分时复用

   全双工:两个方向传输


二、初始化函数

串口的初始化包括以下几部分:

1.时钟初始化:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//端口复用

初始化的时候一共有三个时钟需要打开,一是IO口,二是串口,三是端口复用。

STM32的串口1用的是PA9、PA10两个端口,串口2用的是PA2、PA3两个端口,因此初始化的时候打开的是GPIOA的时钟。加粗部分是重点,我在用端口的时候就没有加这句话,导致一直不好使。要区分开端口复用和端口重映射,它们完全是两个不同的概念。在51单片机里面,没有端口复用这种用法,某个端口在用作串口的时候也会被当做普通IO来区分,这就像你洗衣服的时候各种衣服都混在一起洗,不加以区分。但是到了STM32的时候,这里有一个复用功能,当你洗浅色衣服的时候,深色的衣服不会进入到这个盆里,这就避免了许多问题,这也是STM32比51高级的地方。


2.IO初始化:

PA9是发送口,在设置的时候注意要相应的设为复用推挽输出。

PA10是接收口,在设置的时候要设为浮空输入,由于是输入,所以没有必要再设置口线翻转速度。

  

 //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;            //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.9

3.串口初始化:

USART_InitTypeDef  USART_InitStructure;

USART_InitStructure.USART_BaudRate=9600;//波特率:9600

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//数据长度:8位

USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位: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(USART1,&USART_InitStructure);

以上是串口的结构体变量的初始化设置。一般情况下的串口初始化都是上面这种情况,数据流这个我们一般是用不到的,它是一个关于调制解调的东西,这里不做深入探究。


USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断标志使能

USART_Cmd(USART1,ENABLE);//打开串口使能

USART_ClearFlag(USART1,USART_FLAG_TC);  //清除发送完成标志位

接收中断标志使能是在使用串口接收中断的时候才需要的。在这里清除发送完成标志位是为了避免接收不到第一个数据的情况。


4.中断初始化:

串口的使用方式有两种:查询、中断

一般情况下,发送数据常用查询方式,接收数据常用中断的方式。这和51的串口类似,查询就是判断发送或接收标志位是否被置位,中断是当接收到别的地方发来的数据的时候中断标志位就会溢出从而触发中断,打断主程序去执行中断服务程序。


中断:

与其他的中断设置方式类似,要设置中断分组,响应优先级,抢占优先级。

void NVIC_Configuration(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; //定义结构体

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断分组

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1的中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级为1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断

    NVIC_Init(&NVIC_InitStructure);

}

注意如果用到中断的话还要使能接收中断,这个使能在串口初始化中完成,见上面。


三、串口的使用

1.查询方式:

在主程序里面使用时有两句话:

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成标志位被置位

USART_SendData(USART1,xxx);//向上位机发送数据

发送完成标志位被置位说明上一个数据已经发送完成了,于是进行下一个数据的发送


2.中断方式:

中断服务函数的编写套路如下:

void USART1_IRQHandler(void)

{

   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断接收中断标志位是否置位,即是否有数据发送过来

   {

        xxx=USART_ReceiveData(USART1);//将接收到的数据赋给xxx

        xxxxxxx。。。。       

   }

}

四:完整代码


#if EN_USART1_RX   //如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误     

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15,  接收完成标志

//bit14,  接收到0x0d

//bit13~0,  接收到的有效字节数目

u16 USART_RX_STA=0;       //接收状态标记    

  

void uart_init(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

   

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

  

  //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;            //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.10  

 

 

  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   //子优先级3

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //IRQ通道使能

  NVIC_Init(&NVIC_InitStructure);                 //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

  USART_InitStructure.USART_BaudRate = bound;//串口波特率

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

  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(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1 

 

 

}

 

 

void USART1_IRQHandler(void)                  //串口1中断服务程序

  {

  u8 Res;

#if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

  OSIntEnter();    

#endif

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

    {

    Res =USART_ReceiveData(USART1); //读取接收到的数据

    

    if((USART_RX_STA&0x8000)==0)//接收未完成

                    {

        if(USART_RX_STA&0x4000)//接收到了0x0d

                            {

                              if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

                              else USART_RX_STA|=0x8000;  //接收完成了 

                            }

        else //还没收到0X0D

                            { 

                              if(Res==0x0d)USART_RX_STA|=0x4000;

                              else

                                {

                                  USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

                                  USART_RX_STA++;

                                  if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收    

                                }    

                            }

    }        

     } 

#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

  OSIntExit();                         

#endif

#endif  

/********************************************2018年6月15号*****************************************/


使用查询方式的USART:

设置时钟:

      RCC_APB2Periph_AFIO  功能复用IO时钟

      RCC_APB2Periph_GPIOA  GPIOA时钟

      RCC_APB2Periph_USART1 USART1时钟

 

你可以用 //使能串口1,PA,AFIO总线  RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);

 

或直接

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB2外设时钟开启

 

注意USART2的你开启为RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

 

设置GPIO:

 

   GPIO_InitTypeDefGPIO_InitStructure;

    

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;  //推挽输出-TX

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

设置USART:

 

   这里我用的是3.0的库相对于2.0的库来说多了一步,先说2.0

   USART_InitTypeDef USART_InitStructure;

   USART_StructInit(&USART_InitStructure);//装填默认值

   USART_Init(USART1, &USART_InitStructure);//根据USART_InitStruct中指定的参数初始化外设USARTx寄存器

   USART_Cmd(USART1, ENABLE); //启用就好了~!

 

   而3.0的库需要

   USART_InitTypeDefUSART_InitStructure;

   USART_ClockInitTypeDefUSART_ClockInitStructure;

   USART_StructInit(&USART_InitStructure);

   USART_ClockStructInit(&USART_ClockInitStructure);

   USART_ClockInit(USART1,&USART_ClockInitStructure);

   USART_Init(USART1,&USART_InitStructure);

   USART_Cmd(USART1,ENABLE);

//只是多分出了1个USART_ClockInitStructure 我也不知为啥要这样??为了同步异步模式?USART_InitStruct中指定的参数内容为:(2.0的)

typedef struct

{

u32 USART_BaudRate; //USART传输的波特率

u16 USART_WordLength;//一个帧中传输或者接收到的数据位数通常是8

u16 USART_StopBits; //停止位

u16 USART_Parity; //奇偶校验

u16 USART_HardwareFlowControl; //硬件流控制模式使能还是失能

u16 USART_Mode; //指定了使能或者失能发送和接收模式

u16 USART_Clock;//提示了USART时钟使能还是失能

u16 USART_CPOL;//指定了下SLCK引脚上时钟输出的极性

u16 USART_CPHA;//指定了下SLCK引脚上时钟输出的相位

u16 USART_LastBit;

//来控制是否在同步模式下,在SCLK引脚上输出最后发送的那个数据字通常用USART_LastBit_Disable

} USART_InitTypeDef;

 

 

我靠~!太细了~!我只知道(9600,8,n,1)这就够了 其他的统统默认~!

 

  USART_StructInit(&USART_InitStructure);

  USART_ClockStructInit(&USART_ClockInitStructure); //2.0不用这句,这样就设好了好了~!自动为您装填了默认参数。默认的参数如下(3.0的库):

 

voidUSART_StructInit(USART_InitTypeDef* USART_InitStruct)

{

  USART_InitStruct->USART_BaudRate= 9600;

  USART_InitStruct->USART_WordLength =USART_WordLength_8b;

  USART_InitStruct->USART_StopBits= USART_StopBits_1;

  USART_InitStruct->USART_Parity =USART_Parity_No ;

  USART_InitStruct->USART_Mode =USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStruct->USART_HardwareFlowControl =USART_HardwareFlowControl_None; 

}

 

void USART_ClockStructInit(USART_ClockInitTypeDef*USART_ClockInitStruct)

{

 

  USART_ClockInitStruct->USART_Clock =USART_Clock_Disable;

  USART_ClockInitStruct->USART_CPOL= USART_CPOL_Low;

  USART_ClockInitStruct->USART_CPHA= USART_CPHA_1Edge;

  USART_ClockInitStruct->USART_LastBit =USART_LastBit_Disable;

}

 

/************************************************************************************************/

 

当然了你也可以自己设参数,比如这样。

void USART_Configuration(void)

{

 USART_InitTypeDef USART_InitStructure;

 USART_ClockInitTypeDefUSART_ClockInitStructure;

 

 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_ClockInitStructure.USART_Clock =USART_Clock_Disable;

 USART_ClockInitStructure.USART_CPOL =USART_CPOL_Low;

 USART_ClockInitStructure.USART_CPHA =USART_CPHA_2Edge;

 USART_ClockInitStructure.USART_LastBit =USART_LastBit_Disable;

 

 USART_ClockInit(USART1,&USART_ClockInitStructure);

 USART_Init(USART1,&USART_InitStructure);

 

 USART_Init(USART1, &USART_InitStructure);

 

 USART_ClockInit(USART1,&USART_ClockInitStructure);

 USART_Cmd(USART1, ENABLE);

 

} ////USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;除了这句以外其他的都和默认的参数一样,二者有啥区别我至今也不太清楚但就一般的应用来说两个都可以正常工作。

 

 

收发的方法:

 1.发送

void USART1_Puts(char *str)

{

   while(*str)

    {

       USART_SendData(USART1, *str++);

       

       while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

    }

}

USART1_Puts("hello-java~!\r\n"); //这样就发送了hello-java~!跟C语言的printf不太一样在于\n并没有另起一行要用个\r这样在终端上好看。

 

 2.接收

u8 uart1_get_data; //存放接受的内容

while(1)

{

  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)

    {           

      uart1_get_data = USART_ReceiveData(USART1);

      USART1_Puts("\r\n获取到串口1数据:");

       USART1_Putc(uart1_get_data);

      USART1_Puts("\r\n");  

    }

 

}

 

查询法的可以看出要不断扫描不是很好,下面介绍中断法。

 

首先配置时钟:这里我拿USART2说事:

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART2和USART3都在在APB1上而USART1是在APB2上的

 

设置GPIO:

 

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |ENABLE);

 

    //A2 做T2X

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //A3 做R2X

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 配置SUART2:

 

 USART_InitTypeDef USART_InitStructure;

 USART_ClockInitTypeDefUSART_ClockInitStructure;

 

 USART_StructInit(&USART_InitStructure);

 USART_ClockStructInit(&USART_ClockInitStructure);

 USART_ClockInit(USART2,&USART_ClockInitStructure);

 USART_Init(USART2,&USART_InitStructure);

 USART_Cmd(USART2, ENABLE);

 

 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启SUART2的接收中断同理还有【看图】然后中断服务程序:这个自己在stm32f10x_it.c添加就可以了。

 

void USART2_IRQHandler(void)

{

 //接收中断

 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)

 {

  USART_ClearITPendingBit(USART2,USART_IT_RXNE);

  Uart2_Get_Data=USART_ReceiveData(USART2);

  Uart2_Get_Flag=1;

 }

 

 //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]

 if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)

 {

  USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志

  USART_ReceiveData(USART2);    //读DR

 }

}

 

然后在main里检测Uart2_Get_Flag

 

if(Uart2_Get_Flag)

  {

   Uart2_Get_Flag=0;

   USART2_Puts("\r\n2获取到串口2数据:");

   USART2_Putc(Uart2_Get_Data);

   USART2_Puts("\r\n");

  }


推荐阅读

史海拾趣

CHIMEI(奇美)公司的发展小趣事

随着电子行业的快速发展,市场竞争也日益激烈。奇美公司深知创新是企业发展的核心动力,因此不断加大研发投入,推动技术创新和产品升级。公司研发团队积极探索新技术、新工艺和新材料的应用,推出了一系列具有创新性和竞争力的产品。这些产品不仅满足了客户的需求,还为公司开拓了新的市场领域。

EnerSys公司的发展小趣事

进入21世纪后,EnerSys加快了其收购与整合的步伐。2000年底,EnerSys收购了Yuasa Corporation(Japan)在北美和南美的储能和动力电池业务。随后,公司又陆续收购了Energy Storage Group of Invensys plc.和FIAMM, S.p.A.的动力电池业务。这些收购不仅扩大了EnerSys的市场份额,还增强了其在专业镍基电池、锂电池、铅酸电池和工业电池领域的技术实力。

Aplus Flash Technology Inc公司的发展小趣事

随着全球环保意识的提高,电子行业对环保的要求也越来越高。Aplus Flash Technology Inc公司积极响应环保号召,将环保理念融入产品设计和生产过程中。公司研发出了一款低能耗、环保型的闪存芯片,不仅降低了产品的能耗和碳排放,还提高了产品的可回收利用率。这一创新举措得到了消费者的广泛认可和支持,也为公司在市场上树立了良好的环保形象。

Beta Dyne Inc公司的发展小趣事

随着社会对环保问题的关注度不断提高,Beta Dyne也积极响应国家号召,将环保理念融入公司的经营发展中。公司采用环保材料和生产工艺,减少生产过程中的污染排放。同时,Beta Dyne还积极参与社会公益事业,为当地社区的发展做出了积极贡献。

这些故事虽然是以虚构的形式呈现,但它们反映了电子行业中许多公司可能经历的发展阶段和挑战。每个公司都有其独特的发展历程和故事,Beta Dyne Inc也不例外。如果您对该公司的具体发展情况感兴趣,建议查阅相关资料或联系该公司以获取更准确的信息。

General Semiconductor ( Vishay )公司的发展小趣事

1997年,Vishay正式进入分立半导体领域,收购了Lite-On Power Semiconductor公司65%的股份。这一举措标志着Vishay在半导体技术上的重大突破。随后,在1998年,Vishay又收购了TEMIC的半导体业务部分,包括特洛芬肯(Telefunken)和硅尼克斯(Siliconix)两家公司的大部分股份。这些收购为Vishay带来了先进的晶体管、二极管、光电子装置等半导体技术,进一步巩固了其在半导体领域的地位。

BEI Sensors公司的发展小趣事

近年来,全球经济形势复杂多变,Beckhoff也面临着诸多挑战。然而,公司始终坚持创新驱动的发展战略,不断研发新产品、新技术,以应对市场的不断变化。同时,公司也积极调整业务结构,优化供应链管理,降低运营成本,以应对经济下行的压力。在这样的背景下,Beckhoff依然保持着稳健的发展态势,为电子行业的持续进步做出了重要贡献。

这五个故事从不同角度展示了Beckhoff Automation GmbH公司在电子行业中的发展历程和成就。从创始与早期发展,到基于PC控制技术的创新,再到全球业务拓展和中国市场的发展,以及应对经济挑战与持续创新,Beckhoff始终保持着对技术创新的追求和对市场变化的敏锐洞察。这些故事不仅展现了公司的实力和成就,也体现了其在电子行业中的重要地位和影响。

问答坊 | AI 解惑

花1万元的PCB设计高级讲座 -- PCB设计讲义.pdf

花1万元的PCB设计高级讲座 -- PCB设计讲义.pdf  …

查看全部问答>

阜阳法院如此判案,错!错!错!

阜阳法院如此判案,错!错!错! 我公司无辜受害,冤!冤!冤! 长春建工集团有限公司印章被伪造,假冒的分公司招摇撞骗,虽然假冒分公司已被工商管理机关撤销,此事已向公安机关报案,但就是这样一个假冒分公司非法经营活动所产生的经济纠纷,却 ...…

查看全部问答>

i2c发数据,首地址变了,SyncIst和I2C_IST的不解??

我调用deviceiocontrol向外部i2c设备发送数据,系统在底层调用I2C_IoControl; I2C_IoControl调用HW_Write函数,在对语句if (WAIT_OBJECT_0 != SyncIst(pI2C, TX_TIMEOUT))进行判断时,转跳SyncIst函数; 在SyncIst函数运行到WaitForSingleObject ...…

查看全部问答>

如何在汇编语言中定义long型变量?

如何在汇编语言中定义long型变量? 看了一些示例程序,在程序中定义变量时一般直接定义为通用寄存器,因为我得程序用到的变量较多,打算在ram里面定义几个long型变量,找了一些资料很少看到在ram中定义变量的。 刚开始学习用汇编写,希望高人回答 ...…

查看全部问答>

重塑企业 DNA,英特尔即将进军电视服务

本帖最后由 jameswangsynnex 于 2015-3-3 20:05 编辑 …

查看全部问答>

ADI产品介绍及其在各个领域中的应用

ADI专家面对面是ADI公司与广大中小型客户以研讨会和客户拜访的形式直接交流的活动。ADI技术专家现场指导客户如何应对实际设计应用中面临的问题,并详细讲解了用户在实际应用中遇到的常见问题和解决方法。 应广大客户的要求,我们将陆续上传ADI资深 ...…

查看全部问答>

单轴倾角传感器SCA60C团购贴(针对EEW比赛的朋友)

本帖最后由 paulhyde 于 2014-9-15 03:02 编辑 针对EEW参加比赛的朋友,一直想做点事,但都没有行动。 最近看到SCA60C的小量采购量大量上升,估计很多朋友都在用这个准备比赛。所以特在这发个贴,给EEW的朋友特价支持! 有需要这个倾角传感器的 ...…

查看全部问答>

达内JAVA物联网3G全套课程

下载地址:http://pan.baidu.com/share/link? ... 6%E4%B9%A0%2Ftarena 提取密码:xwz6 [ 本帖最后由 qinkaiabc 于 2013-12-7 09:59 编辑 ]…

查看全部问答>