历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2018年09月01日 | stm32串口发送数据最高位错误问题

发布者:明月昊天 来源: eefocus关键字:stm32  串口  发送数据  最高位 手机看文章 扫描二维码
随时随地手机看文章

        最近,在做基于stm32f401串口的ModBus协议通信,遇到了stm32串口发送数据的问题。花了一整天去查找问题,从ModBus协议格式、调度算法到串口配置,最终终于把问题解决,记录下来。

        问题描述:

        ModBus协议中配置stm32f401串口为奇校验,8位数据位,1位停止位,程序如下:

void uart_init( u32 bound )
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );//使能USART1,GPIOA时钟
    //USART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
    GPIO_Init( GPIOA, &GPIO_InitStructure ); //初始化GPIOA.9
    //USART1_RX  GPIOA.10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init( GPIOA, &GPIO_InitStructure ); //初始化GPIOA.10
    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ; //抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init( &NVIC_InitStructure ); //根据指定的参数初始化VIC寄存器
    //USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;//串口波特率
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
#ifdef EN_FREE_MODBUS //支持ModBus
    USART_InitStructure.USART_Parity = USART_Parity_Even ;//奇校验,与freeModbus中设置一致
#else
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
#endif


     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
    USART_Init( USART1, &USART_InitStructure ); //初始化串口1
    USART_ITConfig( USART1, USART_IT_RXNE, ENABLE ); //开启串口接受中断
    USART_Cmd( USART1, ENABLE );                  //使能串口1
}

      采用串口助手接收Modbus发送来的数据,最高位基本都是出错的,有的本来是1收到的是0,有的本来是0收到的是1,只有极少数数据正确。通过分析Modbus协议,未发现问题;串口助手配置也没有问题。最后在网上查到的解决办法,并仔细阅读了stm32的datasheet,有如下表述:


M位PCE位      USART帧

0    0   | 起始位 | 8位数据|停止位 |

0    1   | 起始位 | 7位数据|奇偶检验位 | 停止位 |

1    0   | 起始位 | 9位数据 | 停止位 |

1    1   | 起始位 | 8位数据 | 奇偶检验位 | 停止位 |

    其中,M位为1代表UART库函数中设置为9位数据,M位为0代表设置为8位数据;PCE位为1代表有奇偶校验,为0代表无校验。可以看出,stm32在设置奇偶校验后将校验位算到了数据位里。因此,在ModBus设置为奇校验后,为了保证数据为8位,需要设置数据位长度为9,即将数据位数设置语句改为下面即可:

      /*STM32中,设置的数据长度包含校验位。
    若设置了奇校验或偶校验,则校验位会占1位。这时要想数据为8位(一般的串口助手直接设置为8位),下面的字长需要设为9位。
    若没有设置奇偶校验,则直接设为8位即可。*/
    if( USART_InitStructure.USART_Parity == USART_Parity_No )
    {
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    }
    else
    {
        USART_InitStructure.USART_WordLength = USART_WordLength_9b;//字长为9位数据格式
    }



关键字:stm32  串口  发送数据  最高位 引用地址:stm32串口发送数据最高位错误问题

上一篇:STM32串口发送数据和接收数据方式总结
下一篇:使用STM32的串口进行大量数据传输

推荐阅读

随着人工智能技术的发展,智能机器人已经进入到生活中的各个方面。并在儿童陪伴、儿童教育方面也开始扮演着重要角色。 8月30日上午,由中国高科技行业门户OFweek维科网和HTC高科会主办,OFweek人工智能网承办的2018中国(上海)国际人工智能展览会开幕式在上海跨国采购会展中心成功举行,一场行业的展示盛宴隆重拉开帷幕。 在这次展览会上,深圳市天博...
工业机器人是在上个世纪40年代诞生出来的,最初的工业机器人是在固定的环境下进行重复作业,后来工业机器人用在了许多的行业,像是汽车、、金属、物流、医药、甚至是航空航天等等。随着科技的发展,人们需要的不是传统的不会变化的机器人,而是可以应用到更多场景的智能化的工业机器人,在功能上可以兼顾传感和智能化进行决策和判断,达到发掘工业数据的...
是德科技公司(NYSE:KEYS)日前宣布,中国第一汽车集团有限公司(FAW)选用该公司的互联汽车测试解决方案,推进车内外通信技术的性能和可靠性,包括以太网、紧急呼救、蜂窝车联网,以及即将升级为5G的4G通信技术。是德科技是一家领先的技术公司,致力于帮助企业、服务提供商和政府客户加速创新,创造一个安全互联的世界。中国一汽主要面向中国市场设计、...
上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO、外部中断、定时器、串口等,本节先给大家介绍一下STM8单片机的GPIO口。我们先不介绍STM8单片机GPIO口的内部资源,我们先从程序代码着手,再根据代码进一步分析GPIO对应的寄存器,这样才能更容易去理解GPIO的驱动原理。这篇内容是无际单片机编程...

史海拾趣

问答坊 | AI 解惑

三极管手册上“ β ”值的范围是什么意思

各位好! 有问题想请教一下,三极管手册上的 “ β ”的范围是什么意思? 比如 C9013的数据手册上 写着C9013H的 “ H ” 是指“ β ”的范围是 144-202 不知道这是什么意思,是指: 1.一个三极管,由于在不同的极间电压,输出特性曲线不是完全 ...…

查看全部问答∨

什么是欠阻尼振荡和过阻尼振荡?

本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 阻尼振荡的两种。 直观地看波形,只有欠阻尼有振荡,其幅度逐渐减小。过阻尼看波形根本没有振荡,在冲击函数(狄拉克函数)作用下,波形先上升后下降到零,没有反复,但也叫振荡。 此二者之间,恰好 ...…

查看全部问答∨

告诉你办公室的"玩笑艺术

不要开上司的玩笑   你一定要记住这句话:上司永远是上司,不要期望在工作岗位上能和他成为朋友。即便你们以前是同学或是好朋友,也不要自恃过去的交情与上司开玩笑,特别是在有别人在场的情况下,更应格外注意。   不要以同事的缺点或不足 ...…

查看全部问答∨

谁申请过免费样片?

我在自学51单片机,听说可以去公司申请样片?能不能申请到学习用的那种?…

查看全部问答∨

计算机是如何识别usb设备的?

我想识别的是个usb加密锁 if (dbhdr && dbhdr->dbcd_devicetype == DBT_DEVTYP_VOLUME) 这个是用来识别usb硬盘的 设备类型有以下五类: DBT_DEVTYP_DEVICEINTERFACE DBT_DEVTYP_HANDLE DBT_DEVTYP_OEM DBT_DEVTYP_PORT DBT_DEVT ...…

查看全部问答∨

s3c2440的BIOS模式(从nor启动)

本人刚买了个友善之臂的mini2440开发板。按他们的用户说明中,建立好“超级终端”后,打开电源,从NOR FLASH启动。在超级终端中输入每一个命令,都是“Could not found \'*\' command”的错误提示。到底什么原因,莫非Supervivi没有烧写吗?希望知 ...…

查看全部问答∨

str731的串口可以和stm32串口直连吗?

一个电平5v,一个电平3.3  可以吗  还有串口之间不用再加232转换芯片也可以通信吗?…

查看全部问答∨

51串口通信

  各位大侠们!          1. 串口通信TI=1时,还可以继续进行串口通信发送功能吗?          2. 认为1不能发送,假设开始ES=0,它还会进入中断服务程序吗? ...…

查看全部问答∨

AD的默认状态采样通道电压固定吗

首先感谢你浏览,我想问下,AD芯片在默认状态下采样通道的电压是固定有一个值得吗。所有通道都是悬空的。谢谢。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved