搜索
bottom↓
回复: 78

GPS(邮购部买的那个)数据采集显示,实时更新(STM32F103RBT6)

[复制链接]

出0入0汤圆

发表于 2010-8-19 19:35:16 | 显示全部楼层 |阅读模式
前几天在am这买的GPS,调个usart3都调了半天,想在主程序里加上临界区,即时禁止和开启接收中断
不知道怎么用
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
DoSomthing();
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
这对函数
一用就少数据 - -!

后来投机取巧绕过了这个问题,直接在中断里面处理字符串,在外面显示,避开了这个疑点,现在可以正常工作了。

//=================== stm32f10x_it.c ===============================================================================
void USART3_IRQHandler(void)
{
        unsigned int temp = 0;
        unsigned char *p_data = 0;
        unsigned char *p_data_temp = 0;
        unsigned char *p_GPS_type = 0;
        unsigned int com_cnt = 0; //number of the comment symbol

        temp = temp;

        //static unsigned int GPS_data_cnt = 0;       
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART3,  USART_IT_RXNE);
                flag_usart3Rx = 1;
                usart3_data_r = USART_ReceiveData(USART3);
                // RXNE pending bit can be also cleared by a read to the USART_DR register (USART_ReceiveData())
                *p_GPS_data_buff = usart3_data_r;
                if( usart3_data_r == 0x0A )
                {
                        //USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
                        LED3_ON();
                        flag_GPS_data_updated = 1;
                        *(p_GPS_data_buff + 1) = '\0';
                        p_GPS_data_buff = GPS_data_buff;
                }
                else
                {
                        LED3_OFF();
                        flag_GPS_data_updated = 0;
                        p_GPS_data_buff++;
                }       

                if( flag_GPS_data_updated )
                {
                        p_data = &GPS_data_buff[1];
                        p_GPS_keyword = GPS_keyword;
                        while( p_GPS_keyword < &GPS_keyword[5] )
                        {
                                *p_GPS_keyword++ = *p_data++;
                        }
                        *p_GPS_keyword = '\0';

                        if( strcmp( GPS_keyword, "GPGGA" ) == 0 )
                        {
                                com_cnt = 0;
                                for( p_data = &GPS_data_buff[6]; *p_data != '\0'; p_data++ )
                                {
                                        if( *p_data == ',' )
                                        {
                                                com_cnt += 1;
                                                if( com_cnt == 2 )
                                                {
                                                        p_GPS_type = GPS_data.latitude;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 3 )
                                                {
                                                        p_GPS_type = &GPS_data.lat_ew;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 4 )
                                                {
                                                        p_GPS_type = GPS_data.longitude;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 5 )
                                                {
                                                        p_GPS_type = &GPS_data.long_ns;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 7 )
                                                {
                                                        p_GPS_type = GPS_data.satellites;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 9 )
                                                {
                                                        p_GPS_type = GPS_data.altitude;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        //*p_GPS_type = '\0';
                                                        p_data = p_data_temp - 1;
                                                }
                                                else
                                                {
                                                        continue;
                                                }
                                        }
                                }
                        }
                        else if( strcmp( GPS_keyword, "GPGSA" ) == 0 )
                        {
                        }
                        else if( strcmp( GPS_keyword, "GPRMC" ) == 0 )
                        {
                                com_cnt = 0;
                                for( p_data = &GPS_data_buff[6]; *p_data != '\0'; p_data++ )
                                {
                                        if( *p_data == ',' )
                                        {
                                                com_cnt += 1;
                                                if( com_cnt == 1 )
                                                {
                                                        p_GPS_type = GPS_data.time;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 2 )
                                                {
                                                        p_GPS_type = &GPS_data.status;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 9 )
                                                {
                                                        p_GPS_type = GPS_data.date;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        p_data = p_data_temp - 1;
                                                }
                                                else
                                                {
                                                        continue;
                                                }
                                        }
                                }
                        }
                        else if( strcmp( GPS_keyword, "GPGSV" ) == 0 )
                        {
                                com_cnt = 0;
                                for( p_data = &GPS_data_buff[6]; *p_data != '\0'; p_data++ )
                                {
                                        if( *p_data == ',' )
                                        {
                                                com_cnt += 1;
                                                if( com_cnt == 3 )
                                                {
                                                        p_GPS_type = GPS_data.satellites_inview;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        p_data = p_data_temp - 1;
                                                }
                                                else if( com_cnt == 4 )
                                                {
                                                        p_GPS_type = GPS_data.satellites_id;
                                                        p_data_temp = p_data + 1;
                                                        while( *p_data_temp != ',' )
                                                        {
                                                                *p_GPS_type++ = *p_data_temp++;
                                                        }
                                                        p_data = p_data_temp - 1;
                                                }
                                                else
                                                {
                                                        continue;
                                                }
                                        }
                                }
                        }
                        else
                        {
                        }
                }
                else
                {
                }
               
                //printf( "%c", usart3_data_r );
                //Wait_ms(1);        //Why???????
        }
}

//=================== gps.h ========================
/************************ (C) COPYLEFT 2010 Leafgrass *************************

* File Name          : gps.h
* Author             : Librae
* Last Modified Date : 08/19/2010
* Description        : Provide GPS related functions and variables.

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

/* Define to prevent recursive inclusion ----------------------------------- */
#ifndef __GPS_H__
#define __GPS_H__

/* Includes ---------------------------------------------------------------- */
/* Exported types ---------------------------------------------------------- */

typedef struct type_GPS_data
{
        unsigned char        status;
        unsigned char        lat_ew;
        unsigned char        latitude[11];
        unsigned char        long_ns;
        unsigned char        longitude[12];
        unsigned char        altitude[6];
        unsigned char        date[7];
        unsigned char        time[11];
        unsigned char        satellites[3];
        unsigned char        satellites_inview[3];
        unsigned char        satellites_id[3];
        unsigned char        speed;
        //int                direction;
        float                        hdop;
}t_GPS_data;

/* Exported constants ------------------------------------------------------ */
/* Exported macro ---------------------------------------------------------- */
/* Exported variables ------------------------------------------------------ */

extern unsigned char GPS_keyword[5];
extern unsigned char GPS_data_buff[80];
extern unsigned char *p_GPS_data_buff;
extern unsigned char *p_GPS_keyword;

extern t_GPS_data GPS_data;

extern BOOLEAN flag_GPS_data_updated;
extern BOOLEAN flag_GPS_data_processed;

/* Exported functions ------------------------------------------------------ */

void GPS_Test(void);

#endif

/************************ (C) COPYLEFT 2010 Leafgrass ************************/

//=================== gps.c ===========================================================================
/************************ (C) COPYLEFT 2010 Leafgrass *************************

* File Name          : gps.c
* Author             : Librae
* Last Modified Date : 08/19/2010
* Description        : This file provides the definition of
                                                GPS related functions and variables.

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

/* Includes -----------------------------------------------------------------*/
#include "includes.h"

/* Private typedef ----------------------------------------------------------*/
/* Private define -----------------------------------------------------------*/
/* Private macro ------------------------------------------------------------*/
/* Private variables --------------------------------------------------------*/

unsigned char GPS_keyword[5];
unsigned char GPS_data_buff[80];
unsigned char *p_GPS_data_buff = GPS_data_buff;
unsigned char *p_GPS_keyword = GPS_keyword;

t_GPS_data GPS_data;

BOOLEAN flag_GPS_data_updated = 1;
BOOLEAN flag_GPS_data_processed = 0;

/* Private function prototypes ----------------------------------------------*/
/* Private functions --------------------------------------------------------*/

void GPS_Test(void)
{
        LCD_DispString( "GPS Test", YELLOW, BLACK, 11, 1 );
        LCD_DispString( "Keyword: ", CYAN, BLACK, 0, 6 );
        LCD_DispString( "Latitude: ", CYAN, BLACK, 0, 7 );
        LCD_DispString( "Longitude: ", CYAN, BLACK, 0, 8 );

        LCD_DispString( "Altitude: ", CYAN, BLACK, 0, 10 );
        LCD_DispString( "Status: ", CYAN, BLACK, 0, 11 );
        LCD_DispString( "UTC Time: ", CYAN, BLACK, 0, 12 );
        LCD_DispString( "UTC Date: ", CYAN, BLACK, 0, 13 );

        LCD_DispString( "Satellites used: ", CYAN, BLACK, 0, 15 );
        LCD_DispString( "Satellites in view: ", CYAN, BLACK, 0, 16 );
        LCD_DispString( "Satellites ID: ", CYAN, BLACK, 0, 17 );

        for(;;)
        {       
                if( flag_GPS_data_updated )
                {
                        LCD_Clear_SelectArea( BLACK, 0, 48, 240, 48 );
                        LCD_DispString( GPS_data_buff, WHITE, BLACK, 0, 3 );
                        LCD_DispString( GPS_keyword, WHITE, BLACK, 9, 6 );
                        LCD_DispChar( GPS_data.lat_ew, WHITE, BLACK, 10, 7 );
                        LCD_DispString( GPS_data.latitude, WHITE, BLACK, 12, 7 );
                        LCD_DispChar( GPS_data.long_ns, WHITE, BLACK, 11, 8 );
                        LCD_DispString( GPS_data.longitude, WHITE, BLACK, 13, 8 );

                        LCD_DispString( GPS_data.altitude, WHITE, BLACK, 10, 10 );
                        LCD_DispChar( GPS_data.status, RED, BLACK, 8, 11 );
                        LCD_DispString( GPS_data.time, WHITE, BLACK, 10, 12 );
                        LCD_DispString( GPS_data.date, WHITE, BLACK, 10, 13 );
                       
                        LCD_DispString( GPS_data.satellites, WHITE, BLACK, 17, 15 );
                        LCD_DispString( GPS_data.satellites_inview, WHITE, BLACK, 20, 16 );
                        LCD_DispString( GPS_data.satellites_id, WHITE, BLACK, 15, 17 );

                        flag_GPS_data_updated = 0;
                        //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
                }
                if( flag_usart3Rx )
                {
                        flag_usart3Rx = 0;
                }
        }
}

/************************ (C) COPYLEFT 2010 Leafgrass ************************/


下面是keil工程

代码主要在gps.h gps.c 和 stm32f10x_it.c里
GPSourdev_576208.rar(文件大小:859K) (原文件名:RTOS_STM32(v2.4).rar)
希望解决了上述中断问题的朋友还多提宝贵意见!

出0入0汤圆

发表于 2010-8-19 19:40:39 | 显示全部楼层
上图哈  


哈哈

出0入0汤圆

 楼主| 发表于 2010-8-19 21:13:59 | 显示全部楼层

(原文件名:DSC00029.JPG)

暂时就这一张图,手机照的,不太清楚,等我把GPS的固件刷成9600的了,定位精确了再上新的图 ^_^

液晶的工程在这里
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4160441&bbs_page_no=1&search_mode=3&search_text=librae8226&bbs_id=9999

出0入0汤圆

 楼主| 发表于 2010-8-19 21:20:49 | 显示全部楼层
这还有两张,补上,呵呵~


(原文件名:GPS第一次定位.JPG)


(原文件名:GPS第一次偏差.jpg)

出0入0汤圆

发表于 2010-8-19 21:27:15 | 显示全部楼层
SPI的tft吧

出0入0汤圆

 楼主| 发表于 2010-8-19 21:33:36 | 显示全部楼层
回复【5楼】1181zjf  
-----------------------------------------------------------------------

是啊,呵呵,省好几个IO呢!

出0入0汤圆

发表于 2010-8-19 21:38:47 | 显示全部楼层
我顶啊  ,一个学校的 !!!

出0入0汤圆

 楼主| 发表于 2010-8-19 21:41:57 | 显示全部楼层
裸奔的日子到头了……

出0入0汤圆

发表于 2010-8-19 21:42:43 | 显示全部楼层
顶一个,华德的,哈哈哈

出0入46汤圆

发表于 2010-8-19 21:42:44 | 显示全部楼层
不错!

出0入8汤圆

发表于 2010-8-20 09:12:55 | 显示全部楼层
顶!

出0入0汤圆

发表于 2010-8-20 09:32:31 | 显示全部楼层
gps的漂移怎么样。静态定位的时候

出0入0汤圆

 楼主| 发表于 2010-8-20 20:07:51 | 显示全部楼层
回复【12楼】ququ625
-----------------------------------------------------------------------

现在还是韩国的什么标准呢,学校开学了,要忙活两天,过两天好好测试测试再贴出来~

出0入0汤圆

发表于 2010-8-21 11:20:25 | 显示全部楼层
必须顶!!

出0入0汤圆

发表于 2010-8-21 15:08:57 | 显示全部楼层
楼主的232转TTL、USB哪里买的?还是自己做的?

出0入0汤圆

 楼主| 发表于 2010-8-21 17:50:26 | 显示全部楼层
USB转串口线是以前买板子带的,232-TTL是自己焊的

出0入0汤圆

发表于 2010-8-21 23:22:14 | 显示全部楼层
啊哈~ 楼主的硬件除了那个TFT屏 其它的和我的一模一样.....
连232转USB的线都一样的..囧~

GPS模块我也买了 还没开始弄, 看来有了楼主的代码 可以参考下咯

出0入4汤圆

发表于 2010-8-22 00:16:00 | 显示全部楼层
严重记号!!!

出0入0汤圆

 楼主| 发表于 2010-8-22 15:10:50 | 显示全部楼层
回复【17楼】jaylondon  
-----------------------------------------------------------------------

好啊,一起研究研究吧,呵呵

出0入0汤圆

 楼主| 发表于 2010-8-24 09:15:12 | 显示全部楼层
新的测试结果:

按帖子里给的方法
用C370_9600.bin固件重新烧写FLASH

(原文件名:更新固件成功.jpg)


   4800波特率
   东九区
   韩国坐标
更新到
   9600波特率
   中国时区
   WGS-84坐标

更新后的情况:

(原文件名:9600偏差.jpg)
(下方红点为GPS所在位置,上方红点为GPS数据所指位置)
时间没问题了,UTC时间,加8小时就是中国时区,但是出现了偏差更大的情况,大概偏了有400多米。

测试环境:

电源小板 (原文件名:电源小板.JPG)


TTL-232小板 (原文件名:TTL-232小板.JPG)


在窗户边的测试1 (原文件名:测试1.JPG)


在窗户边的测试2 (原文件名:测试2.JPG)

后来把GPS拿到室外,情况也是一样,偏差还是那么些,还是朝那个方向偏,不过可以肯定GPS灵敏度还是很高的,大概走几步经纬度信息就会有变化,漂移很小的,几乎没有,只有在运动的时候数据有少许漂动,位置稳定下来之后数据还是很稳定的。

可以确定,假如理想状态GPS输出的这个位置和实际位置一样的话,定位会很精确,因为每一步移动的方向和数据变化的方向是很稳合的,现在的问题仅仅相当于它是整体将位置平移到了400多米以外的一个点。

不知道有没有遇到这种情况的,怎么处理呢?

我再琢磨琢磨,看看能否更改为DGPS模式,用差分方式减小偏差。

出0入0汤圆

发表于 2010-8-24 17:03:39 | 显示全部楼层
#define USART2_RX_BUF_SIZE 128
#define USART2_TX_BUF_SIZE 64

vu8 USART2RxBuf[USART2_RX_BUF_SIZE];        //for receive via DMA
vu16 USART2RxBufGetPos=0;
vu8 USART2TxBuf[USART2_TX_BUF_SIZE];        //for send via DMA

void Usart2Init(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        USART_ClockInitTypeDef  USART_ClockInitStructure;
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        //UART2: Configure USART2 Tx (PA.2) as alternate function push-pull
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        //Configure USART2 Rx (PA.3) as input floating
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

    //DMA Init for USART2 Rx
    DMA_DeInit(DMA1_Channel7);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)USART2+4;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART2TxBuf;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = 0;
    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_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel7, &DMA_InitStructure);

        //DMA_ClearITPendingBit(DMA1_IT_TC4);
        //DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);

    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
           USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);

        //开始一次DMA传输!
           //DMA_Cmd(DMA1_Channel4, ENABLE);

        //DMA Init for USART2 RX
    DMA_DeInit(DMA1_Channel6);        //for USART RX ONLY
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)USART2+4;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART2RxBuf;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = USART2_RX_BUF_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_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel6, &DMA_InitStructure);

        //DMA_ClearITPendingBit(DMA1_IT_TC5);
        //DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);

    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
           USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);

        //开始DMA传输
           DMA_Cmd(DMA1_Channel6, ENABLE);

        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;
       
        //Configure the USART2 synchronous paramters
        USART_ClockInit(USART2, &USART_ClockInitStructure);

        USART_InitStructure.USART_BaudRate = 115200;
        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;

        //Configure USART1 basic and asynchronous paramters
        USART_Init(USART2, &USART_InitStructure);

          //Enable USART1
        USART_Cmd(USART2, ENABLE);

}

bool Usart2Send(u8 * pdata, int length)
{
        int i;

        if(length>USART2_TX_BUF_SIZE){
                return FALSE;
        }
                                                          
        //If is DMA Enabled now
        if(DMA1_Channel7->CCR & 0x01){
                //Waiting for DMA Transfer Complate Falg.
                while(DMA_GetFlagStatus(DMA1_FLAG_TC7) == RESET){};
                DMA_ClearITPendingBit(DMA1_FLAG_GL7|DMA1_FLAG_TC7|DMA1_FLAG_HT7);
                   DMA_Cmd(DMA1_Channel7, DISABLE);
        }

        //Copy data to DMA buffer
        for(i=0; i<length; i++){
                USART2TxBuf=pdata;       
        }       

        DMA1_Channel7->CNDTR = length;

        //Start DMA transfer
           DMA_Cmd(DMA1_Channel7, ENABLE);

        return TRUE;
}

int Usart2Receive(u8 * pbuffer, int length, int timeout_ms)
{
        u16 received=0;

        u32 tick;
        tick=TickGetMs() + timeout_ms;
       
        while(received<length){
                if(USART2RxBufGetPos!= USART2_RX_BUF_SIZE-DMA1_Channel6->CNDTR){
                        pbuffer[received]=USART2RxBuf[USART2RxBufGetPos];
                        received++;
                        USART2RxBufGetPos++;
                        if(USART2RxBufGetPos>=USART2_RX_BUF_SIZE){
                                USART2RxBufGetPos=0;                               
                        }                                                       
                }               
                if(tick<TickGetMs()) return 0;
        }

        return received;
}

出0入0汤圆

发表于 2010-8-24 17:09:03 | 显示全部楼层
上面是我的Usart的DMA代码,看看有什么帮助没有

我认为STM32的USART使用DMA收发代码最简单,最稳定,不出错,而且不耗时。我的USART1,2,3都用的DMA

裸奔时,多个USART,可以分时工作。

while(1){
  Usart1Process();
  Usart2Process();
  Usart3Process();
}

出0入0汤圆

发表于 2010-8-24 19:49:46 | 显示全部楼层
楼主好好研究啊 ,到时候分享经验

出0入0汤圆

 楼主| 发表于 2010-8-25 08:43:19 | 显示全部楼层
回复【22楼】dengting  守望者
-----------------------------------------------------------------------

谢谢分享!
我也一直想改成DMA的来着,没来得及,呵呵,真是如遇甘霖~

出0入0汤圆

发表于 2010-8-25 11:54:24 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-8-25 13:01:11 | 显示全部楼层
楼主,GPS发回的度分秒,最后都有几位小数的,你只取了整数,误差当然大了。

出0入0汤圆

发表于 2010-8-25 14:32:51 | 显示全部楼层
我手中也有这个模块,那天也试试

出0入0汤圆

 楼主| 发表于 2010-8-26 08:26:47 | 显示全部楼层
回复【27楼】fsclub  绿林好汉
-----------------------------------------------------------------------

纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
纬度半球N(北半球)或S(南半球)
经度dddmm.mmmm(度分)格式(前面的0也将被传输)
经度半球E(东经)或W(西经)

没错啊,不是这样的格式么?

取的经纬度数据是
45°52'34.46
126°32'21.46

这个应该没有问题的呀?

出0入0汤圆

发表于 2010-9-9 08:32:08 | 显示全部楼层
楼主的窗台是花岗岩的?这种石材最好在室外使用。某些花岗岩的放射性较强。
因此通常不推荐在室内使用的。

出0入0汤圆

发表于 2010-9-26 20:54:49 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-9-26 23:30:17 | 显示全部楼层
守望者的程序真好。谢谢

出0入0汤圆

发表于 2010-9-26 23:45:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-27 00:21:35 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-9-27 13:07:21 | 显示全部楼层
回复【30楼】zhuanzhuan  
-----------------------------------------------------------------------

啊~谢谢!呵呵,我跟老师说说~

这是学校实验室窗台……

出0入0汤圆

发表于 2010-9-27 13:46:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-8 22:46:30 | 显示全部楼层
HITer顶!

出0入0汤圆

发表于 2010-10-9 08:10:08 | 显示全部楼层
偏移搞好了没有?

出0入0汤圆

发表于 2010-10-9 10:13:28 | 显示全部楼层
飞思卡尔第五届电池··~~~~~想必是摄像头组吧?

出0入0汤圆

发表于 2010-10-9 20:06:15 | 显示全部楼层
强!!!

出0入4汤圆

发表于 2010-10-9 20:31:32 | 显示全部楼层
楼主的状态机写到中断里去了呀,多不好呀

出0入0汤圆

 楼主| 发表于 2010-10-13 10:50:55 | 显示全部楼层
回复【41楼】electricit  
-----------------------------------------------------------------------

嗯,由于是放在系统中的,当时中断没处理明白,就先将就用了,呵呵~

出0入0汤圆

 楼主| 发表于 2010-10-13 10:52:38 | 显示全部楼层
回复【39楼】icevel  
-----------------------------------------------------------------------

是的,已经是历史了
^_^

出0入0汤圆

发表于 2010-10-19 13:07:14 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-19 15:21:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-20 13:12:50 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-10-23 12:06:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 18:25:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 20:25:47 | 显示全部楼层
拖了很久,今晚刚开始写这个程序。 又翻到楼主的帖子了。
学习学习

出0入0汤圆

发表于 2010-10-23 23:34:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-24 15:09:14 | 显示全部楼层
LZ 我今天突然看到信息数 谷歌地图在中国的经纬度是有漂移的。
所以,你上面测到的说有400米的误差 而且方向是对的。我觉得应该是谷歌地图的原因

出0入0汤圆

发表于 2010-10-24 15:12:07 | 显示全部楼层
11。电子地图和卫星影像误差校准

电子地图和卫星影像的经纬度存在一定差异,需要进行一定坐标变换以保证电子地图和卫星影像显示相同的区域。这种差异一方面是由于数据来源不同其本身存在的误差,更主要的因素是目前国家对地理数据存在政策限制,因此国内的数据都被人工歪曲,而国外的数据却相对精度更高。如果您查看的地区存在这种误差导致地图不同步,您可以在电子地图上把一标志物(如标志建筑,道路十字路口,水流分枝或汇集处)移至地图中心(利用拖拽功能或直接双击该标志物),再在卫星影像窗口把同一地物移至地图中心(同样双击该对应的地物。如果该地物不在当前窗口范围,您可能需要使用卫星影像本身的缩放平移工具先找到它的位置),然后点击“经纬度差异校准”链接。此后在电子地图窗口上的平移缩放操作将会利用新的误差参数自动校准卫星影像,使两者同步。如果您不慎弄错了或者转换至距离相当远的其他区域(如其他省市),请从城市列表中重新选择您要查看的城市或者按“恢复经纬度差异缺省值”链接使用缺省的误差调整参数(适合北京地区)。

出0入0汤圆

发表于 2010-10-24 15:16:00 | 显示全部楼层
同一个经纬度坐标在谷歌地图与谷歌地球上显示不同的地点         举报滥用情况       
       
magi1983
等级 1
10-1-22
问题是这样,我在谷歌地球上找到一个地点,比如天安_门广场的人民英雄纪念碑,谷歌地图显示的坐标是39°54'11.43" 116°23'28.6",
打开谷歌地图,在搜索栏输入这个坐标,地图显示的是国家大剧院的东南角,而不在人民英雄纪念碑上,两点相距大约400米。又对北京市的其他一些地标做了测试结果同样存在这个误差。

然后我又对美国的自由女神像做了同样的测试,坐标为(40°41'21.19" -74°2'40.33"),发现谷歌地球与谷歌地图显示的位置没有偏差。

请问谷歌地图和谷歌地球在中国境内出现偏差的现象,是我操作的问题还是这两个产品本身的误差。希望能够尽快得到解决。


---------------------------------------------------------------------------------------------------------------------

这些都是我查到的信息,大家看看,是不是这个原因。

出0入0汤圆

 楼主| 发表于 2010-10-30 10:18:35 | 显示全部楼层
回复【51楼】jaylondon  
-----------------------------------------------------------------------

嗯,确实也有可能,不过我同学的也是这个GPS,用不同的单片机采而已,偏差大概15m,有时会大一些,我这个重烧写下固件就好了,偏差也不算太大

出0入0汤圆

发表于 2010-11-1 11:59:46 | 显示全部楼层
问题是gps静止不动的原因,你可以移动gps来获取比较准确的数据,如果静止不动后就会有很大误差,顺便说说地图误差,在google的卫星图是不会有多大误差,而矢量地图就有误差,这是由于google矢量地图有mapabc提供的,如果要准确需要交一定流量费给mapabc让mapabc地图服务器纠偏。

出0入0汤圆

发表于 2010-11-15 13:31:06 | 显示全部楼层
今天测试的结果,要加天线,效果还不错!

(原文件名:GPS测试结果.jpg)


(原文件名:GPS测试结果2.jpg)

出0入0汤圆

发表于 2010-11-16 00:38:21 | 显示全部楼层
呵呵,原来是没有加天线啊!GPS我原来测试过很准的,楼主可以直接用串口转接板直接将数据接收到电脑里面处理!

出0入0汤圆

发表于 2011-1-8 18:14:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-9 14:30:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-11 10:43:52 | 显示全部楼层
好东东。

出0入0汤圆

发表于 2011-2-11 11:17:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-14 19:21:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-9 19:05:36 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2011-8-23 21:20:22 | 显示全部楼层
mark

出500入0汤圆

发表于 2011-8-23 21:33:58 | 显示全部楼层
邮购部的不是带天线吗?

出0入0汤圆

发表于 2011-9-1 16:16:23 | 显示全部楼层
很多的资源,不错,谢谢分享。

出0入0汤圆

发表于 2011-10-12 12:54:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-13 16:09:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-9 17:24:13 | 显示全部楼层
回家了看这个贴子去,数据采集有得一看了。

出0入0汤圆

发表于 2012-2-9 19:41:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 12:52:55 | 显示全部楼层
回复【3楼】librae8226
-----------------------------------------------------------------------

楼主这地图用的是什么?

出0入0汤圆

发表于 2012-2-24 16:01:40 | 显示全部楼层
这个可以下载看看

出0入0汤圆

发表于 2012-3-2 22:15:12 | 显示全部楼层
就用这个数据做采集吧。

出0入0汤圆

发表于 2012-4-3 15:18:15 | 显示全部楼层
哇,这样的必须标记。

出0入0汤圆

发表于 2013-5-4 00:11:43 | 显示全部楼层
牛逼哦!

出0入0汤圆

发表于 2013-7-13 20:50:58 | 显示全部楼层

出0入0汤圆

发表于 2013-7-13 22:12:34 | 显示全部楼层
jaylondon 发表于 2010-10-24 15:09
LZ 我今天突然看到信息数 谷歌地图在中国的经纬度是有漂移的。
所以,你上面测到的说有400米的误差 而且方 ...

好像中国自己有一个坐标模型,要转换的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 05:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表