打印
[STM32F1]

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

[复制链接]
1083|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pengf|  楼主 | 2021-10-17 22:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32串口发送完数据后会自动加0x00

使用特权

评论回复
沙发
dengdc| | 2021-10-17 22:36 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
pengf|  楼主 | 2021-10-17 22:38 | 只看该作者
程序是发送6字节数据,仿真时发现每次发送完数据后,末尾会加上0x00。

使用特权

评论回复
地板
pengf|  楼主 | 2021-10-17 22:40 | 只看该作者
数据发送完我已经不使能串口同时又USART-DR=0;还是在末尾多了0x00这个字节,请教怎么去除。

使用特权

评论回复
5
spark周| | 2021-10-17 22:45 | 只看该作者
串口初始化,和发送程序发上来看下

使用特权

评论回复
6
pengf|  楼主 | 2021-10-17 22:47 | 只看该作者
/*********************************************************************
* 函 数 名: 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);
      }
}

使用特权

评论回复
7
dengdc| | 2021-10-17 22:49 | 只看该作者
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
接收中断使能放在哪里啊?

使用特权

评论回复
8
stly| | 2021-10-17 22:51 | 只看该作者
你发送了7个字节数据,怎么判断的,拿示波器看的,还是在另外一块板子跟踪看到的?

使用特权

评论回复
9
pengf|  楼主 | 2021-10-17 22:54 | 只看该作者
有2块板,一个接收一个发送,程序是发送的。

使用特权

评论回复
10
wuhany| | 2021-10-17 22:56 | 只看该作者
以下是接受部分和校验部分
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;
}

使用特权

评论回复
11
zhanghqi| | 2021-10-17 22:58 | 只看该作者
感觉发送函数有问题,发了个\n上去

使用特权

评论回复
12
pengf|  楼主 | 2021-10-17 23:01 | 只看该作者
你说发了一个 \n 在哪句

使用特权

评论回复
13
pengf|  楼主 | 2021-10-17 23:04 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
14
tfqi| | 2021-11-5 11:01 | 只看该作者
发送函数有问题

使用特权

评论回复
15
coshi| | 2021-11-5 11:04 | 只看该作者
程序里边多了一个字符吧

使用特权

评论回复
16
zljiu| | 2021-11-5 11:05 | 只看该作者
\n就是0x00吗

使用特权

评论回复
17
wiba| | 2021-11-5 11:08 | 只看该作者
大概率就是程序的问题

使用特权

评论回复
18
qcliu| | 2021-11-5 11:09 | 只看该作者
每次都会多发吗

使用特权

评论回复
19
呐咯密密| | 2021-11-5 12:32 | 只看该作者
发送函数没发现问题,但是接收函数不敢确定,能否用串口助手或者示波器看看,

使用特权

评论回复
20
SantaBunny| | 2023-3-5 17:16 | 只看该作者
管脚上拉10K电阻再配置完成后清TC标志

使用特权

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

本版积分规则

718

主题

10129

帖子

3

粉丝