历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-09-01 来源:eefocus

        最近,在做基于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位数据格式
    }



推荐阅读

史海拾趣

ALCOA公司的发展小趣事

在20世纪的后半叶,ALCOA继续在技术上取得重大突破。例如,在40年代,公司采用N-40(Niagara)50kA中心下料预焙阳极电解槽技术为政府建造了铝冶炼厂。此外,公司还不断扩大海外业务,建立了全球性的生产和销售网络。这种全球布局使得ALCOA能够更好地满足不同地区的市场需求,也增强了公司的竞争力。

CQR SECURITY公司的发展小趣事

CQR SECURITY公司在追求商业成功的同时,也积极履行社会责任。公司定期举办网络安全宣传活动,提高公众的网络安全意识。同时,CQR还积极参与社会公益事业,为弱势群体提供网络安全支持和帮助。这种积极履行社会责任的举措不仅提升了CQR的品牌形象,还为公司赢得了社会的广泛赞誉。

这些故事虽然虚构,但反映了电子安全公司可能经历的一些普遍发展路径和挑战。希望这些故事能够为您提供一些启发和参考。如果需要更多关于特定公司的信息,建议您查阅相关新闻报道、行业分析报告或公司官网等渠道。

Genesys Logic公司的发展小趣事

进入80年代,随着半导体市场的竞争加剧,“General Microcircuits”意识到仅凭自身力量难以迅速扩大市场份额。于是,公司采取了一系列并购策略,先后收购了多家在模拟电路、数字信号处理等领域具有技术优势的小型公司。这些并购不仅为“General Microcircuits”带来了丰富的产品线和技术积累,还显著增强了其研发能力和生产能力,使其在全球半导体市场的地位稳步提升。

申风(everanalog)公司的发展小趣事

申风(everanalog)公司于2013年在上海成立,由一群充满激情和梦想的电子工程师组成。创始人施嘉铭凭借其深厚的行业经验和前瞻性的视野,带领团队开始了集成电路设计的探索之旅。在初创阶段,公司面临着资金紧张、人才短缺等挑战,但团队凭借着坚定的信念和不懈的努力,逐渐在市场上站稳了脚跟。

Aimtec公司的发展小趣事

Aimtec公司自成立以来,一直致力于电子转换技术的研发与创新。在某个关键时期,公司研发团队成功开发出一种新型的DC-DC转换器,其转换效率较市场同类产品提高了近20%。这一技术突破迅速得到了业界的关注,不仅帮助Aimtec在市场上取得了竞争优势,也为客户的产品带来了更高的性能。随着该技术的普及应用,Aimtec的品牌知名度逐渐提升,公司在电子行业中崭露头角。

Esico-Triton公司的发展小趣事

随着科技的不断进步,电子行业也在快速变革。为了应对这一挑战,Esico-Triton不断加强研发投入,特别是在人工智能和物联网领域。公司推出了一系列智能家居和工业自动化产品,以适应市场的需求。同时,Esico-Triton还与多所知名大学和研究机构合作,共同研发新技术,确保公司在行业中的领先地位。

问答坊 | AI 解惑

用LM35和ICL7107设计一个数字温度计

         谁能帮我用LM35和ICL7107设计一个数字温度计??????…

查看全部问答>

示波器的原理与使用方法

示波器的原理与使用方法…

查看全部问答>

传感器和变送器的区别

传感器和变送器的区别 传感器是能够受规定的被测量并按照一定的规律转换成可用输出信号的器件或装置的总称,通常由敏感元件和转换元件组成。当传感器的输出为规定的标准信号时,则称为传感器。 变送器的概念是将非标准电信号转换为标准电信号 ...…

查看全部问答>

哪位大侠有protues 包含dac0832,adc0804等单片机专用元件库

各位大侠:     小弟,想在protues中模拟仿真单片机实验,无奈找不到相关的器件,如adc0804,dac0832等有关器件,敢问那位大侠有单片机仿真的专用元件库,小弟期待中!!…

查看全部问答>

嵌入式开发难吗?

请问对一个熟悉c/c++的女生来说,做嵌入式是不是有点困难,或者说有点不适合呢?做嵌入式开发中有女生吗?…

查看全部问答>

关于2440lcd 24bpp显示问题

我在移置2440的Bootload中的lcd驱动时候,设置24bpp Mode显示,现在屏幕上显示的内容为屏幕的上半边水平依次显示了两个一摸一样的我欲显示的开机画面,下半部分无任何显示,请问应该调节那几个参数啊。 我显示16bpp mode时候可以正常显示并调试通 ...…

查看全部问答>

2011器件清单

20MHz普通示波器(双通道,外触发输入,有X轴输入) 60MHz双通道数字示波器 低频信号发生器(1Hz~1MHz) 标准高频信号发生器(1MHz~30MHz,可输出1mV小信号) 函数发生器(10 MHz,DDS) 低频毫伏表 高频毫伏表 100 MHz频率计 失真度测试 ...…

查看全部问答>

TDK注册活动,赶紧参加了

哈哈,刚刚参加了注册!一不小心,中了U盘!活动链接:https://www.eeworld.com.cn/huodong/TDK201203/…

查看全部问答>

ara-tracer ii仿真不了。

我用EasyJTAG-H仿真程序没有问题,现在我想用ARM-tracer ii仿真就不行,程序是MagicARM2410光盘中复制出来的,在AXD中也增加了multi-ice,并且也找到cpu,点击DEBUG后,进入AXD不会自动加载,AXD左下方有此显示:RDI Warning 00166: <tag \"RDIEr ...…

查看全部问答>

双核工控机

ITX主板(17CMX17CM)、CPU双核1.6、DDR800 2G、ST500G 7200PRM、双千兆网卡、4USB2.0、5COM、15“三星液晶+15”触摸屏。    …

查看全部问答>