1. 硬件连接与初始化配置第一次玩K210和STM32串口通信的时候最让我头疼的就是引脚连接问题。STM32的串口引脚是固定的比如USART1默认在PA9和PA10但K210就灵活多了几乎任意IO都可以映射为串口功能。这里我用的是一块K210开发板和正点原子的STM32F103ZET6精英板。接线其实特别简单只需要四根线STM32的PA9(TXD)接K210的IO9(RXD)STM32的PA10(RXD)接K210的IO10(TXD)两边的GND一定要接在一起3.3V电源可以共用一个这里有个坑我踩过刚开始没接GND数据死活传不过去后来才发现共地是必须的。另外建议用杜邦线连接时尽量短一些长线容易引入干扰。STM32端的初始化就是标准操作用HAL库或者标准库都行。我习惯用HAL初始化代码大概长这样void MX_USART1_UART_Init(void) { huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; huart1.Init.Mode UART_MODE_TX_RX; huart1.Init.HwFlowCtl UART_HWCONTROL_NONE; huart1.Init.OverSampling UART_OVERSAMPLING_16; if (HAL_UART_Init(huart1) ! HAL_OK) { Error_Handler(); } }2. STM32数据发送实战在STM32端发送数据其实特别简单但有几个细节需要注意。我以发送温度值为例实际项目里可能是各种传感器数据。最直接的方式就是用printffloat temp_wendu 25.6; printf(%.2f, temp_wendu);但这里有个坑默认情况下printf是通过串口1输出的如果你的工程里没重定向fputc可能会卡死。保险起见可以这样发送char buffer[20]; int len sprintf(buffer, %.2f, temp_wendu); HAL_UART_Transmit(huart1, (uint8_t*)buffer, len, 100);实测下来发现几个经验浮点数传输建议固定小数位数避免长度变化如果传输多个数据最好加分隔符比如逗号传输频率不要太快K210那边处理需要时间我后来改进的发送代码是这样的void send_sensor_data(float temp, float humi) { static char tx_buf[64]; int len sprintf(tx_buf, %.1f,%.1f\r\n, temp, humi); HAL_UART_Transmit(huart1, (uint8_t*)tx_buf, len, 100); }加\r\n是为了方便K210那边判断数据结束这个在调试阶段特别有用。3. K210端串口配置详解K210这边用MicroPython开发真的太方便了比用C语言开发STM32舒服多了。首先要在MaixPy IDE里导入必要的模块from machine import UART from fpioa_manager import fm引脚映射是K210的特色功能我们可以把任意IO配置成串口fm.register(9, fm.fpioa.UART1_RX, forceTrue) fm.register(10, fm.fpioa.UART1_TX, forceTrue)这里的forceTrue意思是强制映射即使这个引脚之前被其他功能占用也会强行改过来。初始化串口的代码如下uart UART(UART.UART1, 115200, 8, 1, 0, timeout1000, read_buf_len4096)参数说明115200波特率必须和STM32一致8数据位1停止位0无校验timeout超时时间(ms)read_buf_len接收缓冲区大小这里我建议缓冲区设大一点实测4096比较稳妥。曾经设过256结果数据量大时就丢包。4. 数据接收与解码处理STM32发过来的是字节数据K210这边需要解码才能变成可读的字符串。MicroPython处理这个特别简单read_data uart.read(5) # 读取5个字节 if read_data: text read_data.decode(utf-8) # UTF-8解码但实际项目中会遇到各种问题数据长度不固定比如温度可能是25.6或-12.3数据不完整可能只收到部分字节数据错误传输过程中出现干扰我的改进方案是这样的def read_uart(uart): buf bytearray() while True: byte uart.read(1) if not byte: break buf.append(byte[0]) if byte b\n: # 以换行符作为结束标志 break try: return buf.decode(utf-8).strip() except: return None这样就能可靠地读取一行数据了。如果数据是浮点数还需要转换text read_uart(uart) if text: try: value float(text) except ValueError: value 0.05. LCD实时显示实现K210的LCD显示功能很强大配合摄像头可以做很多有趣的应用。先初始化LCD和摄像头import lcd import sensor lcd.init() sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.run(1)显示数据的基本方法是在摄像头画面上叠加文字img sensor.snapshot() img.draw_string(10, 10, Temp: %.1fC % value, color(255,0,0), scale2) lcd.display(img)但直接这样写会发现文字闪烁严重。优化方法是只在数据更新时刷新显示区域last_value None while True: img sensor.snapshot() value get_sensor_value() # 获取传感器值 if value ! last_value: img.draw_rectangle(0, 0, 200, 30, (0,0,0), fillTrue) img.draw_string(10, 10, Temp: %.1fC % value, color(0,255,0), scale2) last_value value lcd.display(img)这样显示就稳定多了。还可以添加更多信息比如时间戳、单位等。6. 多数据协议设计实战实际项目往往需要传输多个数据比如温湿度、气压等。这时候就需要设计简单的通信协议了。STM32端可以这样发送void send_all_data(float temp, float humi, float press) { char buf[64]; sprintf(buf, T%.1fH%.1fP%.1f\r\n, temp, humi, press); HAL_UART_Transmit(huart1, (uint8_t*)buf, strlen(buf), 100); }K210端解析代码def parse_data(text): if not text or len(text) 5: return None data {} parts text.split(\r\n)[0] # 去掉结尾符 i 0 while i len(parts): if parts[i] T: i 1 data[temp] float(parts[i:i4]) i 4 elif parts[i] H: i 1 data[humi] float(parts[i:i4]) i 4 elif parts[i] P: i 1 data[press] float(parts[i:i4]) i 4 else: i 1 return data这种协议虽然简单但很实用。更复杂的可以用JSON格式不过对STM32来说处理起来有点吃力。7. 性能优化与稳定性提升在实际使用中我发现几个可以优化的地方串口读取优化# 不好的写法 data uart.read() # 可能阻塞 # 好的写法 data uart.read(uart.any()) # 只读取当前缓冲区数据显示刷新优化# 只在数据变化时刷新特定区域 if new_value ! old_value: img.draw_rectangle(x, y, w, h, bg_color, fillTrue) img.draw_string(x, y, text, color, scale)错误处理增强try: value float(text) except: value 0.0 uart.write(bERROR\n) # 通知STM32重发添加心跳包检测last_active time.ticks_ms() while True: if uart.any(): process_data() last_active time.ticks_ms() elif time.ticks_diff(time.ticks_ms(), last_active) 5000: show_error(Connection lost!)这些技巧都是我在实际项目中踩坑后总结出来的特别是心跳包机制在长时间运行的项目中特别重要。