[ ST NUCLEO-U575ZI-Q 测评] 串口中断不定长接收 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)
[ ST NUCLEO-U575ZI-Q 测评] 优化OLED显示 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)
前面优化了OLED、串口接收,现在结合在一起做一个监控显示器:
流程图大致如下:
python程序:
import time
import cv2
from PIL import Image
import serial
import binascii
ser = serial.Serial()
def port_open():
ser.port = 'COM16' # 设置端口号
ser.baudrate = 230400 # 设置波特率 115200
ser.bytesize = 8 # 设置数据位
ser.stopbits = 1 # 设置停止位
ser.parity = "N" # 设置校验位
ser.open() # 打开串口,要找到对的串口号才会成功
if (ser.isOpen()):
print("打开成功")
else:
print("打开失败")
def port_close():
ser.close()
if (ser.isOpen()):
print("关闭失败")
else:
print("关闭成功")
def send(send_data):
if (ser.isOpen()):
ser.write(send_data.encode('utf-8')) # utf-8 编码发送
# ser.write(binascii.a2b_hex(send_data)) #Hex发送
print("发送成功", send_data)
# 引入库
cap = cv2.VideoCapture(0)
port_open()
while True:
ret, frame = cap.read()
im2 = cv2.resize(frame, (128, 64), ) # 为图片重新指定尺寸
im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # 先要转换为灰度图片
ret, im2 = cv2.threshold(im2, 130, 255, cv2.THRESH_BINARY) # 这里的第二个参数要调,是阈值!!
cv2.imwrite('33.png', im2) # 存成一张图片!!!
im = Image.open('33.png') # 打开对应图片
#print(im.format, im.size)
#print(im.size[0],im.size[1])
a = "" # 用于保存二进制数,以便于转化为16进制
dat = 0 # 计算a中保存的二进制位数
hex16 = 0 # 计算每行输出的16进制个数
pixel = im.load()
s = 0 # 从第s行开始执行
high = 64
wide = 128
txt_h = []
########参考BMP图转化为16进制的方式,此为行列式逆向
txt_h.append(0xAA)
txt_h.append(0x55)
for z in range(high // 8): # 每八行执行一循环
for x in range(wide): # 图片宽度
for y in reversed(range(8)): # 每八个二进制位转化为一个16进制数
if pixel[x, y + s] == 255:
a = a + "0"
dat = dat + 1
else:
a = a + "1"
dat = dat + 1
if (dat == 8):
# txt_h.append(hex(int(a, 2)))
txt_h.append(int(a, 2))
a = ""
dat = 0
s = s + 8
txt_h.append(0xBB)
print("txt_h:" + str(txt_h))
data = bytes(txt_h)
ser.write(data)
time.sleep(0.01)
cv2.imshow("Video", im2)
# 读取内容
if cv2.waitKey(10) == ord("q"):
break
# 随时准备按q退出
cap.release()
cv2.destroyAllWindows()
# 停止调用,关闭窗口
在原来OLED、串口的基础上在main函数加入数据处理以及图片显示:
if(rxtx_it_usart.rx_flage == 1)
{
rxtx_it_usart.rx_flage = 0;
//判断数据帧是否对;
if(rxtx_it_usart.rx_buf[0] == 0xAA && rxtx_it_usart.rx_buf[1] == 0x55 && rxtx_it_usart.rx_buf[1026] ==0xBB)
{
OLED_ShowPicture(0,0,128,64,&rxtx_it_usart.rx_buf[3],0);
OLED_Refresh();
}
//重新开始接收20个字节数据
memset(rxtx_it_usart.rx_buf,0,sizeof(rxtx_it_usart.rx_buf));
HAL_UART_Receive_IT(rxtx_it_usart.huart,rxtx_it_usart.rx_buf,RXBUFFSIZE);
}
实验效果:
OLED监控显示