打印

STM32F103串口接收数据的问题

[复制链接]
6072|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
code|  楼主 | 2013-9-30 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口接收数据的问题
我现在使用STM32F103万利199元的那里开发板
我的串口设置如下
我使用电脑给开发板发送两个字节
1 . 如果两个字节发送的时间间隔太小,那么第1个字节是正确的 第2个字节就乱码
2 . 如果两个字节发送的时间间隔拉大,那么两个字节都正确
请问是什么问题!!! 谢谢 !!!!!!!!!!
在写程序的时候,我在想会不会第1个字节的数据影响到第2个字节的数据??
因此我就注意到尽量缩短中断响应时间
我的芯片现在只是接收和发送数据,其他的事情都不干.但是依然会出现这个问题
接收到数据之后
我也有清除标志位USART_ClearFlag(USART1,USART_FLAG_RXNE);


串口设置
void uart_initial(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
                           
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   USART_ITConfig(USART1, USART_IT_TXE , DISABLE);        //关闭串口中断        
   USART_ITConfig(USART1, USART_IT_RXNE , ENABLE);  

}

串口中断服务函数
void USART1_IRQHandler(void)
{
RX_cache[RX_cache_pointer] = USART_ReceiveData(USART1);
USART_ClearFlag(USART1,USART_FLAG_RXNE);
RX_cache_status[RX_cache_pointer]=1;  
RX_cache_pointer++;
if(RX_cache_pointer>0x1)   // 接收到2个字节才回传
{
   COM_rx_status=1;
   RX_cache_pointer=0;
}
}

main()
{

  if( COM_rx_status==1 )  // 接收到2个字节才回传
  {
         COM_rx_status=0;
         USART_SendData(USART1,RX_cache[0]);
   
         while (!(USART1->SR & USART_FLAG_TXE));  //等待发送完成
         USART_SendData(USART1,RX_cache[1]);
   
         while (!(USART1->SR & USART_FLAG_TXE));  //等待发送完成
       }
}

沙发
elecintop| | 2013-9-30 11:51 | 只看该作者
半个新手  高手来分析解答  帮忙顶

使用特权

评论回复
板凳
zhangmangui| | 2013-9-30 12:18 | 只看该作者
我也刚准备学习啦  不懂  帮忙顶

使用特权

评论回复
地板
3htech| | 2013-9-30 13:57 | 只看该作者
如果有示波器,让开发板发送AA,或者是55,看一下位宽是否和你设定的波特率一致。

第二,如果位宽一至,请检查一下停止位的个数。

使用特权

评论回复
5
kekeke| | 2013-9-30 14:22 | 只看该作者
3htech 发表于 2013-9-30 13:57
如果有示波器,让开发板发送AA,或者是55,看一下位宽是否和你设定的波特率一致。

第二,如果位宽一至,请 ...

我觉得应该是波特率问题

使用特权

评论回复
6
kekeke| | 2013-9-30 14:34 | 只看该作者
楼主在仔细查查代码

使用特权

评论回复
7
acgean| | 2013-10-1 08:42 | 只看该作者
1 . 如果两个字节发送的时间间隔太小,那么第1个字节是正确的 第2个字节就乱码
2 . 如果两个字节发送的时间间隔拉大,那么两个字节都正确

说明波特率没有问题.

USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;

这样的设置有问题. 设置 9 位数据, 那你就使能校验位吧.
总之, 问题是发送和接收端的设置不同引起的.

使用特权

评论回复
8
huzi2099| | 2013-10-1 11:39 | 只看该作者
双工串口的收发使用的是同一个移位器,
你的数据发送的过程并没有检测串口是否正在接收的状态,所以发送的数据覆盖了正在接收的数据,又或者你的数据还没有发送完要接收的第一个数据又来了,所以...
你的波特率比较低使得发送的时间比较长,采用比较高的波特率会有改善,但是最好有一套互斥的收发应答机制.

使用特权

评论回复
9
金融小数| | 2013-10-1 12:26 | 只看该作者
楼主的中断里面的代码中的STM32运行频率是多少?
两个字节发送的时间间隔多少时,出现错误?

有一点可以肯定,你的问题不是STM32的USART1外设引起的,也不是上面huzi2099说的:“双工串口的收发使用的是同一个移位器”导致的,因为USART是同步的,可以同时接收和发送数据。

使用特权

评论回复
10
playeboy| | 2015-12-18 23:06 | 只看该作者
USART_InitStructure.USART_Parity = USART_Parity_No是无校验吧,应该不附加校验位吧,USART_InitStructure.USART_WordLength = USART_WordLength_9b;这条对吗?不是USART_WordLength_8b吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:"></a><img src="http://uc2.21ic.com/avatar.php?uid=319240&size=middle"></img><a href="

40

主题

150

帖子

1

粉丝