STM32F103的USART1接收数据不一致,请香版主和各位兄弟帮忙

nanjingzhangjun   2009-12-1 07:41 楼主


我使用英倍特的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; //自定义标志位,当为真时,在主函数中会进入串口发送函数
    }

}

回复评论 (21)

这个是我原先调试串口发送时的问题:
1、如果将数据位设置为8位,即USART_WordLength_8b,则设置为无校验和偶校验的时候,上位机PC可以正确接收到发送的数据,设置为奇校验的时候则接收到的数据是错误的。
2、将数据位设置为9位,即USART_WordLength_9b,则不论设置为奇校验或是偶校验和无校验,上位机就能正确的接收到发送的数据。

串口接收的部分没有调试。
你可以将上位机的串口发送软件设置为8位数据位、偶校验、一位停止位,然后在单片机上设置为8或9位数据位、偶校验、一位停止位试试,看看哪种情况能接收到正确数据
点赞  2009-12-1 08:15
谢谢二楼的建议。可我现在上位机的串口发送软件已经设置为8位数据位、偶校验、1位停止位。
在STM32F103上因为串口USART1上发送的数据必须是9位数据位、偶校验、1位停止位的配置,
STM32发送数据时的确是对的;STM32也能接收到数据,只是数据不一致,但两者一定有某种关系。

现在我想怎样对USARTx->DR 这个数据进行处理使之转化为正确的数据呢?
点赞  2009-12-1 08:32
一个起始位(0),8位数据,一个偶校验位,一个停止位
这个时候你数据位要配置成9bit的,因为stm32数据长度是包括校验位的
点赞  2009-12-1 09:15
感谢四楼的回复。我现在的首先问题是怎样对接收到的数据进行处理,使之正确!!
你说的我知道。我的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;
点赞  2009-12-1 09:27
接收的时候,stm32会自动处理的,会把奇偶校验位去掉的
我用过,也是接收,没问题
点赞  2009-12-1 10:06
谢谢六楼的两次回复。
按照我上面的配置,接收数据时确实会出现不一致的情况:
用上位机串口程序配置:波特率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位字长的!
点赞  2009-12-1 10:28
难道是STM32的一个bug?
不可能吧
点赞  2009-12-1 13:18
呵呵,你说的有道理。
1200这个速度很慢,我用过最低的也是9600
最好用工具抓一下波形分析一下是发的问题还是收的问题。
点赞  2009-12-1 13:29
同意楼上的

看配置应该是没有错的,无图无真相
点赞  2009-12-1 14:06
九楼,十楼的朋友:
   想上传图片,可惜不会传,回复设置中图片显示是无效的。
点赞  2009-12-1 14:52
点“高级回复”,然后选择“添加附件”,把图片文件添加进来,
我就是这样上传图片的,别的方法不会,呵呵
另外,波特率越慢,应该传输数据越可靠吧
点赞  2009-12-1 16:09
                                 我也出现 这个问题  好像波特率低了 就不行了  st的人呢
点赞  2009-12-1 23:59
                                 不一致,可能就是你的波特率设置不对
点赞  2009-12-2 10:00
看了楼主的帖子,有一个问题我要申明一下:
   楼主使用的软件库是很老的一个版本,希望楼主更新一下软件库再测试一下。
点赞  2009-12-2 10:20
                                 我用的2.0  也是不行的  我不知道 用哪个版本 会好呢?
点赞  2009-12-2 10:38
                                 请升级到至少2.0.3版本以上。
点赞  2009-12-2 10:51
                                 不是这个问题
点赞  2009-12-2 13:39
ST_ARM 同志:
        真的不是固件版本的问题,我已经用了STM32F10x_StdPeriph_Lib_V3.1.2的固件库。
可是问题依旧。唉,继续找解决问题的方案了。
点赞  2009-12-2 22:53
问题解决了。
昨天晚上设置错了,确实是固件库的问题。
谢谢ST_ARM 同志!
点赞  2009-12-3 09:11
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复