从 Amazon FreeRTOS 的串行问题中读取
Reading from serial problems with Amazon FreeRTOS
我正在尝试从任务线程上的 ESP32 DevKitC 克隆上的 uart2 读取数据。
我的代码如下:
uint8_t data[128];
data[0] = '[=10=]'; //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] = '[=10=]'; //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" 应该是 0x55 x56 x57 但它似乎被解释为“0x55 0xD5 0xFD”,更奇怪的是如果我将 "UUU" 发送到应该是“0x55 0x55 0x55”的序列号” 它以“0x55 0x55 0xF5”的形式到达,这很奇怪,因为字节 #2 在它之前的字节重复时没有格式错误。
我已经用 arduino 独立验证了传输,它读取完美。所以我很困惑。
我确定这是我犯的一个相当简单的错误。但是我不知道它是什么。
提前谢谢你。
串行接口必须正确配置。两端设置
必须相同。
Many settings are required for serial connections used for asynchronous start-stop communication, to
select speed, number of data bits per character, parity, and number of stop bits per character.
(...)
Often if the settings are entered incorrectly the connection will not be dropped;
however, any data sent will be received on the other end as nonsense.
如果接收器在线路上发现错误的位模式,它应该引发“帧错误”或“奇偶校验错误”。
然而,有些错误无法检测到,通常这些错误状态会被忽略。
串行接口问题的另一个重要来源是电气方面。
传统 RS232 的电压高达 +/-15V。相反,micro-controllers 更喜欢经典逻辑信号(3.3V 或 5V)。
混淆电线可能允许 一些 单向通信。
要排除这种复杂情况,您应该使用万用表或更好的示波器检查信号。
我正在尝试从任务线程上的 ESP32 DevKitC 克隆上的 uart2 读取数据。
我的代码如下:
uint8_t data[128];
data[0] = '[=10=]'; //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] = '[=10=]'; //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" 应该是 0x55 x56 x57 但它似乎被解释为“0x55 0xD5 0xFD”,更奇怪的是如果我将 "UUU" 发送到应该是“0x55 0x55 0x55”的序列号” 它以“0x55 0x55 0xF5”的形式到达,这很奇怪,因为字节 #2 在它之前的字节重复时没有格式错误。
我已经用 arduino 独立验证了传输,它读取完美。所以我很困惑。
我确定这是我犯的一个相当简单的错误。但是我不知道它是什么。
提前谢谢你。
串行接口必须正确配置。两端设置 必须相同。
Many settings are required for serial connections used for asynchronous start-stop communication, to select speed, number of data bits per character, parity, and number of stop bits per character.
(...)
Often if the settings are entered incorrectly the connection will not be dropped; however, any data sent will be received on the other end as nonsense.
如果接收器在线路上发现错误的位模式,它应该引发“帧错误”或“奇偶校验错误”。 然而,有些错误无法检测到,通常这些错误状态会被忽略。
串行接口问题的另一个重要来源是电气方面。 传统 RS232 的电压高达 +/-15V。相反,micro-controllers 更喜欢经典逻辑信号(3.3V 或 5V)。 混淆电线可能允许 一些 单向通信。 要排除这种复杂情况,您应该使用万用表或更好的示波器检查信号。