5

HNU工训综合项目二:基于485总线的评分系统速通指北

 1 year ago
source link: https://noionion.top/55380.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

HNU工训综合项目二:基于485总线的评分系统速通指北

发表于2022-06-06|更新于2022-06-06|教程
字数总计:1.8k|阅读时长:6分钟|阅读量:82

工训中心如下说:

不用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灯熄灭。

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

20220606153642.png

(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

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

然后回车等着就行了(

这里放个我的实验记录

8188EDB3F41976CEEBA5CCDF2996D086.jpg

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

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

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

可能你线没接好吧……

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

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

  1. 多机怎么搞?

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK