This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

串口接收一组数据。。求问 thx



用串口接收一组数据(每组是25个连续字符,最后有两个字符是校验码),实现每次中断都用这些数据更新一个数组的全局变量,如何实现啊。
如果是从中间开始接受的,如何避免混乱。还有是否要利用,如何利用校验位......
谢啦~

  • 1.在串口中断中判断接收的数量,超过25个说明接受完毕了,这里可以通过读取缓冲区来实现

    2.也可以设置开始和结束符,检测开始和结束符中间的字符都是需要的

  • 这样行不?求教~~

    uchar uchar DataBuf[REC_MAX]; // 缓存
    void Initial_Serial(void) // 串口初始化
    {
    ....
    Rec_Len = 0;      // 初始接收长度为0
    Rec_Flag = 0;      // 未接收 0 未接收或接收完成 1 开始接收
    ....
    }
    //串口接收中断服务程序
    void UARTIntHandler(void)
    {
    uchar sbuffer;
    while(!UARTCharsAvail(UART0_BASE));
    sbuffer=UARTCharGetNonBlocking(UART0_BASE);
    uint32_t ulStatus;
    //获取中断状态
    ulStatus = UARTIntStatus(UART0_BASE, true);
    //清除中断标志
    UARTIntClear(UART0_BASE, ulStatus);
    // 如果收到数据尾1而且当前未接收
    //数据:REC_MAX个字符+校验数据尾CHECK_TAIL0+数据尾CHECK_TAIL1
    if((sbuffer == CHECK_TAIL1) && (Rec_Flag == 0)){
    Rec_Flag = 1;
    Rec_Len = 0;
    }
    // 开始接收
    else if(Rec_Flag){
    if(Rec_Len < (REC_MAX - 1))
    {
    Rec_Len++;
    DataBuf[Rec_Len] = sbuffer;      // 当数据送缓冲区
    }
    else if(Rec_Len == (REC_MAX - 1))     // 接收完成 
    {
    if(DataBuf[Rec_Len] == CHECK_TAIL0)
    {
    .... // 表明接收成功未出错
    }
    else
    {
    .... // 有误码
    }
    Rec_Flag = 0;  // 接收完成,标志清0
    }
    }
    }

  • 这种一般需要给数据包组帧,加上帧头帧尾,中断中接收数据是判断帧头,然后接收数据,判断到帧尾则接收数据包结束,置标志,去主程序里面处理。

  • 您好,我现在也需要通过uart0接受数据,具体的和您的情况十分相似,但是发现程序运行时没有进入中断。。。看您的问题已解决,请求指点。。。我通过UART0给设备发送指令后设备可以正常运行,现在想发送指令让设备回馈数据,指令已发送,但是数据采不到,您能否把您处理好的代码传一下我学习一下,谢谢了