当前位置: 首页 > news >正文

安阳市城乡建设规划局网站收费小说网站怎么做

安阳市城乡建设规划局网站,收费小说网站怎么做,旅游分销网站建设方案,网站如何做内部链接#x1f380; 文章作者#xff1a;二土电子 #x1f338; 关注公众号获取更多资料#xff01; #x1f438; 期待大家一起学习交流#xff01; 文章目录 一、GPS模块简介二、使用方法2.1 引脚介绍2.2 数据帧介绍2.3 关于不同的启动方式 三、前置知识3.1 strstr函数3.2… 文章作者二土电子 关注公众号获取更多资料 期待大家一起学习交流 文章目录 一、GPS模块简介二、使用方法2.1 引脚介绍2.2 数据帧介绍2.3 关于不同的启动方式 三、前置知识3.1 strstr函数3.2 memset函数3.3 memcpy函数3.4 strtod函数 四、程序设计4.1 串口初始化程序4.2 串口1接收中断服务函数4.3 帧信息解析4.4 经纬度数据解析转换 一、GPS模块简介 我们在做一些项目时有时会需要进行GPS定位获取自身的经纬度信息这里使用的是中科微电子的GPS模块ATGM336H带陶瓷天线。 该模块可以实现GPS定位返回定位点的UTC时间和经纬度信息。 UTC时间是全世界公用的时间我们用的北京时间比UTC时间快8个小时。 在使用时必须注意以下几点 必须在室外空旷地带才能进行定位定位是陶瓷天线上的小圆点必须朝上上方不要有遮挡物楼间距也可能会影响定位楼间距较小的地方可能定位失败 二、使用方法 2.1 引脚介绍 ATGM336H使用3.3V或者5V供电利用串口将GPS信息发送出来我们简单地介绍一下它的几个引脚 引脚功能VCC电源正极3.3V或5VGND电源负极TXD串口发送RXD串口接收 PPS引脚这里没有用到就不再做介绍了有兴趣的小伙伴可以自行搜索一下它的用途。 2.2 数据帧介绍 ATGM336H利用串口发送定位信息给主控芯片串口波特率为9600我们最开始可以先用USB-TTL连接ATGM336H到空旷地带观察一下它的输出信息定位成功时接收到的信息如下 我们可以看到ATGM336H一次会返回许多信息其实我们只需要关注其中的“GNRMC”这条信息即可我们简单看一下这条信息。 $GNRMC,015135.000,A,4159.65553,N,12136.79345,E,0.52,0.00,191123,,,A*7F消息ID —— $GNRMC定位点的UTC时间 —— 015135.000定位状态 —— A定位V导航我们进行定位时如果该位为A表示数据有效该位为V表示数据无效纬度 —— 4159.65553纬度方向 —— N经度 —— 12136.79345经度方向 —— E 需要注意的是这里的经纬度并不能直接拿来在地图上搜索定位而是需要进行数据转换之后才可以关于数据抓换后续的程序设计会详细介绍。 2.3 关于不同的启动方式 ATGM336H有三种不同的启动模式不同模式定位成功所需的时间是不同的我们这里来简单描述一下这几种启动模式 冷启动 冷启动是指在一个陌生的环境下启动 GPS 直到 GPS 和周围卫星联系并且计算出坐标的启动过程。比如我们初次使用电池耗尽导致星历信息丢失或者关机状态下将接收机移动 1000 公里以上距离再启动都属于冷启动冷启动大概需要等待1~2分钟才能定位成功。温启动 温启动是指距离上次定位时间超过 2 个小时的启动,搜星定位时间介于冷启动和热启动之间。热启动 热启动是指在上次关机的地方没有过多移动启动 GPS但距离上次定位时间必须小于 2 个小时。 三、前置知识 我们在介绍程序设计之前先介绍一下一些必备的前置知识关于STM32串口的配置这里就不再详细介绍了具体可以到博主的STM32俗称笔记专栏串口篇查看。这里着重介绍几个C语言中的函数。 3.1 strstr函数 strstr函数原型为 char *strstr( const char *str1, const char *str2 );该函数是在字符串str1中查找是否含有字符串str2如果存在返回str2在str1中第一次出现的地址指针否则返回NULL。使用strstr函数时需要包含头文件string.h。 值得注意的是实际输入变量都是指针如果我们稍加设计能得到循环查找分隔符的效果具体可以看后面在解析接收帧信息时的程序设计这里只介绍一下它的基本用法。 3.2 memset函数 memset函数的函数原型为 void *memset(void *s, int c, size_t n); memset是一个初始化函数作用是将某一块内存中的全部设置为指定的值。 s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针。 3.3 memcpy函数 memcpy函数的函数原型为 void *memcpy(void*dest, const void *src, size_t n); 该函数的功能是将由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。 3.4 strtod函数 strtod函数的函数原型为 double strtod(const char *nptr, char **endptr);strtod函数会检查输入的nptr字符串跳过前面的空格字符直到遇上数字或正负符号才开始做转换到出现非数字或字符串结束时(‘\0’)才结束转换并将结果返回返回值是一个double型数值。 若endptr不为NULL则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。 使用该函数时需要包含头文件。 四、程序设计 下面我们来进行程序设计我们用串口1来接收ATGM336H发送来的信息用串口2将我们解析处理后的GPS信息发送给上位机。 4.1 串口初始化程序 这里用到了两个串口我们封装一个串口初始化函数用来初始化串口 /***函数名称uart_init*函数功能初始化USART*输入参数UARTx串口几bound波特率*返回值无*备 注可以修改成输入初始化哪个USART* */ void uart_init(UART_TypeDef UARTx,u32 bound) {// 相关结构体定义GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;switch (UARTx){case 0:// 使能USART1GPIOA时钟RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; // PA.9GPIO_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; // PA10GPIO_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_IRQChannelPreemptionPriority3 ; // 抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; // 子优先级3NVIC_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); // 初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 开启串口接收中断USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 使能空闲中断USART_Cmd(USART1, ENABLE); // 使能串口1break;case 1:// 使能USART2GPIOA时钟RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE); // USART2_TX GPIOA.2GPIO_InitStructure.GPIO_Pin GPIO_Pin_2; // PA.2GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出GPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA.2// USART2_RX GPIOA.3初始化GPIO_InitStructure.GPIO_Pin GPIO_Pin_3; // PA3GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入GPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA.3 // Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority3 ; // 抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; // 子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; // IRQ通道使能NVIC_Init(NVIC_InitStructure); // 根据指定的参数初始化VIC寄存器// USART2 初始化设置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(USART2, USART_InitStructure); // 初始化串口2USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 开启串口接收中断USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); // 使能空闲中断USART_Cmd(USART2, ENABLE); // 使能串口2break;default:break;} }4.2 串口1接收中断服务函数 在进行数据接收时我们一帧一帧地接收直到接收到我们需要的帧之后将接接收缓冲区的数据复制到我们定义好的接收数据结构体中。 /***函数名称USART1_IRQHandler*函数功能串口1中断服务函数*输入参数无*返回值无*备 注无* */ void USART1_IRQHandler (void) {u8 recContent; // 存储接收内容// 如果串口接收到内容if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) {recContent USART_ReceiveData(USART1); // 存储接收内容// 如果接收到的是$$是一帧信息的开始// 保证每接收到新的一帧信息就从缓冲区起始位置开始存储if(recContent $){gReceCunt 0; // 清零帧信息计数变量}// 存储接收到的帧信息gUart1RcecBuf[gReceCunt ] recContent;// 确定是否收到GPRMC/GNRMC这一帧数据if(gUart1RcecBuf[0] $ gUart1RcecBuf[4] M gUart1RcecBuf[5] C){// 接收到换行接收完了一帧信息if(recContent \n) {memset(receDataFrame.Frame_Buffer, 0, Frame_Buffer_Length); // 初始化接收帧信息数组memcpy(receDataFrame.Frame_Buffer, gUart1RcecBuf, recContent); // 保存GPRMC/GNRMC这帧的数据receDataFrame.isGetData TRUE; // 接收成功recContent 0; // 清零接收帧信息接收计数变量memset(gUart1RcecBuf, 0, UART1RX_MAX_LENGTH); // 清空串口1接收Buf } }// 如果接收内容超出最大长度不再继续接收if(recContent UART1RX_MAX_LENGTH){recContent UART1RX_MAX_LENGTH;}} }4.3 帧信息解析 存储到需要的帧信息后下一步就是对它进行解析解析时我们利用每一个数据间的逗号作为分隔符利用strstr函数寻找逗号对应的地址将两个逗号之间的信息存储到我们提前定义好的解析信息存储数组中。仔细分析一下“$GNRMC”帧会发现我们只需要找到七个逗号的地址提取他们两个相邻逗号中间的字符串就可以得到GPS信息思路介绍完了我们来看一下程序设计。 /***函数名称Uart_Rece_Pares*函数功能解析串口接收内容*输入参数无*返回值无*备 注无* */ void Uart_Rece_Pares(void) // 串口接收内容解析函数 {// 注意变量类型char *point 0; // 逗号的地址指针char *nextPoint 0; // 下一个逗号的地址指针u8 tempVar 0; // 临时循环变量// 如果数据接收成功if (receDataFrame.isGetData){receDataFrame.isGetData 0; // 清除接收成功标志位// for循环解析接收帧// 总共需要找到7个逗号for (tempVar 0;tempVar 7;tempVar ){// 第一次循环if (tempVar 0){// 寻找第一个逗号if ((point strstr(receDataFrame.Frame_Buffer,,)) NULL){printf (Prase Errpr!\r\n); // 解析错误}}else{point ; // 防止重复找到同一个逗号// 寻找下一个逗号// 注意strstr函数的输入变量是从上一个逗号之后开始找下一个逗号if ((nextPoint strstr(point,,)) ! NULL){// 存储信息switch (tempVar){case 1: // UTC时间memcpy(receDataFrame.UTCTime,point,nextPoint - point);break;case 2: // 数据有效标识memcpy(receDataFrame.UsefullFlag,point,nextPoint - point);break;case 3: // 纬度memcpy(receDataFrame.latitude,point,nextPoint - point);break;case 4: // 纬度方向memcpy(receDataFrame.N_S,point,nextPoint - point);break;case 5: // 经度memcpy(receDataFrame.longitude,point,nextPoint - point);break;case 6: // 经度方向memcpy(receDataFrame.E_W,point,nextPoint - point);break;}point nextPoint; // 更新上一个逗号地址指针receDataFrame.isParseData TRUE; // 数据解析完成// 数据有效if (receDataFrame.UsefullFlag[0] A){printf (Data is usefull!\r\n);}else if (receDataFrame.UsefullFlag[0] V){printf (Data is invalid!\r\n);}}else{printf (Prase Errpr!\r\n); // 解析错误}}}} }4.4 经纬度数据解析转换 解析出经纬度信息后我们需要将它转换成我们需要的格式可以直接在地图中输入定位拿上面的例子来介绍一下转换方法 上面接收到地经纬度信息为 4159.65553,N,12136.79345,E换算方法和结果为 41 59.65553 / 60 41.994 121 36.79345 / 60 121.613下面我们来展示一下程序实现 /***函数名称Data_Transfor*函数功能数据转换*输入参数无*返回值无*备 注无* */ void Data_Transfor (void) {float latitude 0; // 存储纬度信息u16 temp1 0; // 临时变量1存储整数float longitude 0; // 存储经度信息u16 temp2 0; // 临时变量2存储整数latitude strtod(receDataFrame.latitude,NULL); // 字符串转换成浮点数longitude strtod(receDataFrame.longitude,NULL); // 字符串转换成浮点数// 纬度信息处理// 五位纬度信息if ((latitude - 10000.0) 0){// 前三位需要单独拿出来组成一个数temp1 (((u16)latitude / 10000) % 10) * 100 (((u16)latitude / 1000) % 10) * 10 ((u16)latitude / 100) % 10;latitude latitude - (float)temp1 * 100;latitude (float)temp1 latitude / 60;printf (latitude:%.3f\r\n,latitude);}else // 四位纬度信息{// 前两位需要单独拿出来组成一个数temp1 (((u16)latitude / 1000) % 10) * 10 ((u16)latitude / 100) % 10;latitude latitude - (float)temp1 * 100;latitude (float)temp1 latitude / 60;printf (latitude:%.3f\r\n,latitude);}// 经度信息处理// 五位经度信息if ((longitude - 10000.0) 0){// 前三位需要单独拿出来组成一个数temp2 (((u16)longitude / 10000) % 10) * 100 (((u16)longitude / 1000) % 10) * 10 ((u16)longitude / 100) % 10;longitude longitude - (float)temp2 * 100;longitude (float)temp2 longitude / 60;printf (longitude:%.3f\r\n,longitude);}else // 四位经度信息{// 前两位需要单独拿出来组成一个数temp2 (((u16)longitude / 1000) % 10) * 10 ((u16)longitude / 100) % 10;longitude longitude - (float)temp2 * 100;longitude (float)temp2 longitude / 60;printf (longitude:%.3f\r\n,longitude);} }
http://www.pierceye.com/news/480148/

相关文章:

  • 医疗网站怎么做seo怎样通过网址浏览自己做的网站
  • 湖北现代城市建设集团网站wordpress用户头像插件
  • 徐州双语网站制作响应式网站开发pdf
  • 怎么做建设网站公司创建一个网站多少钱
  • 好看的扁平化网站wordpress插件编写
  • 深圳网站设计模板ps可以做网站动态图
  • 微信网站制作入门网站开发实施方案进度
  • 网站用户界面设计国内网站建设最好公司
  • 运城做网站费用高吗高端模板建站
  • 凡客诚品网站设计合肥网红打卡地
  • 淘宝网站代理怎么做的广西送变电建设公司铁塔厂网站
  • 自媒体网站开发网站的推广方式包括
  • 教育做的比较好的网站有哪些网站的建设及维护
  • dw设计做网站案例建设网站杭州
  • 做网站认证对网站有什么好处广西网站建设开发团队
  • 建一个网站需要哪些知识无锡大型互联网公司
  • 餐饮公司 网站建设做网站一年大概的盈利
  • 做金融怎么进基金公司网站免费行情软件网站游戏
  • 网站推广解释创立一个网站要多少钱
  • 绍兴专业网站建设公司大型网站建设哪家好
  • 天河网站设计响应式视频网站模板
  • 网站制作老了手机网站模板开发
  • 哪家网站建设比较好海拉尔建网站
  • 丹东网站推广海南行指专业网站开发
  • 网站如何调用手机淘宝做淘宝客中国企业网站查询
  • 淄博建设工程学校官方网站专门做商标的网站有哪些
  • 私人免费网站怎么下载企业网站设计方案
  • 做阿里巴巴网站找谁互联网推广公司
  • 网站如何做微信支付宝支付宝支付网页传奇发布网
  • 网站建设语录谷歌浏览器官网下载