ESP32 官方提供了 Xmodem 的代码,包含的 xmodem 的发送方和接收方源代码(https://gitee.com/esp-components/esp-xmodem)。这部分代码并不在正式的代码库中(https://github.com/espressif/esp-idf)。从代码的提交情况看,该项目提交后就没有维护了。
由于项目在 esp32 需要实现 xmodem,我移植了该项目。调试过程中发现,该代码其实只是刚刚跑通,并没有做详细和异常性测试。比如我遇到的下面两个致命问题:
/* Read data from UART */
uint32_t esp_xmodem_read_data(esp_xmodem_t *handle, int timeout_ms)
{
......
for (;;) {
......
if(xQueueReceive(handle->transport->uart_queue, (void * )&event, handle->transport->recv_timeout/portTICK_PERIOD_MS)) {
.......
switch(event.type) {
//Event of UART receving data
case UART_DATA: {
......
if (timeout_ticks > expired_ticks) {
......
if (len > 0) {
memcpy(&packet[read_len], buffer, len); <----- 没有判断,直接拷贝,可能导致内存泄漏
......
esp_err_t esp_xmodem_sender_send(esp_xmodem_handle_t sender, uint8_t *data, uint32_t len)
{
......
while (left_len > 0) {
......
packet = sender->data; <--- 发送报文和接收报文共用了缓存 sender->data,接收端在出现 hw fifo overflow 后,会向 sender 发送 NAK ,发送端尝试重新发送报文时,发送报文被改写,始终发送 NAK
由于是商业项目,有版权的原因,我不能贴出相应的修改后的代码,这里将主要问题列出,方便移植该项目的开发同行定位和修改。