前言

工训中心如下说:

不用32是成本考虑,毕竟一届600多人,坚持人人做一板,也坚持7-8年了

害,无所谓了。水就完事了。。。

前置

鉴于某带学信科老师觉得:信科学生默认python的态度,我觉得我还是有必要讲一下py的安装。我写下这篇的时候python都3.10了,那就放python3.10的win安装下载链接吧。

python3.10安装程序

安装界面一打开,第一件事千万记得,把添加到path给勾上(py默认是不添加环境变量的),然后一路next,安装完后直接close就行。

然后打开cmd,输入pip install pyserial安装程序的前置包。然后回到这个实验本身

实验测试

对速通没啥用的前置部分

测试方法如下:

  1. 通过杜邦线将51单片机与RS232/RS485转换器连接,再通过USB转RS232/RS485串口通讯线与PC机连接,下载hex文件,并给单片机上电;

  2. 如果直接用某一台单片机做主机,该单片机需要下载上位机程序中的接点软件而不是下位机软件;

  3. 下位机下载后的初始现象为:最左边两个数码管显示00表示从机编号,最右边3个数码管显示000表示评分;

  4. 按下导航按键中心按钮进入设置模式,将从机编号和评分设置完成后再按一次中心键退出设置模式,再按下KEY1,KEY2,标志设置完成;

  5. 通过控制上位机进行从机检测获取下位机编号,并获取其评分,数据显示上位机的主控制器上,最后结束评分,单片机LED灯熄灭。

同时阅读其上位机和下位机之间通信的数据包如下(注:协议中的检验字节,本打分系统采用累加和编码。):

(1)主机检测从机是否正常相关数据包:(主机与单个从机设备通信)

A. 设备正常检测数据包:

方向:上位机—–>下位机

数据包消息:数据包头+从机地址+检测功能码(Fun_CheckSlave)+自定义内容(Check_Content)+校验字节

功能:查询下位机是否正常。正常,下位机发送回应查询数据包;不正常,则下位机不予回应;数据传输过程发生错误,下位机发送回应错误数据包,上位机可以通过设置多次轮询来重新检测该设备是否正常;

B. 回应查询数据包:

方向:下位机—–>上位机

数据包消息:数据包头+从机地址+检测功能码(Fun_CheckSlave)+自定义内容(接收自主机Check_Content)+校验字节

C. 回应错误数据包:

方向:下位机—–>上位机

数据包消息:数据包头+从机地址+检测功能码(Fun_CheckSlave)+错误码(ErrorInfo)+校验字节

(2)主机获取从机评分相关数据包:(主机与单个从机设备通信)

D. 获取多、单机评分数据包:

方向:上位机—–>下位机

数据包消息:数据包头+检测正常从机地址(0x00)+读下位机功能码(Fun_ReadInfo)+从机地址+校验字节

功能:对检测正常的设备,进行一次轮询,获取评分已经准备好的从机的分数。对于单机直接进行通信,没有轮询。

E. 结果返回数据包:

方向:下位机—–>上位机

数据包消息:数据包头+从机地址+读下位机功能码(Fun_ReadInfo)+从机返回的分数值+校验字节(分数值>100:表示上面提及的未准备好,回应错误数据包

(3)此轮评分结束相关数据包

F. 复位数据包:(主机与所有从机通信)

方向:上位机—–>下位机

数据包消息:数据包头+广播地址+复位功能码(Fun_Reset)+从机返回的分数值(0x00)+校验字节

功能:指示所有正常连接的从机进行复位操作,准备下一轮的评分。

如果你只是要速通的话,前面这些都没啥用,可以掠过。下来看怎么做比较实在:

实在一点的速通操作

  1. 连接好你的主机和从机,然后按装工训的说明设置好从机的编号(小数点位代表你在设置那一位),调好左边的编号和右边的分数后,千万记得用k2和k3按键锁定

  2. 然后呢,在主机连接到电脑上运行咱提供的python程序:

import binascii
import serial.tools.list_ports

# init
plist = list(serial.tools.list_ports.comports()) # 获取端口列表
ser = serial.Serial(list(plist[0])[0], 9600, timeout=0.05) # 导入pyserial模块

def read_times():
while 1:
dic = []
reading = ser.read(5) # 读取串口数据
if reading != b'':
a = str(hex(int(binascii.hexlify(reading), 16)))
b = a.replace("0x", "")
for index in range(0, len(b), 2):
dic.append(b[index] + b[index + 1])
return dic

devices = list(map(int, input("请输入设备下位机,中间以' '隔开:").split())) # 存储设备列表
print(devices)

# part 1: 校验下位机设备
for device in devices:
data = [0x5A, device, 0x08, 0x13]
data.append(sum(data))
print("{}\n从机设备编号: {:2d} 校验信息为: {}\n尝试校验中...".format('-'*50, device, data))
flag = True
for _ in range(100):
ser.write(data)
retdata = read_times()
if retdata:
print(retdata)
retdata = [int(i,16) for i in retdata]
if retdata == data:
print("返回的校验信息为: {},从机正常。".format(retdata))
else:
print("从机传输结果异常")
flag = False
break
if flag:
print("从机无返回")

print('-'*50)
print('从机分数读取:')
for device in devices:
data = [0x5A, 0x00, 0x03, device]
data.append(sum(data))
print("{}\n从机设备编号: {:2d} 发送信息为: {}\n尝试获取分数中...".format('-'*50, device, data))
flag = True
for _ in range(100):
ser.write(data)
retdata = read_times()
if retdata:
print(retdata)
retdata = [int(i,16) for i in retdata]
print(retdata)
if retdata[1] == device and retdata[4] == sum(retdata[:4]):
print("该从机分数为: {},从机正常。".format(retdata[3]))
elif retdata[3] == 0x6F:
print("从机分数大于100,错误")
else:
print("从机传输结果异常")
flag = False
break
if flag:
print("从机无返回")

print('-'*50)
print('从机复位操作:')
data = [0x5A, 0x00, 0x01, 0x00, 0x5B]
ser.write(data)
print("从机已复位,可以开始下一轮评分。")

在cmd中输入py xxx.py(记得先cd

然后输入你板子上你设置的编号,多机运行的话各个机子的编号用空格隔开

然后回车等着就行了(

这里放个我的实验记录

两个从机的编号分别为1719,分数分别设置为2354

正常的运行结果应该是下面这样的:

答疑

  1. 为什么我程序运行完一直在尝试校验中

可能你线没接好吧……

  1. 为什么我获取到的分数是0x6F(即 111 )

有可能板子问题,你可以试着重置一下板子。实在不行换个板子,换板子大概能解决所有问题

  1. 多机怎么搞?

首先你得弄个可以接多个线的东西(找老师要),然后A口全部线接到一起,B口也是,然后再出现上面问题就不用问我啦,一样的