openmv向stm32的OLED发送数字时为什么显示a,b
时间: 2024-04-17 12:24:24 浏览: 158
基于 OpenMV 和 STM32 的 循迹小车
当你使用OpenMV向STM32的OLED发送数字时,出现a和b的显示可能是由于你发送的数字是以ASCII字符形式发送的。
在ASCII编码中,数字0-9对应的字符是48-57。当你发送一个数字时,OpenMV会将数字转换为相应的ASCII字符,并将其发送到STM32。当STM32接收到这些ASCII字符时,它会将其解释为字符而不是数字,并在OLED上显示相应的字符。
要解决这个问题,你可以在OpenMV端将数字转换为字符串,并将字符串以字节形式发送到STM32。在STM32端,你需要相应地解析字节数据并将其转换回数字,然后将数字显示在OLED上。
以下是一个示例代码,展示了如何在OpenMV和STM32之间以字节形式发送和接收数字:
在OpenMV的代码中:
```python
import sensor
import image
import time
from pyb import UART
uart = UART(3, 115200) # 选择正确的串口和波特率
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
while(True):
img = sensor.snapshot()
# 在这里进行图像处理和数字计算
# 发送数字到STM32的OLED
number = 123 # 要发送的数字
uart.write(bytes([number])) # 发送数字的字节形式
time.sleep(100)
```
在STM32的代码中:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_usart.h"
#include "ssd1306.h"
void USART3_Init(void) {
// 初始化串口,与之前的代码相同
}
void OLED_Init(void) {
// 初始化OLED,与之前的代码相同
}
void OLED_ShowNumber(int32_t x, int32_t y, int32_t number) {
char buffer[16];
sprintf(buffer, "%ld", number); // 将数字转换为字符串
SSD1306_GotoXY(x, y);
SSD1306_Puts(buffer, &Font_11x18, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
}
int32_t receiveNumber(void) {
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) {}
return (int32_t)USART_ReceiveData(USART3);
}
int main(void) {
USART3_Init();
OLED_Init();
while (1) {
int32_t receivedNumber = receiveNumber();
OLED_ShowNumber(0, 0, receivedNumber);
// 根据需要执行其他操作
}
}
```
在OpenMV的代码中,我们使用`uart.write`函数发送数字的字节形式到STM32。在STM32的代码中,我们使用`sprintf`函数将接收到的数字转换为字符串,并使用`SSD1306_Puts`函数将其显示在OLED上。
请注意,在使用字节形式发送和接收数字时,确保OpenMV和STM32之间的通信设置(如波特率和数据位)相匹配,并确保OLED初始化和驱动程序的正确性。
阅读全文