我正在尝试从任务线程上的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独立验证了传输,并且读起来很完美。所以我很困惑。
我确定这是一个相当简单的错误。但是我不知道这是什么。
谢谢。
答案 0 :(得分:1)
必须正确配置串行接口。两端的设置 必须相同。
用于异步起止通信的串行连接需要许多设置,以 选择每个字符速度,每个数据数据位数,每个字符奇偶校验和停止位数。
(...)
通常,如果输入的设置不正确,连接将不会断开; 但是,任何发送的数据都将在另一端作为废话接收。
如果接收器在电线上看到不良的位模式,则应引发“成帧错误”或“奇偶校验错误”。 但是,无法检测到某些错误,并且通常经常忽略那些错误状态。
串行接口的另一大问题根源是电气方面。 传统的RS232电压高达+/- 15V。相反,微控制器更喜欢经典逻辑信号(3.3V或5V)。 混合电线可能会允许一个方向上的一些通信。 要排除这种复杂情况,您应该使用万用表,甚至更好的是示波器来检查信号。