【国产RISC-V Linux板 昉·星光VisionFive试用报告】与迪文屏成功通信
[复制链接]
本帖最后由 lugl4313820 于 2022-6-7 20:27 编辑
【目的】为了将昉.星光替换下笔记电脑,将Python 文件移植到febora操作系统中运行
1、修改# -*- coding: utf-8 -*- 为 # -*- coding: gbk -*- 要不遇到中文会报错。
2、将原来操作excel的部份去除。
3、将win下的serial初始化的端口函数:ser, ret = DOpenPort("COMxx",115200,None)修改为 ser, ret = DOpenPort("/dev/ttyS0",115200,None)
程序如下:(后来得出经验,用ttys0行不通,因为传过去的数据,先被终端先截胡了,进不了main函数里,所以后面更改成usb_ttl)。
#!/usr/bin/python
# -*- coding: gbk -*-
import time
import serial #导入模块
import threading
STRGLO="" #读取的数据
BOOL=True #读取标志位
cmd_read_phone = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x60, 0x13])
cmd_read_ID_number = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x20, 0x18])
cmd_write_to_enter_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x03])
send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
all_range = None
# 姓名数据组装
def creat_gbk_list(mydata, my_commad, H_address,L_address):
# 发送的list
send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
send_len = 1 + 2 + 2 + len(mydata)*2
send_list[2] = send_len
# 添加 命令
send_list[3] = my_commad
send_list[4] = H_address
send_list[5] = L_address
mysend_list = bytes(send_list) + mydata.encode("gbk") + b'\xFF\xFF'
print(mysend_list)
DWritePort(ser, mysend_list)
def ReadData(ser):
global all_range
while BOOL:
if ser.in_waiting:
#STRGLO = ser.read(ser.in_waiting).decode("gbk")
STRGLO = ser.read(ser.in_waiting)
# print(STRGLO)
# print("长度为:" + str(len(STRGLO)))
if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
#获取地址
addres = STRGLO[4] << 8 | STRGLO[5]
commd = STRGLO[3]
recv_len = STRGLO[2]
print("地址为:" + hex(addres) + " 长度为:" + str(recv_len) + " 命令为:" + hex(commd))
if recv_len == 0x06 and commd == 0x83:
if addres == 0x1080:
print("按身手机号码查询")
# 读取手机号码数据
DWritePort(ser, cmd_read_phone)
elif addres == 0x1090:
print("按身份证查询")
DWritePort(ser, cmd_read_ID_number)
elif commd == 0x83 and recv_len == 42 and addres == 0x1060:
# print("接收到手机号码")
recv_phone_len = STRGLO[6]
if(recv_phone_len == 0x13):
str_ph = STRGLO[7:18]
phone_code = str_ph.decode()
# 开始查找是否有手机号存在
try:
if xls_phone_code == phone_code:
#获取身份证号码
# 写性别
creat_gbk_list(my_xb, 0x82, 0x11, 0x20)
creat_gbk_list(my_sh, 0x82, 0x10, 0x20)
# 写职业
creat_gbk_list(my_job, 0x82, 0x11, 0x40)
# 写姓名
creat_gbk_list(my_name, 0x82, 0x11, 0x60)
# 写职业
creat_gbk_list(my_job, 0x82, 0x11, 0x40)
# 页面转移到确认页面
# 写姓名
creat_gbk_list(my_name, 0x82, 0x11, 0x60)
DWritePort(ser, cmd_write_to_enter_page)
except Exception as e:
print("出错啦:" + str(e))
else:
print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
# 查找手机号
elif commd == 0x83 and recv_len == 52 and addres == 0x1020:
print("接收到手机号码")
recv_ID_len = STRGLO[6]
if(recv_ID_len == 0x18):
str_ID = STRGLO[7:25]
str_ID = str_ID.decode()
# 开始查找是否有手机号存在
try:
if ID_code == str_ID:
# 写性别
creat_gbk_list(my_xb, 0x82, 0x11, 0x20)
#获取手机号码
creat_gbk_list(my_phone, 0x82, 0x10, 0x60)
# 写职业
creat_gbk_list(my_job, 0x82, 0x11, 0x40)
# 写职业
creat_gbk_list(my_job, 0x82, 0x11, 0x40)
# 写姓名
creat_gbk_list(my_name, 0x82, 0x11, 0x60)
# 页面转移到确认页面
DWritePort(ser, cmd_write_to_enter_page)
except Exception as e:
print("出错啦:" + str(e))
else:
print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
# 查找手机号码
else:
print("非法数据")
#打开串口
# 端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
# 波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
# 超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
def DOpenPort(portx,bps,timeout):
ret=False
try:
# 打开串口,并得到串口对象
ser = serial.Serial(portx, bps, timeout=timeout)
#判断是否打开成功
if(ser.is_open):
ret=True
threading.Thread(target=ReadData, args=(ser,)).start()
except Exception as e:
print("---异常---:", e)
return ser, ret
#关闭串口
def DColsePort(ser):
global BOOL
BOOL=False
ser.close()
#写数据
def DWritePort(ser,text):
result = ser.write(text) # 写数据
return result
#读数据
def DReadPort():
global STRGLO
str=STRGLO
STRGLO="" #清空当次读取
return str
if __name__=="__main__":
ser, ret = DOpenPort("/dev/ttyUSB0",115200,None)
if(ret==True):#判断串口是否成功打开
print("打开串口成功1")
# count=DWritePort(ser,"我是东小东,哈哈")
# print("写入字节数:",count)
#DReadPort() #读串口数据
#DColsePort(ser) #关闭串口
4、将程序上传到星光开发板,然后执行 python main.py,用迪文串口屏发送指令:
【总结】经过初步的修改,可以进行通讯了。下一步,书写与服务器的代码。
与迪文屏通迅
|