打印
[STM32F1]

stm32串口发送完数据后会自动加0x00

[复制链接]
7104|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyh1910|  楼主 | 2014-4-24 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是发送6字节数据,仿真时发现每次发送完数据后,末尾会加上0x00。数据发送完我已经不使能串口同时又USART-DR=0;还是在末尾多了0x00这个字节,请教怎么去除。
沙发
mmuuss586| | 2014-4-24 11:04 | 只看该作者
串口初始化,和发送程序发上来看下

使用特权

评论回复
板凳
yyh1910|  楼主 | 2014-4-24 11:22 | 只看该作者
mmuuss586 发表于 2014-4-24 11:04
串口初始化,和发送程序发上来看下

/*********************************************************************
* 函 数 名: uart_init
* 函数说明: 初始化串口通讯引脚 ,串口配置初始化,中断优先级配置
* 输 入:           bound 串口通讯波特率
* 返 回:    无  
***********************************************************************/
void uart_init(u32 bound)
{
     //GPIO端口设置
     GPIO_InitTypeDef GPIO_InitStructure;
         USART_InitTypeDef USART_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
       
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //使能 USART3 时钟
         USART_DeInit(USART3);  //复位串口3

         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12;          //PB12 max485 R/W Enable
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //复用推挽输出
         GPIO_Init(GPIOB, &GPIO_InitStructure);

        //USART3_TX   PB10
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;          
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
         GPIO_Init(GPIOB, &GPIO_InitStructure);

         //USART3_RX          PB11
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
         GPIO_Init(GPIOB, &GPIO_InitStructure);

     //USART 初始化设置
         USART_InitStructure.USART_BaudRate = bound;//一般设置为4800;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
           USART_InitStructure.USART_Mode =  USART_Mode_Tx;        //发模式
     USART_Init(USART3, &USART_InitStructure); //初始化串口
         
     //Usart1 NVIC 配置
     NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级0
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

     USART_Cmd(USART3, ENABLE);  //使能串口
}


/*********************************************************************
* 函 数 名: USARTSendData
* 函数说明: 串口数据发送函数,在发送完数据后,再发送CRC校验码的高低字节
* 输 入:           USARTx 串口号   prSendData 发送数据的数组名   leng 长度
* 返 回:    无  
***********************************************************************/
void USARTSendData(USART_TypeDef* USARTx,u8 prSendData[],u8 leng)
{
        u8 tempcrcH,tempcrcL; //存储CRC校验码的高低字节
        u8 i;
        tempcrcH= (u8)((usMBCRC16(prSendData,leng)&0xff00)>>8) ;
        tempcrcL= (u8)(usMBCRC16(prSendData, leng)&0x00ff) ;
        for(i=0;i<leng;i++)
        {
          USART_SendData(USARTx, prSendData);
           while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束          
       }
        USART_SendData(USARTx,tempcrcL);//计算发送数据的校验码低字节
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束       
        USART_SendData(USARTx,tempcrcH);//计算发送数据的校验码高字节
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}


main()
{
      while(1)
      {
                GPIO_ResetBits(GPIOB,GPIO_Pin_12); //485设为发送
                delay_ms(5);
                USART_Cmd(USART3, ENABLE);
                USARTSendData( USART3,SendDataBuf2,4);   //SendDataBuf2[4]={0x7c,0x00,0x00,0x00}
                USART_Cmd(USART3, DISABLE);
                USART3->DR=0;
                 GPIO_SetBits(GPIOB,GPIO_Pin_12); //485设为接收
                delay_ms(5);
      }
}



使用特权

评论回复
地板
mmuuss586| | 2014-4-24 11:30 | 只看该作者
本帖最后由 mmuuss586 于 2014-4-24 11:34 编辑


USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
接收中断使能放在哪里啊?

你发送了7个字节数据,怎么判断的,拿示波器看的,还是在另外一块板子跟踪看到的?

使用特权

评论回复
5
yyh1910|  楼主 | 2014-4-24 11:51 | 只看该作者
mmuuss586 发表于 2014-4-24 11:30
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
接收中断使能放在哪里啊?

有2块板,一个接收一个发送,程序是发送的。

使用特权

评论回复
6
yyh1910|  楼主 | 2014-4-24 11:56 | 只看该作者
mmuuss586 发表于 2014-4-24 11:30
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
接收中断使能放在哪里啊?

以下是接受部分和校验部分
void USART3_IRQHandler(void)        
{
         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
         {
                        if(RecStatus == fail)
                        {
                                 USART_RX_BUF[ReceiveLen] =USART_ReceiveData(USART3);//读取接收到的数据
                                 USART_ClearITPendingBit(USART3, USART_IT_RXNE);
                                 ++ReceiveLen;
                                 if( ReceiveLen == USART_REC_LEN)//接收完成6个字节命令
                                 {
                                         ReceiveLen = 0;//接收完6个字节数据后将计数置清零
                                         USARTRecStatus = DataErrorCorrectionMechanism();
                                 }
                    }
       }
}

u16 RecCommendCRC(void)//接收到命令的CRC校验码
{
       u16 tempdata=0; //存储CRC校验码的高+低字节
        tempdata = ((u16)(USART_RX_BUF[5]<<8)+(u16)USART_RX_BUF[4]);  
       return tempdata;
}

u8 DataErrorCorrectionMechanism(void)//数据纠错机制
{
           u8 status=0;
           u8 i=0;
           if(usMBCRC16(USART_RX_BUF, 4 )== RecCommendCRC())                                  
            status = success;//数据接收成功                         
         else
             status=fail;
          
     return status;
}

使用特权

评论回复
7
djj3343| | 2014-4-24 21:42 | 只看该作者
感觉发送函数有问题,发了个\n上去

使用特权

评论回复
8
yyh1910|  楼主 | 2014-4-25 08:15 | 只看该作者
djj3343 发表于 2014-4-24 21:42
感觉发送函数有问题,发了个\n上去

你说发了一个 \n 在哪句

使用特权

评论回复
9
黑洞不黑| | 2019-11-21 19:43 | 只看该作者
我遇到了和你同样的问题,怎么解决的?

使用特权

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

本版积分规则

48

主题

96

帖子

1

粉丝