OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10108|回复: 12

[开发板通用] 485使用奇偶校验通信(即串口奇偶校验通信)

[复制链接]

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14287
金钱
14287
注册时间
2018-8-3
在线时间
1147 小时
发表于 2019-6-21 19:58:31 | 显示全部楼层 |阅读模式
本帖最后由 翼行园子 于 2019-6-21 19:58 编辑

本帖主要是针对奇偶校验通信,由于很多人习惯用无校验位,当使用奇偶校验位时数据收发出现问题 无从解决 其实只要你理解了奇偶校验位,就会觉得很简单,首先先看这个图:
86a55ce33c372ab8ad0f2205b55511d.png
偶校验:对奇偶校验位进行计算,使帧和奇偶校验位中“1”的数量为偶数  

奇校验:对奇偶校验位进行计算,使帧和奇偶校验位中“1”的数量为奇数


所谓的奇偶校验就是在你的数据位的最后一位变成了奇偶校验位
例如:在串口初始化代码里将这两个成员设置成:
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度 用偶校验位时 上位机需设置7位
USART_InitStructure.USART_Parity = USART_Parity_Even;///偶校验位

这里可以看设置的8位字长,偶校验;
比如我这时候发01(二进制:0000 0001),看上图是低位在前即:1000 0000 这里共8位 但是数据位就7位 最后一位是偶校验位 这时候因为我们是偶校验,所以要最后一位需要补1,即变成了1000 0001这时候在串口调试助手上需要设置成7位数据位 这时候读出来的即:01,若你串口调试助手设置成8位这时候读出来则是:81
比如我在发个02(二进制:0000 0010),低位在前:0100 0000 这里共8位,但是数据位就7位最后一位是偶校验位,因为我们是偶校验,需要补1,变成:0100 0001,这时候在串口调试助手上需要设置成7位数据位 这时候读出来的即:02,若你串口调试助手设置成8位这时候读出来则是:82;
其他自己以此类推,9位字长也是一样的算法的,上位机设置成8位即可;
实验的硬件:一个战舰开发板的485模块,一个485转USB模块,(A-A,B-B)

这个实验(代码在下面压缩包)发的数据是:00 01 02 03 04  在串口调试助手显示如图:
设置7位数据位时:
958fbee0a52874eba675ee8c252efba.png
设置8位数据位时:
0938f64c05df5ab9752890a23bffd66.png

总结就是:当你开启奇偶校验位时,初始化时设置的数据位长,其中有一个是奇偶校验位,所以在上位机设置的需要减少一个位 即可正常收发正确的数据。

战舰 485偶校验位通信.rar

2.54 MB, 下载次数: 255

售价: 1 金钱  [记录]

啊哈~加油!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-3 11:35:46 | 显示全部楼层
我在调试得时候确保数据位是对应的,只单纯修改校验方式,收到得数据都是正确得。这是什么原理?
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14287
金钱
14287
注册时间
2018-8-3
在线时间
1147 小时
 楼主| 发表于 2019-7-3 11:42:06 | 显示全部楼层
千湖 发表于 2019-7-3 11:35
我在调试得时候确保数据位是对应的,只单纯修改校验方式,收到得数据都是正确得。这是什么原理?

代码怎么设置  上位机怎么设置的截图看看
啊哈~加油!!
回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-3 13:49:30 | 显示全部楼层
  1. //初始化IO 串口1
  2. //pclk2:PCLK2时钟频率(Mhz)
  3. //bound:波特率
  4. void uart_init(u32 pclk2,u32 bound)
  5. {      
  6.     float temp;
  7.     u16 mantissa;
  8.     u16 fraction;      
  9.     temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
  10.     mantissa=temp;                 //得到整数部分
  11.     fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
  12.     mantissa<<=4;
  13.     mantissa+=fraction;
  14.     RCC->AHB1ENR|=1<<0;       //使能PORTA口时钟  
  15.     RCC->APB2ENR|=1<<4;      //使能串口1时钟
  16.     GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
  17.     GPIO_AF_Set(GPIOA,9,7);    //PA9,AF7
  18.     GPIO_AF_Set(GPIOA,10,7);//PA10,AF7         
  19.     //波特率设置
  20.     USART1->BRR=mantissa;     //波特率设置     
  21.     USART1->CR1&=~(1<<15);     //设置OVER8=0
  22.     USART1->CR1|=1<<3;      //串口发送使能

  23.    
  24. #if EN_PARITY_ODD_EVEN      //使能奇偶校验
  25.    
  26.     USART1->CR1 |=1<<12;    //1SB,1STB
  27.     USART1->CR1 |=1<<10;    //是能奇偶校验
  28.     USART1->CR1 |=1<<9;     //奇校验
  29.    
  30. #endif


  31. #if EN_USART1_RX              //如果使能了接收
  32.     //使能接收中断
  33.     USART1->CR1|=1<<2;      //串口接收使能
  34.     USART1->CR1|=1<<5;        //接收缓冲区非空中断使能            
  35.     MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
  36. #endif
  37.     USART1->CR1|=1<<13;      //串口使能
  38. }
复制代码



回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-3 13:51:08 | 显示全部楼层
本帖最后由 千湖 于 2019-7-3 13:54 编辑



&#8234;
2019-07-03_134733.png
2019-07-03_134711.png
2019-07-03_134629.png
回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-3 13:55:00 | 显示全部楼层
改变数据位数据会发生改变,改变校验方式不会改变,所以就请教一下
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14287
金钱
14287
注册时间
2018-8-3
在线时间
1147 小时
 楼主| 发表于 2019-7-3 18:05:13 | 显示全部楼层
千湖 发表于 2019-7-3 13:55
改变数据位数据会发生改变,改变校验方式不会改变,所以就请教一下

因为校验位补的是他的奇偶校验位 并不是补的数据位 所以只要你的数据位选择是对的 就不会影响他的数据改变
啊哈~加油!!
回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-4 09:03:46 | 显示全部楼层
我的理解是这样,我的MCU设置:1位起始位,1位停止位,9位数据位,奇校验,

串口助手设置:1位起始位,1位停止位,8位数据位,偶校验(或者无校验)

若校验方式不同,校验位数据肯定是不同的,这样应该认为收到数据错误才对啊!
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14287
金钱
14287
注册时间
2018-8-3
在线时间
1147 小时
 楼主| 发表于 2019-7-4 15:15:43 | 显示全部楼层
千湖 发表于 2019-7-4 09:03
我的理解是这样,我的MCU设置:1位起始位,1位停止位,9位数据位,奇校验,

串口助手设置:1位起始位,1 ...

这个是上位机接收方的处理方式的  他如果有比对奇偶校验位 才会报错 完全取决于接收方是怎么写的这方面的协议的
啊哈~加油!!
回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1445
注册时间
2017-10-9
在线时间
122 小时
发表于 2019-7-4 19:28:22 | 显示全部楼层
好的,非常感谢,我用逻辑分析试试
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2020-8-22
在线时间
0 小时
发表于 2020-8-22 20:08:05 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-6-12
在线时间
17 小时
发表于 2023-1-4 14:11:23 | 显示全部楼层
让我下来看一下
回复 支持 反对

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
发表于 2023-12-19 18:01:34 | 显示全部楼层
感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表