我正在尝试从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)。
混合电线可能会允许一个方向的某些通讯。
要排除这种复杂情况,您应该使用万用表,甚至更好的是示波器来检查信号。