打印

串口发送有时正确有时错误,不准怎么回事?

[复制链接]
2153|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sflower|  楼主 | 2012-10-24 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void UART2_Init(void)     
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
//  NVIC_InitTypeDef NVIC_InitStructure;
    //使能串口2时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  
//******************************************************************************
//  串口1所使用管脚输出输入定义
//******************************************************************************
  
  // 定义UART1 TX (PA.09)脚为复用推挽输出
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;         //IO口的第九脚
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //IO口复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化串口1输出IO口
  // 定义 USART1 Rx (PA.10)为悬空输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //IO口的第3?
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化串口1输入IO?
//******************************************************************************
//    串口2参数初始化定义部分,串口2参数为19600 , 8 ,1 ,N  接收中断方式
//******************************************************************************  
  USART_InitStructure.USART_BaudRate = 19200; //设定传输速率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设定传输数据位数
  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;   //使用接收和发送功能
  
串口发送有时正确有时错误,错误时高位为1(本应为0x01,结果发出来是0x81)

  USART_Init(USART2, &USART_InitStructure);  //初始化串口1
  

  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);      // 接收使能
//  USART_ITConfig(USART2,USART_IT_TXE,ENABLE);      // 发送使能
  USART_Cmd(USART2,ENABLE);     //使能串口1
   USART_ClearFlag(USART2,USART_FLAG_TXE);
   
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //先占优先级2位,从优先级2位
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//Channel; USART1_IRQn
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
  }


void Uart2_PutChar(u8 ch)
{
  USART_SendData(USART2, ch);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//等待数据发送完毕
}

请教高手指点,为什么我发出的数据高8位数据有时莫名置为1了?
沙发
jxmzzr| | 2012-10-24 18:44 | 只看该作者
可能你的逻辑没有错,但时间不准,应该是程序问题引起的

使用特权

评论回复
板凳
捡漏王子| | 2012-10-25 09:47 | 只看该作者
不知道是不是你的校验方式错误?

使用特权

评论回复
地板
sflower|  楼主 | 2012-10-25 11:38 | 只看该作者
谢谢2、3楼的解答。
偶校验,数据宽度为9;USART_InitStructure.USART_WordLength = USART_WordLength_9b

使用特权

评论回复
5
sflower|  楼主 | 2012-10-25 11:38 | 只看该作者
USART_InitStructure.USART_BaudRate = 19200; //设定传输速率
  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_Init(USART2, &USART_InitStructure);  //初始化串口1

使用特权

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

本版积分规则

17

主题

150

帖子

1

粉丝