STM32F103的USART1接收数据不一致,请香版主和各位兄弟帮忙
我使用英倍特的MCBSTM32开发板,用其USART1进行收发一串数据。
我现在的问题:
串口配置:波特率1200,1个起始位,8位数字,1个EVEN校验,一个停止位
STM32配置:波特率1200,1个起始位,9位数字,1个EVEN校验,一个停止位
串口发送数据:FE 68 33 49 18 00 00 00 68 01 02 43 c7 71 16
MCU接收数据:66 59 b2 38 9a 33 a2 39 8a 38 82 30 82 30 82
串口发送的数据与MCU接收的数据两者不一致!!!
我想知道这是为什么?
PS1:
如果STM32 USART1配置为8位字长,无奇偶校验;
上位机串口软件配置同上:
STM32接收到的数据和串口软件发送数据是相同的,没有变化!
PS2:
我怀疑是不是由于STM32的校验位设置影响了所接收到的数据!STM32在USART1这里是不是有问题!
看了STM3210X的DATASHEET与reference文档。知道校验控制功能如下:发送时生成一个奇偶校验位,接收时进行奇偶校验,按理来说不会有这种问题的!
请各位兄弟帮忙找出问题的关键,在些先谢谢各位的访问与回复!
USART1配置如下:
USART_InitStructure.USART_BaudRate = 1200;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Clock = USART_Clock_Disable;
USART_InitStructure.USART_CPOL = USART_CPOL_Low;
USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
USART1 中断函数如下:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x0FF);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
if( RxCounter == 15 )
{
RxCounter = 0;
TRANS_FLAG = TRUE; //自定义标志位,当为真时,在主函数中会进入串口发送函数
}
}
这个是我原先调试串口发送时的问题:
1、如果将数据位设置为8位,即USART_WordLength_8b,则设置为无校验和偶校验的时候,上位机PC可以正确接收到发送的数据,设置为奇校验的时候则接收到的数据是错误的。
2、将数据位设置为9位,即USART_WordLength_9b,则不论设置为奇校验或是偶校验和无校验,上位机就能正确的接收到发送的数据。
串口接收的部分没有调试。
你可以将上位机的串口发送软件设置为8位数据位、偶校验、一位停止位,然后在单片机上设置为8或9位数据位、偶校验、一位停止位试试,看看哪种情况能接收到正确数据
谢谢二楼的建议。可我现在上位机的串口发送软件已经设置为8位数据位、偶校验、1位停止位。
在STM32F103上因为串口USART1上发送的数据必须是9位数据位、偶校验、1位停止位的配置,
STM32发送数据时的确是对的;STM32也能接收到数据,只是数据不一致,但两者一定有某种关系。
现在我想怎样对USARTx->DR 这个数据进行处理使之转化为正确的数据呢?
一个起始位(0),8位数据,一个偶校验位,一个停止位
这个时候你数据位要配置成9bit的,因为stm32数据长度是包括校验位的
感谢四楼的回复。我现在的首先问题是怎样对接收到的数据进行处理,使之正确!!
你说的我知道。我的USART1配置和你所说的是一样的。如下,不会有错。
USART_InitStructure.USART_BaudRate = 1200;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
接收的时候,stm32会自动处理的,会把奇偶校验位去掉的
我用过,也是接收,没问题
谢谢六楼的两次回复。
按照我上面的配置,接收数据时确实会出现不一致的情况:
用上位机串口程序配置:波特率1200,1个起始位,8位数字,1个EVEN校验,一个停止位
向STM32发送数据:FE 68 33 49 18 00 00 00 68 01 02 43 c7 71 16
STM32F103的配置为:波特率1200,1个起始位,9位数字,1个EVEN校验,一个停止位
在STM32中接收到的数据为:66 59 b2 38 9a 33 a2 39 8a 38 82 30 82 30 82
我承认你做的接收是成功的,但是你保证咱们俩的配置是一模一样的吗?
如果STM32配置为8位字长,接收到的数据是正确的。现在我的问题是9位字长的!
呵呵,你说的有道理。
1200这个速度很慢,我用过最低的也是9600
最好用工具抓一下波形分析一下是发的问题还是收的问题。
九楼,十楼的朋友:
想上传图片,可惜不会传,回复设置中图片显示是无效的。
点“高级回复”,然后选择“添加附件”,把图片文件添加进来,
我就是这样上传图片的,别的方法不会,呵呵
另外,波特率越慢,应该传输数据越可靠吧
我也出现 这个问题 好像波特率低了 就不行了 st的人呢
看了楼主的帖子,有一个问题我要申明一下:
楼主使用的软件库是很老的一个版本,希望楼主更新一下软件库再测试一下。
我用的2.0 也是不行的 我不知道 用哪个版本 会好呢?
ST_ARM 同志:
真的不是固件版本的问题,我已经用了STM32F10x_StdPeriph_Lib_V3.1.2的固件库。
可是问题依旧。唉,继续找解决问题的方案了。
问题解决了。
昨天晚上设置错了,确实是固件库的问题。
谢谢ST_ARM 同志!