串口接受数据

2019-07-21 03:33发布

发送一串十六进制数【5A A5 06 83 12 00 01 00 02】到串口   32接收并保存到数组  但总是达不到想要的效果(通过识别最后的两位02   来控制灯的亮灭)求各位大神指点迷津   代码如下void USART1_IRQHandler(void)                        //串口3中断服务程序,用于和触摸屏通讯。
{
        extern int STOP;
    uint8_t Res;
    static uint8_t US_STA = 0;         //用于检测是否已经收到帧头,未收到为0,收到5a为1,收到a5为2。
    static uint8_t buffer_num = 0;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        Res = USART_ReceiveData(USART1);               //读取接收到的数据
        if(!USART_RX_STA)
        {
            if(US_STA == 0)
            {
                if(Res == 0x5A) US_STA = 1;         //接收到了0x5a,US_STA=1
            }
            else if(US_STA == 1)
            {
                if(Res == 0xA5)
                {
                    US_STA = 2;                     //接收到了0xA5,US_STA=2
                    buffer_num = 0;
                }
                else US_STA = 0;                    //5A后面不是A5则全部重新接收。
            }
            else if(US_STA == 2)
            {
                USART_RX_BUF[buffer_num] = Res;
                if(buffer_num++ == USART_RX_BUF[0])
                {
                    buffer_num = 0;
                    USART_RX_STA = 1;              //当接收数量等于缓存0位置时,则接收完成。
                    US_STA = 0;
                                                                        STOP=1;
                }
            }
        }
    }
}






while(1)
        {

if(STOP==1)
{
//        printf("%x ",USART_RX_BUF);
                switch(USART_RX_BUF[8])
                {
                        case 0x02:
                       
                                LED2_1;        printf("OPEN ");printf("%x ",USART_RX_BUF[8]);memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));USART_RX_STA=0;
                                break;
                        case 0x01:
                                LED2_0;       
                                printf("CLOSE ");printf("%x ",USART_RX_BUF[8]);memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));USART_RX_STA=0;
                                        break;
                        default : break;
                }
        }
else
        printf("DEFAULT ");
}
       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Psheng
1楼-- · 2019-07-21 22:39
仿真看看吧
edmund1234
2楼-- · 2019-07-22 03:43
虽然你没说, 但我猜你是想这样做

  Res = USART_ReceiveData(USART1);        
if(!USART_RX_STA)
{   switch(US_STA){
          case 0:
          case 1:
             if(Res==0x5A)US_STA++;
             else  US_STA=0;
             break;
          case 2:
             USART_RX_BUF[buffer_num]=Res;
             if (++buffer_num==USART_RX_BUF[0]-1){
                    USART_RX_STA = 1;              //当接收数量等于缓存0位置时,则接收完成。
                    US_STA = 0;
                    STOP=1;
             }
             break;
        }
        .......
CXY1996
3楼-- · 2019-07-22 05:40
 精彩回答 2  元偷偷看……

一周热门 更多>