关于串口同时收发的问题

2019-08-14 07:45发布

我在用STM32F1做一个串口通讯的程序,串口接触摸屏,利用触摸屏上的按钮发送控制信号给32,而32发送给触摸屏的信号是(利用超声波测量的距离值).触摸屏能一直更新距离,但是触摸屏控制32的信号只能控制一次。请问如何解决?(要是我把32发送给触摸屏的程序//掉的好,控制信号能一直传输)
//
#include <stdio.h>
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "beep.h"
#include "nrf24l01.h"
#include "beep.h"
#include "USART.h"
#include "time.h"

extern u8  TIM4CH4_CAPTURE_STA;        //ê&#228;è&#235;2&#182;&#187;&#241;×′ì&#172;                                                   
extern u16        TIM4CH4_CAPTURE_VAL;        //ê&#228;è&#235;2&#182;&#187;&#241;&#214;μ
       
        extern void My_NRF(void);
        extern void My_TJC(void);
        extern void My_HC(void);
       
        u16 t;  
        u16 len;
        u8 tem_TJC[16];
        u8 tmp_buf[33];
        u32 temp=0;
        u32 jl;
       
        int main(void)
{               
        LED_Init();//LED3&#245;ê&#188;&#187;ˉ
        BEEP_Init();//·&#228;&#195;ù&#198;÷3&#245;ê&#188;&#187;ˉ
  KEY_Init();//°′&#188;ü3&#245;ê&#188;&#187;ˉ
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éè&#214;&#195;NVIC&#214;D&#182;&#207;·&#214;×é2:2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(9600);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
        delay_init();
  NRF24L01_Init();            //3&#245;ê&#188;&#187;ˉNRF24L01
       
        TIM4_Cap_Init(0XFFFF,72-1);        //ò&#212;1Mhzμ&#196;&#198;μ&#194;ê&#188;&#198;
       
        while(NRF24L01_Check())        //&#188;ì2éNRF24L01ê&#199;·&#241;&#212;ú&#206;&#187;.       
        {
//                LED0=0;
//                delay_ms(1000);
//                LED0=1;
                delay_ms(1000);
        }
                NRF24L01_RX_Mode();                  //RX&#196;£ê&#189;
                while(1)
                {         
                                My_NRF();
                                My_TJC();
                                My_HC();
                                delay_ms(20);
                }
}
void My_TJC()
{
        if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//μ&#195;μ&#189;′&#203;′&#206;&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y3¤&#182;è
                        for(t=0;t<len;t++)
                        {
                                tem_TJC[t]=USART_RX_BUF[t];
                                USART_SendData(USART1, USART_RX_BUF[t]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê
                        }
                        switch(tem_TJC[0])
                        {
                                case 'A'ED0=0;break;
                                case 'B'ED0=1;break;
                                case 'C'ED1=0;break;
                                case 'D'ED1=1;break;
                                case 'E':BEEP=0;break;
                                case 'F':BEEP=1;break;
                                case 'G':BEEP=0;break;
                                case 'H':BEEP=1;break;
                        }
                        USART_RX_STA=0;
                        delay_ms(10);
                }
//        else
//                {
//                        My_HC();
//                }
}
       
void My_NRF()
{
        if(NRF24L01_RxPacket(tmp_buf)==0)//ò&#187;μ&#169;&#189;óê&#213;μ&#189;D&#197;&#207;¢,&#212;ò&#207;&#212;ê&#190;3&#246;à′.
                        {
                                        switch(tmp_buf[1])
                        {
                                case '1'ED0=~LED0;break;
                                case '2'ED1=~LED1;break;
                                case '3':{LED1=~LED1;LED0=~LED0;}break;
                                case '0':BEEP=~BEEP;break;
                                case '4'ED0=~LED0;break;
                                case '5'ED1=~LED1;break;
                                case '6':{LED1=~LED1;LED0=~LED0;}break;
                                case '7':BEEP=~BEEP;break;
                        }
                                tmp_buf[32]=0;//&#188;óè&#235;×&#214;·&#251;′&#174;&#189;áê&#248;·&#251;
                        }else delay_us(100);       
}

void My_HC(void)
{
                 tri=1;
                 delay_us(20);
                 tri=0;
                 delay_us(20);
                if(TIM4CH4_CAPTURE_STA&0X80)//3é1|2&#182;&#187;&#241;μ&#189;á&#203;ò&#187;′&#206;é&#207;éy&#209;&#216;
                {
                        temp=TIM4CH4_CAPTURE_STA&0X3F;
                        temp*=65536;//ò&#231;3&#246;ê±&#188;&#228;×üoí
                        temp+=TIM4CH4_CAPTURE_VAL;//μ&#195;μ&#189;×üμ&#196;&#184;&#223;μ&#231;&#198;&#189;ê±&#188;
                        jl=temp*170/10000;
                        printf("t3.txt="%d"",jl);
                        stop();               
                        TIM4CH4_CAPTURE_STA=0;//&#191;a&#198;&#244;&#207;&#194;ò&#187;′&#206;2&#182;&#187;&#241;
                        delay_ms(10);
                }
       
}

//usart程序
void uart_init(u32 bound){
  //GPIO&#182;&#203;&#191;úéè&#214;&#195;
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //ê1&#196;üUSART1£&#172;GPIOAê±&#214;ó

        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIOA.9

  //USART1_RX          GPIOA.103&#245;ê&#188;&#187;ˉ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//&#184;&#161;&#191;&#213;ê&#228;è&#235;
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIOA.10  

  //Usart1 NVIC &#197;&#228;&#214;&#195;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);        //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉVIC&#188;&#196;′&#230;&#198;÷

   //USART 3&#245;ê&#188;&#187;ˉéè&#214;&#195;

        USART_InitStructure.USART_BaudRate = bound;//′&#174;&#191;ú2¨ì&#216;&#194;ê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;//&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ê&#213;·¢&#196;£ê&#189;

  USART_Init(USART1, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//&#191;a&#198;&#244;′&#174;&#191;ú&#189;óêü&#214;D&#182;&#207;
  USART_Cmd(USART1, ENABLE);                    //ê1&#196;ü′&#174;&#191;ú1

}

void stop(void)                         //×&#214;&#189;ú·¢&#203;íoˉêy
{                 
         u8 i;
         printf("9");
         for(i=0;i<3;i++)
         {
                        USART_SendData(USART1,0xff);  //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
         }
}

void USART1_IRQHandler(void)                        //′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //&#189;óê&#213;&#214;D&#182;&#207;(&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y±&#216;D&#235;ê&#199;0x0d 0x0a&#189;á&#206;2)
                {
                Res =USART_ReceiveData(USART1);        //&#182;áè&#161;&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
               
                if((USART_RX_STA&0x8000)==0)//&#189;óê&#213;&#206;′íê3é
                        {
                        if(USART_RX_STA&0x4000)//&#189;óê&#213;μ&#189;á&#203;0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//&#189;óê&#213;′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;
                                else {USART_RX_STA|=0x8000;}//&#189;óê&#213;íê3éá&#203;
                                }
                        else //&#187;1&#195;&#187;ê&#213;μ&#189;0X0D
                                {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//&#189;óê&#213;êy&#190;Y′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;&#189;óê&#213;          
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
}
#endif       




       

0条回答

一周热门 更多>