从Amazon FreeRTOS的串行问题中读取

时间:2019-06-20 02:01:49

标签: c++ c freertos rtos esp32

我正在尝试从任务线程上的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独立验证了传输,并且读起来很完美。所以我很困惑。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

Wikipedia

  

用于异步起止通信的串行连接需要许多设置,以   选择每个字符速度,每个数据数据位数,每个字符奇偶校验和停止位数

     

(...)

     

通常,如果输入的设置不正确,连接将不会断开;   但是,任何发送的数据都将在另一端作为废话接收。

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

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