STM32 - 解决一次下位机偶校验收包乱码的问题

问题描述

我们有一个带IP的网口转串口的小设备,用在现场,接在路由器上,从网络来和485设备来通讯。
现场有很多485设备,如果是9600/n/8/1, 通讯没问题;如果校验不是无校验,我们做好的应用,就无法和设备通讯。

这设备固件是2017年写的,现在没人维护了。用起来没发现问题。
以前遇到过有校验的情况,当时是联系设备厂商,让他们指导如何将设备通讯参数改为无校验,就能通讯了。

这次在现场的设备是台空调,现场工程师在仪表面板中提供的功能中,并没有发现如何将空调的通讯参数改为无校验的UI界面。正在和厂家联系。

我从研发的角度看,公司有网转串设备的同型号现货,我可以先验证一下,是否真的是网转串设备本身不支持有校验的通讯方式。

我和同事做了测试,他从一台计算机上,从网口向设备的输入端网口发数据,我从设备的485输出端口接一个485转串口,在电脑上等着他发的数据。

当通讯参数为9600/n/8/1时,可以收到他发来的原样数据。
当通讯参数为9600/偶校验/8/1时,我这边的电脑调试助手收到的是乱码,他发来3个16进制字节,我收到4个16进制字节乱码。乱码和原样数据没人任何关系。

尝试解决

既然确定是设备有问题,从svn上迁出这个设备的固件工程看了一下。

我第一感觉是串口初始化参数有问题。

连上仿真器,单步一下,看下在校验方式设置时,是否有区别?
没看出区别。

去网上查STM32接收乱码的问题,网上说到一个上位机(e.g. 串口助手)数据长度为8,下位机(e.g. STM32固件)的数据长度要设为9。说是数据长度是数据位长度 + 停止位的和。

试了一下,将数据位设置位9, 可以通讯了。

去查一下,这个上位机数据长度为8,下位机数据长度必须设置为9,这个说法是从哪来的?没查到。
官方文档没说法。官方F1固件库中串口的例子工程,都是直接给串口通讯参数赋值,并没有根据上位机通讯参数来设置下位机通讯参数的例子。

那我估计,可能是前面的同学,自己试出来的。比如8位不行,又没有其他解决方法,那还有个9位可以用一下,试了一下好使这样子。

我们工程中,通讯参数是通过udp通讯,先设置到设备中,设备重启后,读通讯参数,然后串口初始化。

void STM32_UART1_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);	//UART时钟配置
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate   = setinfo.Device_Baudrate;			//比特率设定
	if(setinfo.USART_WordLength==7)
	{
	     USART_InitStructure.USART_WordLength = USART_WordLength_8b;  	//8数据位长度	
	}
    else if(setinfo.USART_WordLength==8)
	{
	     USART_InitStructure.USART_WordLength = USART_WordLength_9b;  	//9数据位长度
	}

我们实施的同事,以前遇到这种有校验的方式,都是请厂家工程师指导我们改设备通讯参数,甚至跪求厂家工程师帮我们直接刷无校验的实现 😛

其实应用方面的问题,前面的同学大多都解决掉了。做一下实验,查一下资料,再做一下实验搞定:)

真的很少问题是确实前面的同学从来没解决过,没分享过,非要自己亲自操刀来解决,这种特殊情况很少的。

本课程《华为物联网操作系统LiteOS》是朱老师物联网大讲堂推出的一套物联网理论和实践相结合的视频课程。本课程以渐次递进的方式讲了以下4个主题。主题1:物联网,这是整个课程第1部分。主要讲了物联网的概念、发展历程、物联网的典型案例和应用场景,从技术角度深度阐述了物联网的4层架构、分析了各层次的核心技术和实现原理。本部分的主要目的是让大家对物联网有一定深度和专业性的理解。很多人一直对物联网有兴趣,也找了不少资料看了不少书,但是越看越糊涂,尤其很多物联网专业的大学生,经过几年的大学学习仍然不知道究竟什么是物联网,更不知该如何去学习物联网,本部分就是为解决这个疑问而生。主题2:操作系统,这是整个课程第2部分。主要讲了操作系统的基本原理,操作系统的作用和组成部分,让我们明白裸机开发和基于操作系统的开发有什么差异。这部分是比较偏理论的,是为了解决很多同学对操作系统的认知基础的。很多同学甚至是开发者,尤其是单片机的开发者习惯了裸机开发,直接基于寄存器或者官方库函数(譬如stm32的HAL库、标准库)的开发,心里很疑惑到底什么是操作系统,为什么裸机开发也能做项目还需要操作系统?用不用操作系统的差异在哪里?为什么要去学习操作系统?应该如何学习操作系统?本部分就是为了回答这些问题。主题3:物联网操作系统,这是整个课程的的3部分。物联网操作系统是专为物联网而研发和设计的操作系统,是物联网设备的核心技术。物联网操作系统也是一种操作系统,他具有操作系统的普遍特性(以前前面我们才先学习泛性的普遍的操作系统),但是物联网操作系统有它很多独特的特性,华为的LiteOS就是一款非常典型的优秀的物联网操作系统,除此之外国内还有诸如RT-Thread、AliOSThings等其他优秀物联网操作系统,国外还有Amazon的Freertos等物联网操作系统。那究竟物联网操作系统有什么特别之处?物联网产品如何选择操作系统?如何基于操作系统来开发物联网产品?本部分课程将回答这些问题。主题4:华为物联网操作系统LiteOS,这是整个课程的第4部分。本部分聚焦LiteOS,基于前3部分的铺垫,向大家详细讲解LiteOS的设计思路,专门安排了2大章节来详细分析LiteOS的kernel源码和周边组件源码,还介绍了我们专为学习物联网而设计的NB476开发板,且基于该开发板和LiteOS设计了一个温湿度和断电检测报警器的典型的物联网产品试验,在试验实战中让大家体会基于LiteOS的物联网项目的开发方式。本部分是整个课程中最重头戏的部分,篇幅占据整个课程的一半左右。因此实际上我们整个课程的内容还是比较偏技术性的,可谓低走高开。从基础概念起步,最终带大家能够去做产品。课程特色*完全零基础,降低学习门槛。*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值