打印

求助:STM32F103串口1全双工通信乱码问题

[复制链接]
5714|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ifreecoding|  楼主 | 2012-9-1 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用串口1收发数据,采用中断方式收发数据,RX和TX串行工作时没有问题,也就是说接收后处理,处理后再发送,采用这样的流程数据都可正常收发
但我发现在发数据的同时又收到数据了,那么从串口TX发出来的数据就出错了,在发的同时将这些数据保存到内存中,从内存中看却又是正确的
我怀疑全双工收发时串口出问题了,不知道哪位遇到过这种事情没有,是不是可以解决,
测试代码如下,串口1采用中断方式一直向外发送数据,串口1接收中断如果接收到数据,从串口中读取后就扔掉。
这段程序上电后STM32就向计算机不停的向外发送AA,都是正常的,但一旦计算机向STM32发送大量数据,计算机接收到的就全是乱码了。
求解!!
int main(void)
{
   USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable USART1 Clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);

    /* 配置UART1管脚 */
    /* Configure USART1 Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART1 Tx as alternate function push-pull */
    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);

    /* 配置UART1的配置 */
    /* USARTy and USARTz configured as follow:
        - BaudRate = 9600 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Receive and transmit enabled
        - Hardware flow control disabled (RTS and CTS signals)
    */
    USART_StructInit(&USART_InitStructure);

    /* Configure USART1 */
    USART_Init(USART1, &USART_InitStructure);

    /* 配置UART1的中断 */
    /* Configure the NVIC Preemption Priority Bits */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* Enable USARTy Receive interrupts */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    /* Enable the USART1 */
    USART_Cmd(USART1, ENABLE);

    while(1);
}

/* 中断服务程序 */
void USART1_IRQHandler(void)
{
    unsigned int s;
    unsigned char temp;

    s = USART1->SR;

    /* 接收中断 */
    if(0x20 == (0x20 & s))
    {
          temp = USART_ReceiveData(USART1);
    }

    /* 发送中断 */
    if(0x80 == (0x80 & s))
    {
          USART_SendData(USART1, 0xAA);;
    }
}
沙发
yuanrenz| | 2012-9-1 11:03 | 只看该作者
过来学些的,谢谢楼主

使用特权

评论回复
板凳
ifreecoding|  楼主 | 2012-9-1 14:37 | 只看该作者
好像不是开发板的问题,好像是计算机串口的问题,把起始位、数据位还有停止位搞乱了,等弄个示波器来看看就知道了

使用特权

评论回复
地板
didida201210| | 2013-3-13 16:46 | 只看该作者
楼主问题最后解决了吗?我也遇到同样的问题,监视发送缓冲区是正常的,但是串口监视的数据不对

使用特权

评论回复
5
ifreecoding|  楼主 | 2013-6-25 13:17 | 只看该作者
didida201210 发表于 2013-3-13 16:46
楼主问题最后解决了吗?我也遇到同样的问题,监视发送缓冲区是正常的,但是串口监视的数据不对 ...

问题应该是解决了,但时间太长了,我忘了是如何解决的

使用特权

评论回复
6
zhxxi| | 2013-6-25 16:18 | 只看该作者
好像没清中断标志吧

使用特权

评论回复
7
trumpxp| | 2013-6-25 19:37 | 只看该作者
中断应该需要清除

使用特权

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

本版积分规则

2

主题

68

帖子

3

粉丝