从 Amazon FreeRTOS 的串行问题中读取



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

我的代码如下:

uint8_t data[128];
data[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] = ''; //null terminate the string
IotLogInfo( "Rx: %i bytes", length );
IotLogInfo( "Rx: %s ", data );
}
else{
IotLogInfo( "rx no data" );
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}

由于某种原因,传输字符串"UVW"的字符 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"应该是 x56 x57 0x55,但它似乎被解释为"0x55 0xD5 0xFD",更奇怪的是,如果我将"UUU"发送到应该是"0x55 0x55 0x55"的序列号,它会以"0x55 0x55 0xF5"的形式到达,这非常奇怪,因为字节 #2 在重复之前的字节时没有格式不正确。

我已经用 arduino 独立验证了传输,它读起来很完美。所以我很困惑。

我确定这是我的一个相当简单的错误。但是我无法弄清楚它是什么。

提前谢谢你。

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

维基百科 写

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

(...

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

如果接收器在线路上看到坏位模式,则应引发"成帧错误"或"奇偶校验错误"。 但是,无法检测到某些错误,并且通常只是忽略这些错误状态。

串行接口问题的另一个重要来源是电气侧。 传统的RS232具有高达+/-15V的电压。相比之下,微控制器更喜欢经典逻辑信号(3.3V或5V)。 混合电线可能会允许在一个方向上进行一些通信。 为了排除这种复杂性,您应该使用万用表或更好的示波器检查信号。

相关内容

  • 没有找到相关文章

最新更新