社区
单片机/工控
帖子详情
求一份完整的stm32f1的韦根协议的接收程序
bluemeek
2017-07-12 03:36:49
求大神来一份基于stm32f1的韦根协议接收程序,并在电脑串口上显示出来~~
...全文
799
6
打赏
收藏
求一份完整的stm32f1的韦根协议的接收程序
求大神来一份基于stm32f1的韦根协议接收程序,并在电脑串口上显示出来~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yafee5
2018-12-14
打赏
举报
回复
大哥,g_Drive,怎么来的
踩踩踩从踩
2018-12-14
打赏
举报
回复
谁能给我说一下,java如何发送韦根协议
踩踩踩从踩
2018-12-14
打赏
举报
回复
java如何发送韦根协议
上-善-若-水
2017-10-27
打赏
举报
回复
你好,请问一下RC滤波怎么做,直接RC串联到地吗
Acuity.
2017-07-12
打赏
举报
回复
串口初始化、打印部分就不上了,除IDDataPrintf函数调用到其他变量、函数可以忽略。其他关键代码正确无误!
Acuity.
2017-07-12
打赏
举报
回复
2年前上一东家写的,韦根34程序,完美运行。
另:单片机io接韦根线要加RC滤波,否则很容易被干扰。
//源文件 #include "main.h" #define USEING_INTERR //中断方式 static u8 u_EvenCheck = 2; //偶检验 static u8 u_OddCheck = 2; //奇校验 static u8 u_EvenNums = 0; //偶校验软件比较 static u8 u_OddNums = 0; //奇校验软件比较 static u8 u_DataBits = 0; //当前接收数据位数 u8 IDData[4]; //4字节ID号 #ifdef USEING_INTERR //中断方式读取韦根数据 /*********************************************************** * 函数名:WiegandInit * 功能 :外部中断引脚初始化 * 输入 : 无 * 输出 :无 **********************************************************/ void WiegandInit(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(WIEGAND_RCC_PORT | RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = WIEGAND_DATA0_GPIO | WIEGAND_DATA1_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(WIEGAND_PORT, &GPIO_InitStructure); //Data0 中断线 PB12 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12); EXTI_InitStructure.EXTI_Line = EXTI_Line12; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //Data1 中断线 PB13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //中断优先级,尽可能设为最高优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); } /*********************************************************** * 函数名:EXTI15_10_IRQHandler * 功能 :两数据线中断函数 * 输入 : 无 * 输出 :无 **********************************************************/ void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line12) != RESET) { //Data0 -> 低电平表示1位0 if (u_DataBits == 0) { //偶校验 u_EvenCheck = 0; } else if (u_DataBits == (WG_DATA_BITS -1)) { //奇校验 u_OddCheck = 0; } else { //数据,4字节、高位在前 IDData[(WG_DATA_BITS - 2 - u_DataBits) / 8] &= ~(0x1 << ((WG_DATA_BITS - 2 - u_DataBits) % 8)); } u_DataBits++; EXTI_ClearITPendingBit(EXTI_Line12); } else if(EXTI_GetITStatus(EXTI_Line13) != RESET) { //Data1 -> 低电平表示1位1 if (u_DataBits == 0) { //偶校验 u_EvenCheck = 1; } else if (u_DataBits == (WG_DATA_BITS -1)) { //奇校验 u_OddCheck = 1; } else { //数据,4字节、高位在前 IDData[(WG_DATA_BITS - 2 - u_DataBits) / 8] |= (0x1 << ((WG_DATA_BITS - 2 - u_DataBits) % 8)); if(u_DataBits < WG_DATA_BITS / 2) u_EvenNums++; //计算1的个数来作偶校验 else if(u_DataBits < WG_DATA_BITS - 1) u_OddNums++; //计算1的个数来作奇校验 } u_DataBits++; EXTI_ClearITPendingBit(EXTI_Line13); } } /*********************************************************** * 函数名:Check * 功能 :奇偶校验,确定读出数据书否正确 * 输入 : 无 * 输出 :0->校验成功,数据有效 1->校验失败,数据无效 **********************************************************/ u8 DataCheck(void) { u8 oddcheck,evencheck; if(u_DataBits >= WG_DATA_BITS) { //数据接收完才校验 //u_DataBits = 0; if(u_EvenNums % 2 == 0) evencheck = 0; //偶数个1 else evencheck = 1; //奇数个1 if(u_OddNums % 2 == 0) oddcheck = 1; //偶数个1 else oddcheck = 0; //奇数个1 u_EvenNums = 0; u_OddNums = 0; //清零 if((u_EvenCheck == evencheck) && (u_OddCheck == oddcheck)) { //校验成功 u_EvenCheck = 2; u_OddCheck = 2; return 0; //和实际的校验码一起返回成功 } else { //校验失败 u_EvenCheck = 2; u_OddCheck = 2; return 1; } } else return 2; } #else //查询方式初始化 /*********************************************************** * 函数名:WiegandInit * 功能 :Wiegan数据线引脚初始化, * 输入 : 无 * 输出 :无 **********************************************************/ void WiegandInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(WIEGAND_RCC_PORT | RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = WIEGAND_DATA0_GPIO | WIEGAND_DATA1_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(WIEGAND_PORT, &GPIO_InitStructure); } /*********************************************************** * 函数名:GetWiegandData * 功能 :查询方式获取Wiegand数据 * 输入 : 无 * 输出 :无 **********************************************************/ u8 GetWiegandData(void) { } #endif //串口打印 void IDDataPrintf(void) { u8 CheckFlag = 0; u8 Buff[6],i; if(u_DataBits >= WG_DATA_BITS) { CheckFlag = DataCheck(); if(CheckFlag == 0) { #if 0 USART_printf(USART1,"%s " "%d " "%d " "%d " "%d ","ID:", IDData[0],IDData[1],IDData[2],IDData[3]); USART_send_string("\n"); USART_send_string("DataBits/Check: "); USART_printf(USART1, "%d " "%d\n ",u_DataBits,CheckFlag); #else for (i = 0;i < 4;i++) Buff[i] = IDData[i]; Buff[i++] = u_DataBits; Buff[i] = CheckFlag; g_Driver.OnSendCanData(Buff,6,0); #endif } else if(CheckFlag == 1) { #if 0 USART_send_string("Read Data Failed\n"); #else for (i = 0;i < 4;i++) Buff[i] = IDData[i]; Buff[i++] = u_DataBits; Buff[i] = CheckFlag; g_Driver.OnSendCanData(Buff,6,0); #endif } u_DataBits = 0; } } //头文件 #ifndef _WIEGAND_H_ #define _WIEGAND_H_ // Wiegand 数据格式 #define WG_DATA_BITS 34 //韦根34格式 // Wiegand 数据线接口 #define WIEGAND_PORT GPIOB #define WIEGAND_DATA1_GPIO GPIO_Pin_13 #define WIEGAND_DATA0_GPIO GPIO_Pin_12 #define WIEGAND_RCC_PORT RCC_APB2Periph_GPIOB #define WIEGAND_DATA1 PBin(13) #define WIEGAND_DATA0 PBin(12) // 外部函数 extern void WiegandInit(void); extern void IDDataPrintf(void); #endif
STM32
F1
03
韦根
协议
解析 (
韦根
数据
接收
实例)
STM32
F1
03
韦根
协议
解析 (
韦根
数据
接收
实例)
STM32
F4系列
韦根
协议
STM32
F407VE
韦根
协议
源码
stm32
韦根
通信
协议
基于
stm32
的
韦根
通信
协议
,使用io中断处理,可以切换
韦根
26和
韦根
32收发,经过测试
基于
stm32
的
韦根
26发送
程序
利用
stm32
的串口中断和系统时钟中断实现对上位机
韦根
26的串口数据
接收
,并将其转化为
韦根
26发送出去。
stm32
实现的
韦根
接受
程序
,完成的工程
stm32
实现的
韦根
接受
程序
,完成的工程;是
韦根
26/34接受
程序
单片机/工控
27,374
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章