OpenEdv-开源电子网

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

关于STM32串口奇偶校验的问题

[复制链接]

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
发表于 2013-3-4 17:10:24 | 显示全部楼层 |阅读模式

以前都没用过奇偶校验,今天用了一下,发现问题了。

 摘自手册中的一段: 

偶校验:校验位使得一帧中的7或8个LSB数据以及校验位中’1’的个数为偶数。 
例如:数据=00110101,有4个’1’,如果选择偶校验(在USART_CR1中的PS=0),校验位将
是’0’。
奇校验:此校验位使得一帧中的7或8个LSB数据以及校验位中’1’的个数为奇数。
例如:数据=00110101,有4个’1’,如果选择奇校验(在USART_CR1中的PS=1),校验位将
是’1’。
传输模式:如果USART_CR1的PCE位被置位,写进数据寄存器的数据的MSB位被校验位替换
后发送出去(如果选择偶校验偶数个’1’,如果选择奇校验奇数个’1’)。如果奇偶校验失败,
USART_SR寄存器中的PE标志被置’1’,并且如果USART_CR1寄存器的PEIE在被预先设置的
话,中断产生。

注意红色部分,虽然括号里的不太明白什么意思,不过按照前面说的,数据的MSB被校验位替换了,那发出去的数据不就错了?

实际用串口助手测试,STM32串口启用奇校验,串口助手也打开奇校验,STM32向串口发送“AT”结果串口助手接收窗口显示“刘”(不包括引号)。不知各位怎么看?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-11-26
在线时间
0 小时
发表于 2014-12-2 10:34:51 | 显示全部楼层
奇偶校验是硬件完成,不用管过程。stm32用校验位时,数据位要选9位,8位会出错。
回复 支持 2 反对 0

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
 楼主| 发表于 2013-3-4 17:23:48 | 显示全部楼层
好吧,看上面的表格我明白了。。。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-12-1
在线时间
12 小时
发表于 2014-12-1 21:58:27 | 显示全部楼层
回复【2楼】xijiele:
---------------------------------
回复【2楼】xijiele:
---------------------------------
怎么回事?我也不太明白这里
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-12-1
在线时间
12 小时
发表于 2014-12-2 20:31:09 | 显示全部楼层
回复【4楼】好人:
---------------------------------
谢谢了,用奇偶校验时,是不是发送数据的时候就不用在编程序去处理奇偶校验这块了?发送八位数据的话,数据位选九位,发送七位数据,数据位要选八位?
回复 支持 反对

使用道具 举报

1

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-11-26
在线时间
0 小时
发表于 2014-12-2 20:47:50 | 显示全部楼层
回复【5楼】乐在其中:
---------------------------------
是的.但我只用过8位的数据.我现在都不知道7位的数据是用在哪里.
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-12-1
在线时间
12 小时
发表于 2014-12-2 21:25:36 | 显示全部楼层
ASCII码是七位的
回复 支持 反对

使用道具 举报

28

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2013-4-14
在线时间
24 小时
发表于 2015-3-2 10:50:33 | 显示全部楼层
我没有在手册里找到奇偶校验的资料,请问你具体是看的什么手册?谢谢
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-6-11
在线时间
3 小时
发表于 2017-6-21 23:54:14 | 显示全部楼层
我有一个问题,STM32F1只有三种校验方式:无校验、奇校验和偶校验,没有常0和常1校验,不知道你们有没有什么解决方法,如果有源码就最好了
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2015-7-3
在线时间
13 小时
发表于 2019-4-3 16:02:19 | 显示全部楼层
好人 发表于 2014-12-2 10:34
奇偶校验是硬件完成,不用管过程。stm32用校验位时,数据位要选9位,8位会出错。

非常有用
回复 支持 反对

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2019-5-29 10:38:32 | 显示全部楼层
本帖最后由 旮旯旭 于 2019-5-29 10:40 编辑
djfkdjf 发表于 2017-6-21 23:54
我有一个问题,STM32F1只有三种校验方式:无校验、奇校验和偶校验,没有常0和常1校验,不知道你们有没有什 ...

带校验位的数据位必须设置9bit,如果是奇偶校验,校验位由硬件完成校验位填充,如果是校验位为0和1校验,那么你的发送缓存必须是16bit的,0就是第9位为0,1就是第9位为1.

[mw_shl_code=applescript,true]for(m=0;m<6;m++)        SlaveUart.txBuf[m]=_hexSend[m]|0x100;
for(m=6;m<10;m++)        SlaveUart.txBuf[m]=_hexSend[m];
SLAVE485ON;
HAL_UART_Transmit(&huart1,(uint8_t *)SlaveUart.txBuf,10,1000);
SLAVE485OFF;
typedef struct
{
        uint16_t txBuf[SLAVE_TX_LEN];
        uint16_t rxBuf[SLAVE_RX_LEN];
        uint16_t rxLen;
        uint16_t txLen;
        volatile uint8_t rxFlag;
        volatile uint8_t dmaTxStatus;
        
}Typedef_SlaveUart;
extern Typedef_SlaveUart SlaveUart;[/mw_shl_code][/mw_shl_code]




回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 17:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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