在调试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;
#endifUSART_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

STM32F103单片机串口通信带奇偶校验位相关推荐

  1. NBIOT专栏之BC28与STM32F103单片机串口通信连接阿里云

    系列文章目录 创思通信BC28核心板+STM32F系列单片机开发记录博客 1.测试BC28模块 2.串口助手MQTT连接阿里云物联网平台接发数据 前言 前面记录了BC28使用串口调试助手连接阿里云的过 ...

  2. 51单片机-串口通信

    目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部 ...

  3. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  4. 51单片机串口通信【收集学习向】

    本篇整理了学习51串口通信过程中看到的一些比较好的文章,有很多的超链接.并根据自己遇到的情况分析了串口传输乱码的一些原因. 目录 1.原理知识 2.测试程序和虚拟仿真 3.电路设计与公母口连线 电路设 ...

  5. 基于PC与单片机串口通信的温度监控系统程序设计

    基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...

  6. 蓝桥杯单片机串口通信学习提升笔记

    今日得以继续蓝桥杯国赛备赛之旅: 有道是 "不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥." 那我们该如何 让这位诗人纳兰 "再听乐府曲 ,畅解相思苦"呢 ...

  7. 普中单片机--串口通信(2)---通过串口助手发送数据点LED

    普中单片机–串口通信(2) 通过串口助手发送数据 点亮LED 软件部分 #include <reg52.h> #define jingzhen 12000000UL /*使用12.0M晶体 ...

  8. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  9. 51单片机串口通信模板_51单片机串口通信

    51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...

最新文章

  1. 多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
  2. 实验报告总结_小学四年级数学下册全册知识点总结 ,家有四年级学生的家长收藏...
  3. rdd分片 spark_大数据面试题(Spark(一))
  4. python字典添加列表,将Python字典/列表插入到SQL数据库中最有效的方法是什么?...
  5. 2021年高考呼和浩特市二中成绩查询,呼和浩特市第二中学,是一所百强中学,2020年高考用实力来证明!...
  6. junit可执行但控制层无法执行_解决junit5无法使用gradle test运行测试
  7. 华为路由器NAT经典配置
  8. php判断百度蜘蛛ip,判断百度蜘蛛偷偷进行301转移权重 给新站提权
  9. IT人物——冯诺依曼
  10. 2017年最好用的9个php开发工具推荐(超好用)
  11. Android条形码带数字,android – 使用条形码数字获取名称,价格等产品信息
  12. Matlab中的正态分布概率函数
  13. 【算法图解】第七章:7.5(狄克斯特拉算法优化版)
  14. qtxlsx编译报错_qt5.12搭建qtxlsx库读取excel表格编译错误和解决方法第二讲
  15. pandas输出excel文件添加表头标题,样式装饰器
  16. 记录:手机邮箱格式验证
  17. 如何翻译PPT文档?PPT文档翻译一招搞定
  18. spring相关:spring介绍与两大核心容器
  19. 微信小程序 - 使用 uni-app 开发小程序以及部分功能实现
  20. STATA如何保留和删除变量或者观测值

热门文章

  1. Mathematica 多个积分区间
  2. Thymeleaf总结
  3. SQL Server 数据库之聚合函数
  4. 【信息安全案例】—知识点复习(期末不挂科版)
  5. 《微信小程序-进阶篇》组件封装-Icon组件的实现(一)
  6. TensorFlow Lite 是什么?用 TensorFlow Lite 来转换模型(附代码)
  7. GBase 8a MPP Cluster GDCA 认证培训课前准备
  8. 教你如何分析百度蛛蛛Baiduspider日志
  9. 山特c3ks计算机接口,山特ups电源C3KS参数
  10. html手机页面下拉加载更多,jQuery手机端上拉刷新下拉加载更多页面