OpenEdv-开源电子网

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

stm32f0 串口通讯,数据长度设置为USART_WordLength_9b ,无论奇偶校验都能收到数据

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-12-12
在线时间
19 小时
发表于 2021-7-3 14:41:24 | 显示全部楼层 |阅读模式
1金钱
初始化代码如下,和上位机波特率一样,无论修改通讯设备还是上位机的配置成“奇校验”还是“偶校验”还是“无校验”都能正常收发数据,从配置上看也没用问题,不知道有没有人遇到过这种问题?
void max_485_init(void)
{
        uint32_t baud_set,parity_set,WordLength,stopBit_set;
       
        WordLength = USART_WordLength_8b;//--酒店款
        //--------波特率-设置------------//
        if(sys_para.cfg.baud == 1)
                baud_set = 4800;
        if(sys_para.cfg.baud == 2)
                baud_set = 9600;
        if(sys_para.cfg.baud == 3){
                baud_set = 19200;
               
        }
        if(sys_para.cfg.baud == 4)
                baud_set = 38400;
//        if(sys_para.cfg.baud == 5)
//                baud_set = 57600;

        //--------校验位-设置------------//
        if(sys_para.cfg.parity == 0)
                parity_set = USART_Parity_No;
        else{
                if(sys_para.cfg.parity == 1)
                        parity_set = USART_Parity_Odd;
                if(sys_para.cfg.parity == 2)
                        parity_set = USART_Parity_Even;//--偶校验
                       
                WordLength = USART_WordLength_9b;
        }

        //--------停止位-设置------------//
        if(sys_para.cfg.stopBit == 1)
                stopBit_set = USART_StopBits_1;
        if(sys_para.cfg.stopBit == 2)
                stopBit_set = USART_StopBits_2;

        uart3_485_config(baud_set,parity_set,WordLength,stopBit_set);
}
//---------------------------max485串口配置----------------------//
void uart3_485_config(uint32_t BaudRate,uint32_t Parity,uint32_t WordLength,uint32_t Stopbit)
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;

        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );                                               
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_4);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_4);                                                                                              

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;                 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);   

        USART_InitStructure.USART_BaudRate = BaudRate;
        USART_InitStructure.USART_WordLength = USART_WordLength_9b;//USART_WordLength_8b;//USART_WordLength_9b;//WordLength;//USART_WordLength_8b;
        USART_InitStructure.USART_Parity = USART_Parity_Even;//Parity;//USART_Parity_Even;//USART_Parity_No;
        USART_InitStructure.USART_StopBits = Stopbit;//USART_StopBits_1;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode =USART_Mode_Tx | USART_Mode_Rx;//USART_InitStructure.USART_Mode =USART_Mode_Tx;//
        USART_Init(USART3, &USART_InitStructure);

        USART_Cmd(USART3, ENABLE);
//        USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);

        NVIC_InitStructure.NVIC_IRQChannel = USART3_6_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 3;//2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
}


最佳答案

查看完整内容[请看2#楼]

当然可以正常收发数据。如果你设置了校验,要自己在串口的中断程序里处理校验错误。 如果错误了,是通知对方重新发送这个字节还是这一帧还是直接忽略不处理,直到收到正确数据再响应
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-7-3 14:41:25 | 显示全部楼层
当然可以正常收发数据。如果你设置了校验,要自己在串口的中断程序里处理校验错误。
如果错误了,是通知对方重新发送这个字节还是这一帧还是直接忽略不处理,直到收到正确数据再响应
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-12-12
在线时间
19 小时
 楼主| 发表于 2021-7-3 16:38:10 | 显示全部楼层
本帖最后由 readlove1 于 2021-7-3 16:42 编辑
c2007s 发表于 2021-7-3 16:30
当然可以正常收发数据。如果你设置了校验,要自己在串口的中断程序里处理校验错误。
如果错误了,是通知对 ...

您好!是判断是否有奇/偶错误吗?这个是MCU配置的,奇偶校验是硬件完成,不用管过程。我用的其它单片机也只是配置一下奇还是偶校验,没有做其它处理,上位机如果设置的和通讯设备不一样,就通讯失败。能否提供一个例子,参考一下,谢谢!
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-7-3 16:46:47 | 显示全部楼层
是的,自己程序里需要做处理。如果不处理那就可以收到数据。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-12-12
在线时间
19 小时
 楼主| 发表于 2021-7-3 16:51:12 | 显示全部楼层
c2007s 发表于 2021-7-3 16:46
是的,自己程序里需要做处理。如果不处理那就可以收到数据。

好的,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 10:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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