在调试Modubus协议时需要用到串口的奇偶校验位,但是平时用串口时很少用到奇偶校验位,网上搜相关的历程也很少,将自己写的串口奇偶校验代码分享上来方便以后查阅。
如果用库函数的话,添加奇偶检验位就很简单,在初始化串口的时候,将默认的无校验位修改为奇校验或者偶校验,同时将数据位设置为9位。
串口初始化代码如下:
#include "uart2.h"
#define CHECK_NONE_ONE_STOP 0 //无校验位 1个停止位 1有效 0 无效
#define CHECK_NONE_TWO_STOP 1 //无校验位 2个停止位 1有效 0 无效
#define CHECK_EVEN 1 //偶数校验 1有效 0 无效
#define CHECK_ODD 0 //奇数校验 1有效 0 无效
void uart2_init( u32 baud )
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );
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 );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位
#if(CHECK_EVEN == 1) //如果定义了偶校验 数据位长度要改为9位
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;
#endif
#if(CHECK_ODD == 1) //如果定义了偶校验 数据位长度要改为9位
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
#endif
#if(CHECK_NONE_ONE_STOP==1) //停止位为 一位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
#endif
#if(CHECK_NONE_TWO_STOP==1) //停止位为 两位
USART_InitStructure.USART_StopBits = USART_StopBits_2;
#endif
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init( USART2, &USART_InitStructure );
USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );
USART_Cmd( USART2, ENABLE );
}
void USART2_IRQHandler( void )
{
u16 tem = 0;
if( USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET )
{
tem = USART_ReceiveData( USART2 );
USART_SendData( USART2, tem );
}
}
通过宏定义来设置是否使用奇偶校验位,停止位为1位还是2位。如果使用了奇偶校验时,要将数据位设置为9位。设置好之后就不用管了,具体校验工作由硬件来完成。
在串口中断函数中实现的功能是,将串口2接收到的数据通过串口2发送出去。
在宏定义中设置为2个停止位,偶校验。
串口测试效果如下:
如果串口助手设置和单片机发送不一致时,接收到的数据就为乱码。
源码地址https://download.csdn.net/download/qq_20222919/12921508
上一篇:STM32单片机串口空闲中断接收不定长数据
下一篇:STM32F103单片机JTAG端口重映射
推荐阅读最新更新时间:2024-11-09 11:51
推荐帖子
- 要换工作
- 大家推荐做windowsmobile手机的待遇好的公司,工作找好了散分?顺便大家评价下那个公司待遇好一些要换工作做这个的公司多吧,呵呵,不过现在这月份跳,年终奖都不要了?BLESS:)LZ在哪里啊?现在找工作也不好找,大公司价都压得很低也不把自己的条件说一下楼主强
- thinking8088 嵌入式系统
- 新型开关电源设计与应用
- 新型开关电源设计与应用新型开关电源设计与应用好东西,找到不容易,我要下载
- tonytong 电源技术
- 工业4-20mA电路
- 有没有比较底层的工业4-20mA电路,就是不用现成转换芯片的,求一个参数比较齐全的工业4-20mA电路,大神们帮帮忙,谢谢工业4-20mA电路0-20mA路过,学习一下
- 轩辕默殇 模拟电子
- 学习干货
- 学习电路的一些教材电子书目录:数学物理方法梁昆淼(第四版)(含答案书)通信原理(第六版)樊昌信曹丽娜_第六版--课后思考题及习题答案(含答案书)线性代数(第五版)].同济大学(含答案书与第六版)信号与线性系统分析习题全解(吴大正第4版)(含答案书)https://pan.baidu.com/s/1VoiiSETXzcmM0V1nEAbiyA学习干货 百度云比较难分享文件,上传失败了,晚点我再试试
- 2dsf 下载中心专版
- 酬金500元,北京,请教51单片机的TCP/IP问题
- 本人在北京,现有一块杭州晶控电子的51NET以太网开发板,开发板介绍:http://www.hificat.com/net/net.asp,想请教一下附带光盘里的单片机源码,(源码已上传,在附件里)。内容:讲解源码,源码我没仔细看过,是单片机和PC通信的内容,应该是TCP/IP,UDP之类的。时间:1月23日以后,现在还在工作,估计1月23日就可以辞职不干了。硬件条件:需要你有台计算机,带串口,网卡,辞职后我就没计算机了,要把开发板带到你那台计算机上做实验。软件条件:需要你熟悉51单片机
- nanxiangzi 嵌入式系统
- 视频分配器中提高信号完整性的方法
- 引言 处理高速电子系统的信号完整性问题一直是比较难于处理的,特别是越来越多的芯片的工作频率超过了100MHz,信号的边沿越来越陡(已达到ps级),这些高速器件性能的提高更增加了系统设计的难度。同时,高速系统的体积不断减小使得PCB板的密度迅速提高。信号完整性问题已经成为新一代高速产品设计中越来越值得注意的问题。 信号完整性问题的产生 信号完整性(SI)是指信号在电路中以正确的时序和电压作出响应的能力。从广义上讲,信号完整性问题表现为反射、串扰、地弹和延迟等。 反射
- rain 模拟电子
设计资源 培训 开发板 精华推荐
- SEC-3PH-11-OBC-EVB:三相车载充电器 (OBC) PFC-LLC 平台
- MC78M12ABTG 12V 电流升压稳压器的典型应用
- LTC3440,600mA 时简单的锂离子至 3.3V 转换器
- LT3091IT7 简单电缆压降补偿的典型应用
- 用于视频/成像的视频开关
- ATPROTO1-XPRO、PROTO1 Xplained Pro Board 是 Xplained Pro 平台的通用原型扩展板
- 标准DIL24插座的LSM6DSO适配器板
- 66666新处理
- LTM8052EY 的典型应用,用于调节珀耳帖器件的正负电压和电流
- 使用 ON Semiconductor 的 CS8147 的参考设计