我正在尝试从ESP32 DevKitC克隆上的uart2读取任务线程。

我的代码如下:

uint8_t data[128];
data[0] = '\0'; //null terminate so we don't print garbage

for( ; ; ) {
    //get a chunk of data off the FIFO buffer
    const int uart_num = UART_NUM_2;
    int length = 0;
    IotLogInfo( "preread" );
    length = uart_read_bytes(uart_num, data, 10, 1000 / portTICK_RATE_MS); //read 10 bytes or time out after a second.

    if(length == -1)
        IotLogInfo( "read reported error! -1" );

    //did we rx anything?
    if(length > 0){
        data[length] = '\0'; //null terminate the string
        IotLogInfo( "Rx: %i bytes", length );
        IotLogInfo( "Rx: %s ", data );
    }
    else{
        IotLogInfo( "rx no data" );
    }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
}


由于某种原因,即使缓冲区保存的不止一次传输,传输的字符串“ UVW”的char 2和3也变得混乱:

122 4911 [_readSerialForM] [INFO ][DEMO][49110] preread

123 5011 [_readSerialForM] [INFO ][DEMO][50110] Rx: 3 bytes

124 5011 [_readSerialForM] [INFO ][DEMO][50110] Rx: U⸮⸮

126 5011 [_readSerialForM] [INFO ][DEMO][50110] preread

127 5111 [_readSerialForM] [INFO ][DEMO][51110] Rx: 3 bytes

128 5111 [_readSerialForM] [INFO ][DEMO][51110] Rx: U⸮⸮

130 5111 [_readSerialForM] [INFO ][DEMO][51110] preread

131 5510 [_readSerialForM] [INFO ][DEMO][55100] Rx: 12 bytes

132 5510 [_readSerialForM] [INFO ][DEMO][55100] Rx: U⸮⸮U⸮⸮U⸮⸮U⸮⸮

134 5510 [_readSerialForM] [INFO ][DEMO][55100] preread

135 5710 [_readSerialForM] [INFO ][DEMO][57100] Rx: 6 bytes

136 5710 [_readSerialForM] [INFO ][DEMO][57100] Rx: U⸮⸮U⸮⸮

138 5710 [_readSerialForM] [INFO ][DEMO][57100] preread

139 5910 [_readSerialForM] [INFO ][DEMO][59100] Rx: 6 bytes

140 5910 [_readSerialForM] [INFO ][DEMO][59100] Rx: U⸮⸮U⸮⸮


“ UVW”应为0x55 x56 x57,但似乎被解释为“ 0x55 0xD5 0xFD”,甚至更奇怪的是,如果我将“ UUU”发送到应该为“ 0x55 0x55 0x55”的序列号,则到达“ 0x55 0x55 0xF5” ,这很奇怪,因为当字节#2重复其前面的字节时,它没有被畸形。

我用arduino独立验证了变速箱,它读起来很完美。所以我很困惑。

我确定这对我来说是一个相当简单的错误。但是我不知道这是什么。

先感谢您。

最佳答案

串行接口必须正确配置。两端的设置
必须相同。

Wikipedia



  用于异步起停通信的串行连接需要进行许多设置,以便
  选择速度,每个字符的数据位数,奇偶校验和每个字符的停止位数。
  
  (...)
  
  通常,如果输入的设置不正确,连接将不会断开。
  但是,任何发送的数据都将在另一端作为废话接收。


如果接收器在电线上看到不良的位模式,则应引发“成帧错误”或“奇偶校验错误”。
但是,无法检测到某些错误,并且通常经常忽略那些错误状态。

串行接口问题的另一个重要原因是在电气方面。
传统的RS232电压高达+/- 15V。相反,微控制器更喜欢经典逻辑信号(3.3V或5V)。
混合电线可能会允许一个方向的某些通讯。
要排除这种复杂情况,您应该使用万用表,甚至更好的是示波器来检查信号。

10-08 08:45