你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103单片机串口通信带奇偶校验位

[复制链接]
STMCU小助手 发布时间:2022-3-21 13:07
     在调试Modubus协议时需要用到串口的奇偶校验位,但是平时用串口时很少用到奇偶校验位,网上搜相关的历程也很少,将自己写的串口奇偶校验代码分享上来方便以后查阅。

       如果用库函数的话,添加奇偶检验位就很简单,在初始化串口的时候,将默认的无校验位修改为奇校验或者偶校验,同时将数据位设置为9位。

      串口初始化代码如下:

  1. #include "uart2.h"

  2. #define  CHECK_NONE_ONE_STOP    0 //无校验位  1个停止位  1有效  0 无效
  3. #define  CHECK_NONE_TWO_STOP    1 //无校验位  2个停止位  1有效  0 无效
  4. #define  CHECK_EVEN    1          //偶数校验   1有效  0 无效
  5. #define  CHECK_ODD     0          //奇数校验   1有效  0 无效

  6. void  uart2_init( u32 baud )
  7. {
  8.     GPIO_InitTypeDef GPIO_InitStructure;
  9.     USART_InitTypeDef USART_InitStructure;
  10.     NVIC_InitTypeDef  NVIC_InitStructure;

  11.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
  12.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );

  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.     GPIO_Init( GPIOA, &GPIO_InitStructure );

  17.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  18.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  19.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.     GPIO_Init( GPIOA, &GPIO_InitStructure );

  21.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  25.     NVIC_Init( &NVIC_InitStructure );

  26.     USART_InitStructure.USART_BaudRate = baud;
  27.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
  28.     USART_InitStructure.USART_Parity = USART_Parity_No;                                                //无奇偶校验位
  29.     USART_InitStructure.USART_StopBits = USART_StopBits_1;                                //1位停止位

  30. #if(CHECK_EVEN == 1)                                                                                                                                                                                         //如果定义了偶校验  数据位长度要改为9位
  31.     USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  32.     USART_InitStructure.USART_Parity = USART_Parity_Even;
  33. #endif

  34. #if(CHECK_ODD == 1)                                                                                                                                                                                         //如果定义了偶校验  数据位长度要改为9位
  35.     USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  36.     USART_InitStructure.USART_Parity = USART_Parity_Odd;
  37. #endif

  38. #if(CHECK_NONE_ONE_STOP==1)                                                                                                                                                                //停止位为 一位
  39.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  40. #endif

  41. #if(CHECK_NONE_TWO_STOP==1)                                                                                                                                                                //停止位为 两位                                                                                                                                       
  42.     USART_InitStructure.USART_StopBits = USART_StopBits_2;
  43. #endif

  44.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  45.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  46.     USART_Init( USART2, &USART_InitStructure );

  47.     USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );
  48.     USART_Cmd( USART2, ENABLE );

  49. }

  50. void USART2_IRQHandler( void )
  51. {
  52.     u16 tem = 0;
  53.     if( USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET )
  54.     {
  55.         tem = USART_ReceiveData( USART2 );
  56.         USART_SendData( USART2, tem );
  57.     }

  58. }
复制代码

通过宏定义来设置是否使用奇偶校验位,停止位为1位还是2位。如果使用了奇偶校验时,要将数据位设置为9位。设置好之后就不用管了,具体校验工作由硬件来完成。

在串口中断函数中实现的功能是,将串口2接收到的数据通过串口2发送出去。

在宏定义中设置为2个停止位,偶校验。

MP9O(P}C2QJ0@KQN(D]50FF.png

串口测试效果如下:

NBD~AV2W5MHGH7]5$RUQA)4.png

如果串口助手设置和单片机发送不一致时,接收到的数据就为乱码。

_91G6JWSIMDTH[~K2{ASC8E.png


收藏 1 评论0 发布时间:2022-3-21 13:07

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版