【问题标题】:How to receive more than 5 bytes from uart?如何从 uart 接收超过 5 个字节?
【发布时间】:2018-12-16 13:46:33
【问题描述】:
  • 微控制器:dsPIC30F4013
  • 编译器:xc16

我试图从 UART 接收一个数组,但我只得到前 5 个字节。

我知道接收缓冲区有 4 个字深,但我也需要接收其他字节。也许使用循环缓冲区,但我不知道如何使用它。

谁能帮我获取数组中的所有字节?

这是我当前的代码:

void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void) {
        IFS0bits.U1RXIF = 0; 

        int i = 0;
            while (U1STAbits.URXDA) {
                array[i] = U1RXREG;
                i++;
                if (i == 10) {
                    break;
                }
            }
    }

我将每个数组位置发送到 PC:

串行监视器

对不起,我的英语不好。

【问题讨论】:

    标签: uart microchip circular-buffer dspic xc16


    【解决方案1】:

    经过多次尝试,我成功了。

    我将正确的代码分享给任何需要它的人。

    int k;
    
    
    void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void) {
            IFS0bits.U1RXIF = 0;
    
            array[k++] = U1RXREG;
    
    
            if (k == 10) {
                k = 0;
            }
    
        }
    

    【讨论】:

    • 您必须确保接收到的数组的第一个字节始终在数组 [0] 中。否则,如果您丢失一个字节,您将丢失同步。最好使用带有起始字节、检查和结束的帧。
    • 我该怎么做?
    【解决方案2】:

    示例

    字节 1:'S':起始字节

    字节 2:arrayByte[0]

    字节 3:arrayByte[1]

    .......

    字节 11:arrayByte[9]

    Byte 12:校验和(可能是所有发送字节之和的LSB)

    只有在接收到的字节是“S”时,接收方才会开始接收。
    在完全接收完所有字节后,接收方必须再次计算校验和以确保没有字节丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多