如何在网站中简单的引入高德地图

由于百度地图的生成器的插件太旧,(当然可以用百度开发者平台的JSAPI来引入地图),所以笔者这里选择了把高德地图api插入进网站中。

-第一步:登录高德开发者平台,注册高德地图开发者账号

-第二步:创建应用,并添加Key

  1. 进入高德地图开发者控制台
  2. 选择应用管理–>我的应用

3. 点击右上角的 创建新应用

4.在弹出的窗口中,填入你喜欢的应用名字和应用场景

5.点击新创建的应用旁边的 + 号

6.Key的名字任意,选择Web端(JS API),域名白名单可留空,也可写你自己的域名,点击提交即可成功创建Key

-第3步:创建高德地图HTML文件

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <style type="text/css">
      body,html,#container{
        width: 100%;
        height: 100%;
        margin: 0px
      }
    </style>
    <title>API加载</title>
  </head>
  <body>
    <div id="container" tabindex="0"></div>
    <script type="text/javascript">
        window.init = function(){
            var map = new AMap.Map('container', {
               resizeEnable: true,
               center:[121.479309, 31.25314],
               zoom:20
            });
            if (location.href.indexOf('guide=1') !== -1) {
                map.setStatus({scrollWheel: false});
                map.plugin(["AMap.ToolBar"], function() {
                  map.addControl(new AMap.ToolBar({liteStyle:true}))
                });
            }
          }
    </script>
    <script src="https://webapi.amap.com/maps?v=1.4.15&key=请修改成您的准入密钥Key&callback=init"></script>
  </body>
</html>

请修改成您的准入密钥Key 修改成刚刚创建的Key密钥,并且另存为xxx.html文件

这里说一下高德地图显示位置的更改,需要修改Html文件的center:[121.479309, 31.25314],行,修改方式如下

  1.  首先进入高德地图官网
  2. 搜索你需要定位的地方,比如我要定位上海动物园
  3. 把浏览器中的经纬度参数手动复制出来,并填入center行
  4. 或者直接百度搜索经纬度查询,输入你要的地址,查询后复制出经纬度,填入center行
  5. 修改后的Html文件如下
  6. <!doctype html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
        <style type="text/css">
          body,html,#container{
            width: 100%;
            height: 100%;
            margin: 0px
          }
        </style>
        <title>API加载</title>
      </head>
      <body>
        <div id="container" tabindex="0"></div>
        <script type="text/javascript">
            window.init = function(){
                var map = new AMap.Map('container', {
                   resizeEnable: true,
                   center:[121.3627133944, 31.1932656667],
                   zoom:20
                });
                if (location.href.indexOf('guide=1') !== -1) {
                    map.setStatus({scrollWheel: false});
                    map.plugin(["AMap.ToolBar"], function() {
                      map.addControl(new AMap.ToolBar({liteStyle:true}))
                    });
                }
              }
        </script>
        <script src="https://webapi.amap.com/maps?v=1.4.15&key=请修改成您的准入密钥Key&callback=init"></script>
      </body>
    </html>

     -第四步:将修改好的html文件上传到你的网站后台,并且在需要的地方调用<iframe>标签

<iframe src="https://www.mdrfb.com/.html" width="600" height="300" frameborder="0" scrolling="no"></iframe>

src参数填写上传的html文件的准确目录,设置合适的高度和宽度就能在网站上显示高德地图了。

预览如下:

如需修改地图缩放大小,请修改html文件的Zoom参数

WordPress需要在文本选项卡下才能填入<iframe>标签,得先从可视化界面切换成文本界面,不同版本的Wordpress可能方法不同。

花了巨款维修电脑,论电脑城js的N大套路,谨防被坑!!

 


本人在上海某电脑商场维修了一台笔记本,网上报价约为200-180,一开始实体店js报价280,说1小时后来取即可,但是之后却发微信告诉我说要加120,也就是400…

之后我看到电脑被拆的七零八落,生怕不给他做生意得把我电脑高的更糟,于是也就同意400这个报价了,于是几天后来取,当场匆忙试了一下开机没问题即可,于是就抱回家了。回家之后接上鼠标,再开机,就发现问题了,电脑更本开不出,一拆机,问题更大了,内存从原来4G 1600MHZ原厂三星条变成了2+2的条,并且一定要拔掉外接的usb设备才可以开机。于是又隔了几天送去修,在那放了大概4-5天才弄好,拿回来后内存变成单4 1333MHZ(第四代intel cpu支持1600内存,1333只好降频使用,性能小幅下降),usb的毛病倒是解决了,js那一脸的油嘴滑舌实在让人气不打一处来!!!美其名曰我给你换回来了,性能又不变(此处应有NM$L),多花了基本一整天的时间,唉

本人总结出以下几点:

1.网上报价有参考性,如果实体店一开始报的偏低或者稍微贵一些要注意了。

2.电脑送修尽量拆掉所有的部件,比如硬盘内存等,谨防被偷换。

3.维修完成后要认真测试,usb以及各个接口,开机测试系统稳定性(aida64烤鸡5-10分钟),没问题再确认,避免之后来回奔波纠纷

4.部分实体店是真 XX 的 坑 啊  🙁

最后,爆出地点

上海虬江路数码音像城2楼121(2A121)

特此表扬爱恰 烂 钱 詹 振 年 带 善 人

通过ESP8266模块与JQ8900模块与RTT实现手机远程控制音乐播放

本例程是一个简单的串口通信的交互例程,通过了RT-thread系统来实现。

简要叙述程序思路:
  1. 创建两个进程句柄,serial与serial2。
  2. 调用一系列初始化串口设备的函数,分别是rt_device_find(查找设备),rt_device_set_rx_indicate(设置接收回调函数)。
  3. 启动线程,调用函数并检测接受到的信息
  4. 接收到对应信息后调用函数向JQ8900模块发送命令
  5. 同时保留了按钮操控的效果,通过rt_pin_attach_irq设置按钮中断函数

以下给出源码:

/*
基于RTT的手机通过esp8266操作JQ8900功放模块的一种方式
所用开发板 野火指南者
WiFi模块   ESP8266
功放模块   JQ8900
RTT版本    4.0.2(野火BSP)
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#ifndef KEY0_PIN_NUM
    #define KEY0_PIN_NUM      GET_PIN(A, 0) /* PA0 Key1 pin脚*/
#endif
#ifndef KEY1_PIN_NUM
    #define KEY1_PIN_NUM      GET_PIN(C, 13) /* PC13 Key2 pin脚*/
#endif
#ifndef SAMPLE_UART_NAME
#define SAMPLE_UART_NAME       "uart2"        /* JQ8900所接串口 请先事先在env中打开*/
#endif
#ifndef UART_NAME
#define UART_NAME              "uart3"        /* ESP8266所接串口*/
#endif
static rt_device_t serial;   
static rt_device_t serial2;   
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 句柄默认设置 */
static struct rt_semaphore rx_sem;
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    rt_sem_release(&rx_sem);
    return RT_EOK;
}
static void Re_music(void *args)
{
    static char buffer1[4]={0xAA,0x05,0x00,0xAF};    //JQ8900上一曲命令
    rt_uint32_t tx_length;
    tx_length=4;
    int i = 0;
    while(i < 4){
    rt_device_write(serial,0,&buffer1[i],tx_length);  //循环发送
    i++;}
    rt_kprintf("jun\n");
}
static void next_music(void *args)
{
    static char buffer1[4]={0xAA,0x06,0x00,0xB0};    //JQ8900下一曲命令
    rt_uint32_t tx_length;
    tx_length=4;
    int i = 0;
    while(i < 4){
    rt_device_write(serial,0,&buffer1[i],tx_length);
    i++;}
    rt_kprintf("bian\n");
}

static void nmsl(void *parameter){
  
      char ch;

    while (1)
    {
        while (rt_device_read(serial2, -1, &ch, 1) != 1)
        {
            rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
        }
        if(ch == 'a'){         //esp8266检测接受信息,为a则调用函数
          Re_music(0);
        }
        if(ch == 'b'){
          next_music(0);
        }

}
}

static void serial_thread_entry(void *parameter)
{
  //  char ch;
    while (1)
      
    {    
    rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, Re_music, RT_NULL);   //设置按钮中断回调函数
    rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);
    rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, next_music, RT_NULL);
    rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE);    
    }
}
static int mdr5(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];
    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }
    serial = rt_device_find(uart_name);
    serial2 = rt_device_find(UART_NAME);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }
    if (!serial2)
    {
        rt_kprintf("find %s failed!\n", UART_NAME);
        return RT_ERROR;
    }
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    config.baud_rate = BAUD_RATE_9600;    //串口设置为9600
    config.data_bits = DATA_BITS_8;
    config.stop_bits = STOP_BITS_1;
    config.parity = PARITY_NONE;
    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
    rt_device_set_rx_indicate(serial, uart_input);
    
    rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
    rt_device_set_rx_indicate(serial2, uart_input);
    rt_thread_t thread1 = rt_thread_create("serial2", nmsl, RT_NULL, 1024, 25, 10);
        if (thread1 != RT_NULL)
    {
        rt_thread_startup(thread1);
    }
    else
    {
        ret = RT_ERROR;
    }
    
    
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }
    return ret;
}
MSH_CMD_EXPORT(mdr5, uart JUN);

值得注意的是,JQ8900模块的波特率是9600,需要使用rt_device_control函数来设置串口波特率,而esp8266则不用

本程序还设置了一个接受信号量,用来在串口接收到信息之后发送信号量,来表示已经接受到数据。

重大线索发现!

欢迎收看今天的“小狮子 带侦探”!我是最可爱的人形s.a.t.8。在后勤官格林娜小姐的指挥下指挥部所有的人形对整个指挥部区域进行了地毯式搜索,在指挥室中的电脑里我们又发现了一串可疑的代码:

;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name          : startup_stm32f10x_hd.s
;* Author             : MCD Application Team
;* Version            : V3.5.0
;* Date               : 11-March-2011
;* Description        : STM32F10x High Density Devices vector table for MDK-ARM 
;*                      toolchain. 
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial PC == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the clock system and also configure the external 
;*                        SRAM mounted on STM3210E-EVAL board to be used as data 
;*                        memory (optional, to be enabled by user)
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>   
;*******************************************************************************
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
                                                  
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
                DCD     TIM8_BRK_IRQHandler        ; TIM8 Break
                DCD     TIM8_UP_IRQHandler         ; TIM8 Update
                DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation
                DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare
                DCD     ADC3_IRQHandler            ; ADC3
                DCD     FSMC_IRQHandler            ; FSMC
                DCD     SDIO_IRQHandler            ; SDIO
                DCD     TIM5_IRQHandler            ; TIM5
                DCD     SPI3_IRQHandler            ; SPI3
                DCD     UART4_IRQHandler           ; UART4
                DCD     UART5_IRQHandler           ; UART5
                DCD     TIM6_IRQHandler            ; TIM6
                DCD     TIM7_IRQHandler            ; TIM7
                DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
                DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
                DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
                DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY
              
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
               
; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTCAlarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]
                EXPORT  TIM8_BRK_IRQHandler        [WEAK]
                EXPORT  TIM8_UP_IRQHandler         [WEAK]
                EXPORT  TIM8_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM8_CC_IRQHandler         [WEAK]
                EXPORT  ADC3_IRQHandler            [WEAK]
                EXPORT  FSMC_IRQHandler            [WEAK]
                EXPORT  SDIO_IRQHandler            [WEAK]
                EXPORT  TIM5_IRQHandler            [WEAK]
                EXPORT  SPI3_IRQHandler            [WEAK]
                EXPORT  UART4_IRQHandler           [WEAK]
                EXPORT  UART5_IRQHandler           [WEAK]
                EXPORT  TIM6_IRQHandler            [WEAK]
                EXPORT  TIM7_IRQHandler            [WEAK]
                EXPORT  DMA2_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel4_5_IRQHandler [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****

经过技术分析后我们得知这是前几次电子板的启动文件,上边的代码分别实行了一下功能:

首先,定义栈,何为栈?栈是堆栈中的一部分,而堆栈则是为了分配在运行函数时所需分配的内存空间,栈的目的就是将函数从第一行依次录入一个空间,这个空间就是栈;相应的,有栈就要有堆,所以第二段就是定义堆,堆的作用就是从栈中读取函数,同样也是依次读取并将读取的语句存入内存最后由cpu来执行功能。

然后声明中断函数,并根据4字节的长度来分配内存空间,接着编写中断函数的代码。

接下来就到了最重要的一步,将系统时钟函数放入r0寄存器运行完后清除,再将用户程序也就是main放入r0寄存器运行完后清楚,这里可能有人要问了为什么运行完后要清除?因为我们的内存空间是有限的不能无限制让一个已经运行完的程序当钉子户,否则会导致机器越用越卡越用越慢,所以以后在对内存进行操作的时候一定要时刻记得“用完就扔”的原则。

最后就是将用户自己编写的函数放到堆栈中并分配到内存,总共有4个寄存器被分配给了堆栈,r0被分配给了堆的起始地址,r2被分配给了堆的大小,r3被分配给了栈顶指针,r1被分配给了栈的大小。

Stack_Size EQU 0x00000400 
AREA STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem SPACE Stack_Size __initial_sp

这三行代码诠释了栈的起始指针和栈的大小:首先将内存中0x00000400声明成了stack_size,再将stack_size(也就是0x00000400)作为内存地址分配给了stack_mem从而达到了设置栈顶指针的目的,再将两者相加就达到了栈的大小。

Heap_Size EQU 0x00000200 
AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base 
Heap_Mem SPACE Heap_Size __heap_limit

那么同理这三行代码诠释了堆的起始地址和堆的大小。

我们查询了这段代码发送的地址,发现是由一个叫均鞭的用户在英国赫里福基地发出的,为了查询事情的真相并找回失踪的指挥官,我!最可爱的人形小狮子将会第一时间赶赴现场为大家带来第一手资讯,请大家继续关注下一期的“小狮子 带侦探”!

 

 

 

如何通过RTT开启野火开发板上的sdcard,并且在msh中读取

野火开发板上有一个sdcard接口,通过RTT,我们可以非常方便的添加开发板相关的驱动,并且在RT-thread的Final sh中使用并读取sd卡的内容。

在开始本教程之前请先确保您已经安装RT-thread的ENV工具包。

首先,我们移动到RTT的bsp目录下,右键空白处,选择ConEmu Here

在Env控制台中输入menuconfig

进入menuconfig界面后进入到Hardware Drivers Config–>Onboard Peripheral Drivers

打开Enable SDCARD (sdio)

保存后在Env命令台中输入scons –target=mdk5

运行后,重新打开项目文件,即可发现项目中的Filesystem Group

重新烧录工程后,即可操作RTT上的文件操作系统

 \ | /
- RT -     Thread Operating System
 / | \     4.0.2 build Aug 22 2019
 2006 - 2019 Copyright by rt-thread team
msh />[I/SDIO] SD card capacity 15273984 KB.
found part[0], begin: 4194304, size: 14.576GB
[I/app.card] sd card mount to '/'
[D/at.dev] 

msh />ls
Directory /:
pic1.bmp            460854                   
pic2.bmp            115254                   
pic3.bmp            460854                   
pic4.bmp            460854                   
pic5.bmp            50678                    
pic6.bmp            44802

如上串口信息所示,可以调用sd卡中的文件

神秘的仪器,新的代码,背后的真相到底是。。。。

欢迎收看今天的“小狮子,带侦探”!上次我们在指挥官的卧室里发现了散发诡异光芒的小灯和一串神秘的代码。今天我们在指挥部后面的小花园里又发现了一个奇怪的装置,这个装置被遗弃在了灌木丛中,但是!我,最可爱的人型s.a.t.8依旧找到了这重要的线索!话不多说,让我们康康今天的带发现吧!

#include "stm32f10x.h"
#include "led.h"
void Delay(uint32_t jun){
  for(;jun!=0;--jun);
}
int main(void){
int a=1,b=0;
  led_gpio_sb();
  led_gpio_yw();
while(1){
  while(a==1){
    if(key_scan(K1_GPIO_PORT,LED_K1_GPIO_PIN)==KEY_ON||b==1){
      led_gpio_config();
      led_gpio_JUN();	
      led_gpio_BIAN();
      while(a==1){		
    LED_G(ON);	 
    LED_B(OFF);	
    LED_R(OFF);
    Delay(0xFFFFF);	
        if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){
      a=0;		
        LED_G(OFF);	 
        LED_B(OFF);
        LED_R(OFF);
      break;}
        LED_G(OFF);	 
        LED_B(ON);
        LED_R(OFF);
        Delay(0xFFFFF);	
        if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){
      a=0;		
        LED_G(OFF);	 
        LED_B(OFF);
        LED_R(OFF);
      break;}
    LED_G(OFF);	 
    LED_B(OFF);
    LED_R(ON);
    Delay(0xFFFFF);	
      if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){
      a=0;		
        LED_G(OFF);	 
        LED_B(OFF);
        LED_R(OFF);
      break;
        }     
      }
    }	
if(a==0) break;
  
  }
    if(key_scan(K1_GPIO_PORT,LED_K1_GPIO_PIN)==KEY_ON){
    a=1;
      b=1;
    
  }
}
}
#include "led.h"
void led_gpio_config(void){
  
  GPIO_InitTypeDef       GPIO_InitStruct;

  RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin=LED_G_GPIO_PIN;
  
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    
  GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
  
}
void led_gpio_JUN(void){
  
  GPIO_InitTypeDef       GPIO_InitStruct;
  
  RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
    
  GPIO_InitStruct.GPIO_Pin=LED_B_GPIO_PIN ;
    
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  
  GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
  
}
void led_gpio_BIAN(void){
  
  GPIO_InitTypeDef       GPIO_InitStruct;
  
  RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin=LED_R_GPIO_PIN ;
  
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  
  GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
  
}

void led_gpio_sb(void){
  
  GPIO_InitTypeDef       GPIO_InitStruct;
  
  RCC_APB2PeriphClockCmd(K1_G_GPIO_CLK, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin=LED_K1_GPIO_PIN ;
  
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  
  GPIO_Init(K1_GPIO_PORT, &GPIO_InitStruct);
  
}

void led_gpio_yw(void){
  
  GPIO_InitTypeDef       GPIO_InitStruct;
  
  RCC_APB2PeriphClockCmd(K2_G_GPIO_CLK, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin=LED_K2_GPIO_PIN ;
  
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    
  GPIO_Init(K2_GPIO_PORT, &GPIO_InitStruct);
  
}

uint8_t key_scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin){
  if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON){
    while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON);
    return KEY_ON;
  }
  else return KEY_OFF;
}
#ifndef led_h
#define led_h
#include "stm32f10x.h"
#define LED_G_GPIO_PIN     GPIO_Pin_0
#define LED_R_GPIO_PIN     GPIO_Pin_5 
#define LED_B_GPIO_PIN     GPIO_Pin_1 
#define LED_G_GPIO_PORT    GPIOB
#define K1_GPIO_PORT    GPIOA
#define K2_GPIO_PORT    GPIOC
#define LED_G_GPIO_CLK     RCC_APB2Periph_GPIOB
#define K1_G_GPIO_CLK     RCC_APB2Periph_GPIOA
#define K2_G_GPIO_CLK     RCC_APB2Periph_GPIOC
#define LED_K1_GPIO_PIN     GPIO_Pin_0
#define LED_K2_GPIO_PIN     GPIO_Pin_13
#define ON   1
#define OFF  0
#define LED_G(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
#define LED_B(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);
#define LED_R(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);
void led_gpio_config(void);
void led_gpio_JUN(void);
void led_gpio_BIAN(void);
void led_gpio_sb(void);
void led_gpio_yw(void);
uint8_t key_scan(GPIO_TypeDef *GPIO,uint16_t GPIO_Pin);
#define KEY_ON 1
#define KEY_OFF 0
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_G_GPIO_PIN;}
#define LED_R_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_R_GPIO_PIN;}
#define LED_B_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_B_GPIO_PIN;}
#endif

乍一看,这个装置没什么亮点,但是当我们打开开关摁下key1按钮后发现这个装置上的led灯竟然开始闪烁了,当我们再摁下key2按钮后发现led灯竟然熄灭了。这次的发现比上次的更加劲爆,很显然指挥官的失踪并不是无端发生的,这次的装置和上次的装置一定是指挥官留下的线索。后勤官格林娜知道后第一时间来到了现场,在看过代码后,格林娜小姐说这次的代码和上次的有明显的不同,因为上次只有输出而这次却有了输入,通过对输入检测的编写可以让设备接受到信号并作出预先设计好的反应。

格林娜小姐在分析完决定调用格里芬指挥部的力量进行地毯式搜索,想要知道下一次的线索吗?那就继续关注“小狮子,带侦探”吧!我是最可爱的人形s.a.t.8,期待与您分享关于指挥官失踪的第一手资讯。

JQ8900的RTT[RT-thread]简易测试代码

-以下为示例代码

可以通过开发板上的按钮来对JQ8900进行操作,达到切换曲目的效果

并且可以自定义修改代码进行更多操作,优化了串口发送信息的方式。

/*
通过RTT例子修改
用于测试YSV0.7是否可用
*/

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>


#define LED0_PIN    GET_PIN(B, 1)    //定位到野火开发板上两个RGB相关的寄存器上
#define LED0_PINE   GET_PIN(B, 0)
#ifndef KEY0_PIN_NUM
    #define KEY0_PIN_NUM      GET_PIN(A, 0) /* PA0 */
#endif
#ifndef KEY1_PIN_NUM
    #define KEY1_PIN_NUM      GET_PIN(C, 13) /* PC13 */
#endif
#define SAMPLE_UART_NAME       "uart2"

static rt_device_t serial;              /* 串口设备句柄 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */


/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;




/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
    rt_sem_release(&rx_sem);

    return RT_EOK;
}

static void Re_music(void *args)
{
    static char buffer1[4]={0xAA,0x05,0x00,0xAF};
    rt_uint32_t tx_length;
    tx_length=4;
    int i = 0;
    while(i < 4){
    rt_device_write(serial,0,&buffer1[i],tx_length);
    i++;}
    rt_kprintf("上一条\n");
}
static void next_music(void *args)
{
    static char buffer1[4]={0xAA,0x06,0x00,0xB0};
    rt_uint32_t tx_length;
    tx_length=4;
    int i = 0;
    while(i < 4){
    rt_device_write(serial,0,&buffer1[i],tx_length);
    i++;}
    rt_kprintf("下一条\n");

}

static void serial_thread_entry(void *parameter)
{

  //  char ch;
    int jun = 1;
    while (1)
      
    {		
             /*发送缓冲区是固定为5个字节长度的*/
        static char uart2_tx_buffer[5]={0xAA,0x02,0x00,0xAC,0x05};
        rt_uint32_t tx_length;
        tx_length=5;
    rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, Re_music, RT_NULL);
    rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);


    rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, next_music, RT_NULL);
    rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE);
        if(jun){
        rt_device_write(serial,0,&uart2_tx_buffer[0],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[1],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[2],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[3],tx_length);
        rt_kprintf("测试成功!");}
        /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */					
             jun = 0;
    }
}

static int mdr1(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];

    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }

    /* 查找系统中的串口设备 */
    serial = rt_device_find(uart_name);

    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化信号量 */
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 以中断接收及轮询发送模式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    config.baud_rate = BAUD_RATE_9600;    //配置串口通信为9600
    config.data_bits = DATA_BITS_8;
    config.stop_bits = STOP_BITS_1;
    config.parity = PARITY_NONE;
    /* 打开设备后才可修改串口配置参数 */
    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 发送字符串 */
//    rt_device_write(serial, 0, str, (sizeof(str) - 1));

    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }

    return ret;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(mdr1, uart JUN);

可以自行添加到RT-thread的BSP中,并烧录到开发板中。

Adobe Premiere 处理视频剪出音频片段

由于JQ8900需要MP3片段,于是笔者便拿 chouxiang圣经开刀,剪取视频片段,并导出为音频.

-打开Adobe Premiere

选择新建项目,修改名字后直接点击确定。

-将你准备剪辑的视频直接拖入时间轴

-通过 剃刀工具 把你需要截取的音频片段一前一后分别剪一刀~

 

-切换为 选择工具 右键点击中间你需要截取的那一小段序列,在弹出菜单中选择 取消链接
-再次单独选择下方音频片段,并右键

-在弹出菜单中选择 渲染和替换

等待运行完成,这时你会发现左侧项目管理器中会多出一段音频,右键它

-在弹出菜单中选择 导出媒体

参考导出设置

-在导出界面选择你需要的参数,点击导出即可导出剪辑好的音频了

JQ8900模块与单片机通信,达到功放效果|基于RTT

上一篇我们已经进行了JQ8900模块的串口调试,这次我们来把它接上单片机来进行调试。

实现了RTT的串口传输16进制数据

-将JQ8900模块上的串口相关线接上开发板

注意串口TX与RX的反接,笔者这里接了开发板上的UART2接口,分别是PA2(TX),PA3(RX)。

接下来进行程序的编写,我们根据JQ8900的串口手册,相关定义如下

我们进行最简单的播放测试,即01条

以下是测试代码:

/*
通过RTT例子修改
用于测试JQ8900是否可用
*/

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>


#define SAMPLE_UART_NAME       "uart2"

static rt_device_t serial;              /* 串口设备句柄 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */


/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
    rt_sem_release(&rx_sem);

    return RT_EOK;
}




static void serial_thread_entry(void *parameter)
{
  //  char ch;
    int jun = 1;
    while (1)
      
    {		
             /*发送缓冲区是固定为5个字节长度的*/
        static char uart2_tx_buffer[5]={0xAA,0x02,0x00,0xAC,0x05};//测试字段,作用为播放当前音乐
        rt_uint32_t tx_length;
        tx_length=5;
        if(jun){
        rt_device_write(serial,0,&uart2_tx_buffer[0],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[1],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[2],tx_length);
        rt_device_write(serial,0,&uart2_tx_buffer[3],tx_length);
        rt_kprintf("device message sent!");}
        /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */						
             jun = 0;
    }
}

static int mdr1(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];

    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }

    /* 查找系统中的串口设备 */
    serial = rt_device_find(uart_name);

    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化信号量 */
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 以中断接收及轮询发送模式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    config.baud_rate = BAUD_RATE_9600;    //配置串口通信为9600
    config.data_bits = DATA_BITS_8;
    config.stop_bits = STOP_BITS_1;
    config.parity = PARITY_NONE;
    /* 打开设备后才可修改串口配置参数 */
    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);

    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(mdr1, uart JUN);

 

代码简要解析

  1. 打开并配置了串口通信为9600,数据位为8,停止位为1
  2. 设置的回调函数中使用了一个数组用来储存16进制,HEX数据
  3. 使用rt_device_write函数分4次把一个完整的命令传输到JQ8900
  4. 实现了串口通信

将本页代码添加到您的RTT-BSP中,编译后进行烧录,通过msh发送mdr1

 \ | /
- RT -     Thread Operating System
 / | \     4.0.2 build Aug 22 2019
 2006 - 2019 Copyright by rt-thread team
msh />mdr1
msh />device message sent!

 

即可听到JQ8900喇叭的声音,测试成功

 

JQ8900模块的基础调试(直接串口调试)

将JQ8900模块按照以下方式进行连接(Rx,Tx,GND与DC5V暂时悬空)

触发输入口笔者暂时只接了I01于I02,仅做测试用

具体接线方式如下:

一般接线方式

接完线之后,将串口相关的线暂时悬空,并接上micro-USB线,并连接到电脑上。

电脑会立即识别到flash映射的可移动磁盘,打开磁盘,下载测试语音包,并将语音包解压复制到可移动磁盘中。

提取码:csat

最终效果如图所示

将micro-USB线拔下,拿出usb转TTL模块,将刚刚悬空的串口相关线接上ttl模块,注意TX与RX的反接

参考接线方式

讲usb转ttl模块接上电脑,测试悬空的I01与I02两条线,将两条线分别接地,看看是否有声音发出,有声音发出说明模块测试ok

 

接着测试串口能否控制模块,打开sscom,如下设置

输入AA 02 00 AC,并点击发送,可以听到喇叭的声音。

至此测试完成,下一篇将会介绍JQ8900与开发板的通信。