Open mv串口通信

210 阅读4分钟
  • 串口初始化

    #UART 3 RX -> P5 #UART 3 TX -> P4 "------------------------------------uart_setting--------------------------------------" uart = UART(3,115200) #定义串口3变量uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters

  • 串口发送函数为:uart.write(data) date 为字符串

  •  串口接收函数为:uart.any(): #进行串口数据的接收 res=uart.read(1) #表示为读取一个字节收到的数据

  • 串口屏通信的规则发送的规则
    与串口工具联调 — 淘晶驰资料中心 1.0.1 文档 (tjc1688.com) 

   “0xff 0xff 0xff”为结束标识符所以用一个sending_over()函数来发送结束标志位

"------------------------------------sending_over--------------------------------------"def sending_over():    global uart;    data = ustruct.pack("<bbb",                   0xff,                   0xff,                   0xff)    uart.write(data);   #必须要传入一字节的数组,这个函数似乎不能发送单个字节,必须得一次发送多个字节

ustruct.pack 的用法

因为open mv 是python 语言 串口屏是C语言两者的数据类型所占大小不同,需要通过编码,来统一数据类型。参考:(7条消息) struct.pack用法_幽默的荆轲君的博客-CSDN博客_struct.pack

简单来说就是把python的数据类型重新编码转化成C语言的规则,打包起来发送出去。这样串口屏才能有效的接收到open mv 发送过来的数据

  • open mv接收数据规则

同样当串口接受到串口屏发送的数据的时候,也需要解码,把C格式的数据类型转化成python的格式,才能使用:

 if uart.any():         #进行串口数据的接收
        res=uart.read(1)   #表示为读取一字节数据,这里的uart必须是例化的        res = struct.unpack('b', res)        res = hex(res)        res = int(res)
res就为串口屏发送过来的数据
  • 定时器的使用

    "------------------------------------Timer_setting--------------------------------------" 定时器的初始化 Tig=0tim = pyb.Timer(4, freq=1) # 使用定时器4创建一个定时器对象-以1Hz触发tim.callback(tick) # 将回调设置为tick函数

    自定义回调函数,每1s就进入一次回调函数

    def tick(timer): # 当被调用时,我们会收到定时器对象 global Tig,flag Tig=Tig+1 #Tig 每一秒加1 print(Tig) print(flag)

  • 以路线1为例

    if Tig==10: task1_port_chose() task1() Tig=0 10s刷新一次时间,然后Tig清零

路线1变量定义

INTERVAL_TIME1 = 3 * 60    

#开一站的时间:设定一站行驶3分钟
TOTAL_TIME1 = 10 * INTERVAL_TIME1 #开完所有站的时间:总共有10站
cur_time1 =  10 * INTERVAL_TIME1#当前行驶了多长时间
cur_station_time1 = 0#到本站需要的时间
next_station_time1 = 0

#到下一站需要的时间

路线1算法解析

def task1():
    global cur_time1
    temp_time = cur_time1    temp_time %= INTERVAL_TIME1#取模
#计算车距离开出上一个站台过去了多久
    next_station_time1 = INTERVAL_TIME1 - temp_time
#两个站台的间隔时间减去车距离开出上一个站台过去了多久#计算车到下一个站台需要多久
    cur_station_time1 = TOTAL_TIME1 - cur_time1#车开完所有站台的时间减去当前消耗的时间计算出到本站需要的时间
    cur_time1 += 10    cur_time1 %= TOTAL_TIME1    ans1="x1.val=%d" % (cur_station_time1 *100/ 60)# ans1为到本站需要的时间
    print(ans1)    uart.write(ans1)# 发送ans1 给串口屏
    sending_over()    ans2="x2.val=%d" % (next_station_time1*100 / 60)# ans2为到下一站需要的时间    print(ans2)    uart.write(ans2)
# 发送ans1 给串口屏
   sending_over()
#发送结束标识符
  • 公交车标志每到一站就移位

"------------------------------------task1_port_chose--------------------------------------"
def task1_port_chose():    global Min1,Sec1,port1#Min 为当前用的时间
#port为当前在第几站
    Sec1=Sec1+10    if Sec1==60:        Min1=Min1+1        Sec1=0    if Min1==3:        port1=port1+1#因为一站为3分钟,每到一次3分钟port就加一,意味着又过了一站
        Min1=0    str="p0.x=%d" % (port1*48-48+4)#因为每过一站车的图标就要移动
#str 为计算出车图片的坐标位置
    print(str)    uart.write(str)#把计算出的车的坐标位置发给串口屏
#车的位置就会移动    sending_over()    if port1==9:        port1=1
  • 路线的选择

当按下串口屏的按键的时候会发送“7” “8” “9”给open mv

路线1代表7

路线2代表8

路线3代表9

根据收到的flag来选择路线

#********************************路线选择******************************************
    if flag==7:
        led1.on()
        if Tig==10:
            task1_port_chose()#小车的图标跟随站点移位的函数
            task1()#计算两个时间的函数
            Tig=0    elif flag==8:        led2.on()        if Tig==10:            task2_port_chose()            task2()            Tig=0    elif flag==9:        led3.on()        if Tig==10:            task3_port_chose()            task3()            Tig=0