OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5834|回复: 5

各位大神帮忙看看,用串口通讯,为什么我发的数据和接收的不一样

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-9-14
在线时间
5 小时
发表于 2017-9-14 11:20:46 | 显示全部楼层 |阅读模式
1金钱
#include  <includes.h>
/* ----------------- APPLICATION GLOBALS ------------------ */
static  OS_TCB   AppTaskStartTCB;
static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];

static  void  AppTaskStart          (void             *p_arg);
static  void  AppTaskCreate         (void);
static  void  AppObjCreate          (void);
//================================================================================================
OS_TCB  RS232_command_StartTCB;
CPU_STK RS232_command_Task_Stk[APP_TASK_START_STK_SIZE];

OS_SEM           Uart_1_Char_Semp;
OS_MUTEX         Uart_1_Mutex;
OS_SEM           Uart_2_Char_Semp;
OS_MUTEX         Uart_2_Mutex;

/*
*********************************************************************************************************
*                                                main()
*********************************************************************************************************
*/

int main(void)
{
    OS_ERR  err;

    BSP_IntDisAll();                                            /* Disable all interrupts.                                  */

    CPU_Init();                                                 /* Initialize uC/CPU services.                              */
    Frist_On_Machine();
       
    OSInit(&err);                                               /* Init OS.                                                 */

    OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                /* Create the start task                                    */
                 (CPU_CHAR   *)"App Task Start",
                 (OS_TASK_PTR ) AppTaskStart,
                 (void       *) 0,
                 (OS_PRIO     ) APP_TASK_START_PRIO,
                 (CPU_STK    *)&AppTaskStartStk[0],
                 (CPU_STK     )(APP_TASK_START_STK_SIZE / 10u),
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
                 (OS_MSG_QTY  ) 0,
                 (OS_TICK     ) 0,
                 (void       *) 0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);

    OSStart(&err);

    while (DEF_ON) {                                            /* Should Never Get Here                                    */
    };
}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
        //CPU_TS                p_ts;
        OS_ERR      os_err;
        (void)p_arg;       
       
    CPU_Init();                                                 /* Init CPU name & int. dis. time measuring fncts.          */

    Mem_Init();                                                 /* Initialize Memory managment                              */

    BSP_CPU_TickInit();                                         /* Start Tick Initialization                                */

          Frist_On_Machine();
         
    AppObjCreate();                                             /* Create Application Kernel Objects                        */

    AppTaskCreate();                                            /* Create Application Tasks                                 */
         OSTimeDlyHMSM(0, 0, 0, 50,
                                                        OS_OPT_TIME_HMSM_STRICT, &os_err);
       
        //---------------------------------------------------------------------------------------------                       
       
       
        //---------------------------------------------------------------------------------------------               
    while (DEF_ON)
                {               
//                         if(UART_1.RX_Count>0)
//                         {USART_SendData(USART1, UART_1.RX_Buffer[UART_1.RX_Count]);   
//                                 UART_1.RX_Count --;
//    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){} //发送数据寄存器空标志位
//          }
                        OSTimeDlyHMSM(0, 0, 0, 50,
                                                        OS_OPT_TIME_HMSM_STRICT, &os_err);
                }
}


/*
*********************************************************************************************************
*                                          AppTaskCreate()
*

*********************************************************************************************************
*/

static  void  AppTaskCreate (void)
{
    OS_ERR          err;
       
          
                OSTaskCreate((OS_TCB     *)&RS232_command_StartTCB,                // Create the start task
                 (CPU_CHAR   *)"RS232",
                 (OS_TASK_PTR ) RS232_command,                                //任务名称
                 (void       *) 0,
                 (OS_PRIO     ) APP_TASK_START_PRIO ,                        //任务等级
                 (CPU_STK    *)&RS232_command_Task_Stk[0],
                 (CPU_STK     )(APP_TASK_START_STK_SIZE / 10u),
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
                 (OS_MSG_QTY  ) 0,
                 (OS_TICK     ) 0,
                 (void       *) 0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);
          


                                                                 
}


static  void  AppObjCreate (void)
{
        OS_ERR  err;
       
        OSSemCreate                (        &Uart_2_Char_Semp,        (CPU_CHAR *)"Uart_2_Char",                0,                &err        );
        OSSemCreate                (        &Uart_1_Char_Semp,        (CPU_CHAR *)"Uart_1_Char",                0,                &err        );
        OSMutexCreate        (        &Uart_2_Mutex,                (CPU_CHAR *)"Uart_2_Mut",                &err                        );
        OSMutexCreate        (        &Uart_1_Mutex,                (CPU_CHAR *)"Uart_1_Mut",                &err                        );
}
//====================================================================================================================
#include  <includes.h>

uint8_t        TX_Buffer[60];
char                TX1_Buffer[128];

void RCC_Configuration(void);
void GPIO_Configuration(void);
void UART_1_Init(void);
void UART_2_Init(void);  
void Frist_On_Machine(void);

struct UART_STRUCT         UART_2;
struct UART_STRUCT         UART_1;
//=====================================================================
//=====================================================================
void Frist_On_Machine(void)
{
        RCC_Configuration();
        GPIO_Configuration();
        UART_1_Init();
        UART_2_Init();
}

//=====================================================================
//=====================================================================
void RCC_Configuration(void)
{
  //        __IO uint32_t StartUpCounter = 0
       
        RCC_DeInit();                                                                                                                //复位RCC

        RCC_HSEConfig(RCC_HSE_ON);                                                                                                  //打开外部告诉晶振
        while ((RCC_WaitForHSEStartUp() != SUCCESS))                                //  && (StartUpCounter != HSE_STARTUP_TIMEOUT)
                {};                                //等待外部振荡器启动StartUpCounter++;

//        if(StartUpCounter == HSE_STARTUP_TIMEOUT)
//                {
//                        RCC_HSICmd(ENABLE);       
//                        RCC_PLLConfig(RCC_PLLSource_HSE,8,120,2,5        );                                //Configures the main PLL clock source, multiplication and division factors.
//                }
//        else
//                {
                        RCC_PLLConfig(RCC_PLLSource_HSE,4,120,2,5        );                                //Configures the main PLL clock source, multiplication and division factors.
//                }
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                          // AHB clock = SYSCLK   RCC_SYSCLK_Div1
        RCC_PCLK1Config(RCC_HCLK_Div4);                                                                              // APB1 clock = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div2);                                                                                        // APB2 clock = HCLK   RCC_HCLK_Div2



        RCC_PLLCmd(ENABLE);                                                              //使能PLL
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET){}           //等待PLL稳定

        FLASH_SetLatency(FLASH_Latency_7);                                                          // Flash延迟         4 Flash wait states                                 
        FLASH_PrefetchBufferCmd        (ENABLE);

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                          //设定系统时钟                              
        while (RCC_GetSYSCLKSource() != RCC_CFGR_SWS_PLL){}                 // 使用PLL作为系统时钟 system clock                       


        //-------------------------------------------------------------
        RCC_HCLKConfig(RCC_SYSCLK_Div1);        // AHB clock = SYSCLK

        RCC_AHB1PeriphClockCmd(        RCC_AHB1Periph_GPIOA        |        RCC_AHB1Periph_GPIOB        |        RCC_AHB1Periph_GPIOC        |        RCC_AHB1Periph_GPIOD |
                                                                RCC_AHB1Periph_GPIOE        |        RCC_AHB1Periph_GPIOF        |        RCC_AHB1Periph_GPIOG        |        RCC_AHB1Periph_GPIOH        |
                                                                RCC_AHB1Periph_GPIOI        |        RCC_AHB1Periph_DMA1                |        RCC_AHB1Periph_DMA2                |        RCC_AHB1Periph_CRC                |
                                                                RCC_AHB1Periph_BKPSRAM,
                                                                ENABLE
                                                        );

        RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3  |        RCC_APB1Periph_CAN1|                                //        | RCC_APB1Periph_UART4 | RCC_APB1Periph_UART5
                                      RCC_APB1Periph_SPI2 | RCC_APB1Periph_TIM2| RCC_APB1Periph_TIM3, ENABLE );       
               
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_TIM8        |RCC_APB2Periph_USART1        |        RCC_APB2Periph_USART6        |        RCC_APB2Periph_ADC1        |RCC_APB2Periph_TIM1|
                                                        RCC_APB2Periph_ADC3                |RCC_APB2Periph_SDIO                |RCC_APB2Periph_TIM11|RCC_APB2Periph_SPI1,        ENABLE);       

}


//IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====
//IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====IO口初始化====
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef   GPIO_InitStructure;                               

        GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_OUT;                         //通用输出模式
        GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_NOPULL;               
  GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;
       
        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_0; // 和单片机状态灯
        GPIO_Init(GPIOG, &GPIO_InitStructure);
       
        //GPIO_SetBits(GPIOG,GPIO_Pin_0);
}

//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====
//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====
void UART_1_Init(void)
{
  DMA_InitTypeDef           DMA_InitStructure;
  NVIC_InitTypeDef         NVIC_InitStructure;               
  GPIO_InitTypeDef         GPIO_InitStructure;
  USART_InitTypeDef         USART_InitStructure;       
       
  //------------------------------------------------------------------------------------
        NVIC_InitStructure.NVIC_IRQChannel                                                 = BSP_INT_ID_USART1;                //UART1中断编号
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                        = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                         = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
  //------------------------------------------------------------------------------------       
        USART_InitStructure.USART_BaudRate                                 = 9600;
        USART_InitStructure.USART_WordLength                         = USART_WordLength_8b;
        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_Rx | USART_Mode_Tx;

  //------------------------------------------------------------------------------------       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd         = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
       
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_9;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType         = GPIO_OType_OD;                //开漏输出
        GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_NOPULL;                //没有上拉和下拉
       
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        USART_Init(USART1, &USART_InitStructure);

        USART_ITConfig(USART1, USART_IT_TC,                ENABLE);                //USART_IT_TC:  发送完成                                中断允许
        USART_ITConfig(USART1, USART_IT_RXNE,        ENABLE);                // 接收数据寄存器非空(有数据可读)          中断允许

        USART_ITConfig(USART1, USART_IT_ERR,        ENABLE);
        USART_ITConfig(USART1, USART_IT_ORE,        ENABLE);
        USART_ITConfig(USART1, USART_IT_NE,                ENABLE);
        USART_ITConfig(USART1, USART_IT_FE,                ENABLE);       

        USART_Cmd(USART1, ENABLE);                                        //使能UART
       
        //===============================================================
        DMA_DeInit        (DMA2_Stream7);
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;  
          
  DMA_InitStructure.DMA_PeripheralBaseAddr         = (uint32_t)(&USART1->DR);
        DMA_InitStructure.DMA_BufferSize = (uint32_t)(UART_BUFER_SIZE);

        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(TX1_Buffer);
       
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;               
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority         = DMA_Priority_High;
        DMA_InitStructure.DMA_FIFOMode         = DMA_FIFOMode_Disable;
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
       
        DMA_Init(DMA2_Stream7, &DMA_InitStructure);
        DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);

  USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);            

        DMA_Cmd(DMA2_Stream7, ENABLE);                                                                        //使能DMA

}

//================================================================================
#include  <includes.h>
//=====================================================================================
uint16_t        USART_RX_STA=0;
uint8_t xxtt;

void BSP_IntHandlerUSART1(void)
{               
        if(USART_GetITStatus(USART1, USART_IT_PE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_PE);               
                }       
        if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_TXE);               
                }       
        if(USART_GetITStatus(USART1, USART_IT_TC) == SET)                                //发送完成中断
                {       
                        USART_ClearITPendingBit                (USART1, USART_IT_TC);                //清除中断标志                       
        //        Send_Glag = 0;
        //                UART_1.RX_Count = 0;
        //                UART_1.State = RX_START_x10;       
                }       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_RXNE);                //清除中断标志       
                        receive_ASCII();                       
                }               
        if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_IDLE);                //清除中断标志
                }       
        if(USART_GetITStatus(USART1, USART_IT_LBD) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_LBD);       
                        xxtt = (char)(USART_ReceiveData(USART1));               
                }               
        if(USART_GetITStatus(USART1, USART_IT_CTS) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_CTS);       
                        xxtt = (char)(USART_ReceiveData(USART1));               
                }       
        if(USART_GetITStatus(USART1, USART_IT_ERR) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_ERR);               
                        xxtt = (char)(USART_ReceiveData(USART1));       
                }               
        if(USART_GetITStatus(USART1, USART_IT_ORE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_ORE);       
                        xxtt = (char)(USART_ReceiveData(USART1));       
                }       
        if(USART_GetITStatus(USART1, USART_IT_NE) == SET)                       
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_NE);       
                        xxtt = (char)(USART_ReceiveData(USART1));               
                }       
   if(USART_GetITStatus(USART1, USART_IT_FE) == SET)                        //FE: 帧错误
                {
                        USART_ClearITPendingBit        (USART1, USART_IT_FE);                //清除中断标志
                        xxtt = (char)(USART_ReceiveData(USART1));       
                }
}
//=================================================================

#include  <includes.h>

OS_TCB   UART_2_RX_StartTCB;
CPU_STK  UART_2_RX_Task_Stk[APP_TASK_START_STK_SIZE];

OS_ERR                err;
CPU_TS                p_ts;
//============================================================================================================================
uint16_t        uiCmdError;
uint8_t         Send_Flag;
uint8_t                RX_Check_Buffer[6];
uint8_t                RX_Buffer[60];


void UART2_Send(uint8_t *ucFrameBuf, uint8_t ucFrameLen, uint16_t uiCmdError, uint8_t *parameter);
//============================================================================================================================
void  RS232_command (void *p_arg)
{
        OS_ERR          err;
       
            OSTimeDly(10,OS_OPT_TIME_DLY,&err);
            GPIO_SetBits(GPIOG,GPIO_Pin_0);
                        OSTimeDly(500,OS_OPT_TIME_DLY,&err);
       
        while (1)
        {       
                       
                        GPIO_ResetBits(GPIOG,GPIO_Pin_0);
            OSTimeDly(500,OS_OPT_TIME_DLY,&err);
            GPIO_SetBits(GPIOG,GPIO_Pin_0);
                        OSTimeDly(500,OS_OPT_TIME_DLY,&err);
               
        }                               
}

//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====
//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====//UART1====
void receive_ASCII(void)
{
  uint16_t receive_word;
       
        receive_word         = (uint16_t)(USART_ReceiveData(USART1));
  UART_1.RX_Buffer[UART_1.RX_Count] = receive_word;
       
        USART_SendData(USART1,receive_word);     
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){} //发送数据寄存器空标志位
}



最佳答案

查看完整内容[请看2#楼]

问题已经解决,是波特率问题,应该把时钟设置成实际使用的,不能用默认的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-9-14
在线时间
5 小时
 楼主| 发表于 2017-9-14 11:20:47 | 显示全部楼层
问题已经解决,是波特率问题,应该把时钟设置成实际使用的,不能用默认的。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-9-14
在线时间
5 小时
 楼主| 发表于 2017-9-14 11:23:37 | 显示全部楼层
接收的与发送的不一样
QQ图片20170914112214.png
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2017-9-14 11:53:23 | 显示全部楼层

你这是PC发出,单片机接收再回传,
包含了两套收发过程。

用仿真器分开查,先让PC发,单片机收,
看单片机收的对不对。
然后再说。

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-9-14
在线时间
5 小时
 楼主| 发表于 2017-9-14 12:07:15 | 显示全部楼层
xuande 发表于 2017-9-14 11:53
你这是PC发出,单片机接收再回传,
包含了两套收发过程。

单片机收的也不对,我发的FF收到的是F8,发的22收到的是80
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-12-13
在线时间
23 小时
发表于 2019-2-27 14:58:00 | 显示全部楼层
愚公瑾 发表于 2017-9-14 11:20
**** 作者被禁止或删除 内容自动屏蔽 ****

能不能详细说一下怎么改啊,小白也遇到这样的问题,不知道怎么修改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表