一、实验目的

1、熟练使用Linux下io函数read、write和epoll等

2、熟练RS485串口的信号特点

二、实验过程

1、为自己单片机电路板(后面称为A板)下载新的hex文件。

然后按下K3按键,电路板将通过RS485向外发出一组序列号信息。该信号序列格式为:

0xAA 0x55 4字节序列号

请在板上RS485接口插上杜邦线,然后示波器观察该序列信息的内容和波特率并做好记录。

2、使用同学的STC电路板(后面称为B板),下载B板Hex文件:

B板会将计算机通过USB 串口发送的数据,转发到RS485接口上。同时将RS485接口收到的数据,通过 USB 串口转发到计算机上。我们接下来使用这个B板与自己的A板进行通信,读取A板的密码。

B板每次上下拨动摇杆,其串口和RS485总线上波特率会发生变化,同时会在RS485接口上输出一个 0x55。请插上杜邦线后,使用示波器观察其波特率。

请通过上下拨动B板摇杆调节B板波特率,使之与A板输出的RS485波特率相匹配。

3、使用在计算上的程序,调用write函数接口向串口发送读密码命令。读密码命令格式为:

0xAA 0x55 A板序列号 12字节学号

注意,发送时所使用的波特率应该与A板通信波特率一致。命令通过B板转换为RS485信号发送到A板。

A板会回应密码,回应格式为:

0xAA 0x55 4字节密码

回应密码会经过B板转发到计算机上。请调用read函数接口从串口读取该密码。

#include <stdio.h>#include "com.h"#include "com.c"int main(void){unsigned char tmp[15] = {0}; //用于存放读取出来的数据的缓冲区unsigned char w[18] ={0xAA,0X55,0x20,0x22,0x4B,0xE5,0x02,0x00,0x02,0x00,0x02,0x06,0x00,0x01,0x00,0x05,0x01,0x06};int rl; //读取数据的长度(单位:字节)int i;fd = openSerial("/dev/ttyUSB0"); //打开串口,ttyUSB0是串口文件if(fd < 0){printf("open com fail!\n");return 0;}EpollInit(fd); //初始化终端事件触发函数epoll,设置要监听的事件及相关参数等write(fd,w,18);while(1){bzero(tmp,sizeof(tmp)); //把tmp对应的内存块的前sizeof(tmp)个字节置零rl = ComRead(tmp,13);//读取13个字节放到缓存//打印读到的数据printf("read_len = %d\n", rl);tmp[rl] = '\0';for(i = 0; i < rl; i++)printf(" z %02x", tmp[i]);printf("\n\n");}close(epid);close(fd);return 0;}

4、请将A板序列号、学号和密码通过curl命令发送到课程后台系统。

上送命令语法为

curl "132.232.98.70:6363/check485?id=学号&v=序列号&s=密码"

回应OK表示正确,其它表示错误。例如,序列号是20 22 4B E5 ,学号是202026010516,回应的密码

为 2B EC 20 4B,那么上报结果命令为:

RS485总线数据收发

一、实验目的

1、熟练使用Linux下io函数read、write和epoll等

2、熟练处理流式通信数据

3、理解485总线的冲突问题

二、实验过程

1、向A单片机板下载下面的程序

向B单片机板下载下面的程序

下载程序后,A板单片机将使用1200波特率约每300ms发送一次自身序列号,格式为

0xAA 0x55 4字节序列号

2、通过B板串口向RS485总线写入自己的学号,格式为

0xAA 0x55 十二位学号数字。

例如学号202026010516,应该通过串口发送以下数据

AA 55 02 00 02 00 02 06 00 01 00 05 01 06

3、A板单片机接收到学号后会每300m发送第一串密码,密码长度为4字节。请将解析出该串密码并在

150ms内原样发回给串口(否则会造成总线的冲突)。STC单品机收到返回后会继续发送下一串密码,

请继续解析出该串密码并在150ms内原样发回给串口。以此往复,将收到的最后一串密码记录下来。

import serialimport requestsimport serial.tools.list_ports# 字节转字符串def b2s(data):return ''.join([f'{ch:0>2x}' for ch in data]).upper()# 连接设备ser = serial.Serial(list(serial.tools.list_ports.comports()[0])[0], 1200)# 判断是否连接到设备assert(ser != None)# 输入学号studentID = input("学号:")# 判断学号是否正确assert(studentID.isdigit() and len(studentID) == 12)# 读入序列号number = b2s(ser.read(6))# 断言魔数为AA55assert(number[:4] == "AA55")# 取出序列号number = number[4:]# 判断序列号长度是否正确assert(len(number) == 4 * 2)print(f'序列号:{number}')# 使用学号构造即将发送的字节数据startData = b'\xaa\x55' + bytes([ord(ch) - ord('0') for ch in studentID])# 写入数据ser.write(startData)password = b'' # 读到的密码i = 1 # 记录循环次数# 开启永真循环,直到Ctrl+C被按下try:while True:data = ser.read_all()sdata = b2s(data)if data != b'' and sdata[:4] == "AA55":password = data[-4:]if len(password) == 4:print(f'[{i}]密码:{b2s(password)}')# 使用这次读到的密码构造数据,发送给设备以读取下一次的密码ser.write(b'\xaa\x55' + password)i += 1# 当Ctr+C被按下时执行,建议在读到的密码不再变化时按下,大概在256次循环之后except KeyboardInterrupt:print(f'[结束]最后一串密码为:{b2s(password)}')print(f'[正在提交]http://132.232.98.70:6363/checkSecret?id={studentID}&v={number}&s={b2s(password)}')# 提交实验结果至服务器r = requests.get(f"http://132.232.98.70:6363/checkSecret?id={studentID}&v={number}&s={b2s(password)}")# 判断提交是否成功assert(r.status_code == 200 and r.text.isdigit())print(f'[提交成功]学号:{studentID} 密码循环次数:{r.text}')

序列号是0822990F,最后一串密码为0023980F4、将学号、序列号、最后一串密码发送到课程后台。上送命令语法为

curl "132.232.98.70:6363/check485Secret?id=学号&v=序列号&s=密码"

例如,序列号是0822990F,学号是[202026010516],最后一串密码为0023980F,那么上报结果命令 为:

curl "132.232.98.70:6363/check485Secret?id=202026010516&v=0822990F&s=0023980F"

后台返回的数字表示该密码的编号,返回DUP表示该序列号已经被其它同学使用,请更换电路板重新取得密码。

RS485总线有两条线信号线,能够传输一个逻辑信号。计算机标准的UART串口有RX、TX收发两条线, 因此能够同时进行数据的接收和发送。而RS485只有一个逻辑信号,因此同一时刻只能有一个主体进行 数据发送(因此叫做半双工通信串口)。

实验体会

通过这两个实验,我们了解了如何进行RS485信号的测量和RS485总线数据收发。明白波特率可以通过串口得到,也可以通过示波器得到,和上次实验一样,需要使用Linux下io函数read、write函数,对这些函数我们增加了理解

RS485信号的测量相关推荐

  1. CAN总线数据转成多路RS485信号方式,竣达技术来给您解析

    CAN-RS485多通道智能接口转换板将CAN-BUS总线的数据,转换成4路RS485信号,并以RJ45接口的形式对外提供,每个RJ45接口除了保护RS485信号外,还提供了独立的隔离电源.DI和DO ...

  2. 噪音曲线图测试软件,利用示波器统计工具分析有噪声信号之测量统计和余晖图...

    利用示波器统计工具分析有噪声信号之测量统计和余晖图 2019-09-24 数字示波提供了多种基于统计的工具,除了前文提到的平均和直方图之外,测量参数统计和余晖图,也是非常有用的工具,协助快速获取有用信 ...

  3. REW声学测试(六):信号与测量

    前言 为了理解可以使用REW进行的测量,对了解测量原理是有帮助的.本主题概述了信号和测量的基础知识,并解释了如何生成REW中的各种图形,以及它们如何与我们所测量的内容相关. 1. 信号.采样率和分辨率 ...

  4. 走进“开源SDR实验室” 一起玩转GNU Radio:信号功率测量

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 温馨提示:"开源SDR实验室"是北京的. 本文介绍GNU Radio中的信号功率测量相关模块. 在开始介绍之前,首先推荐 ...

  5. SaleaeLogic 16 逻辑分析仪的安装及使用【对 I2C、SPI、串口的信号进行测量】

    文章内容: 安装 SaleaeLogic 16 逻辑分析仪 用示波器和逻辑分析仪对 I2C.SPI.串口的信号进行测量,深入了解这些协议原理:并对照前两篇文章:[STM32 基于 I2C 通信协议的温 ...

  6. 信号归一化功率_选择用于 850 nm 信号功率测量的检测器

    用于测试光纤元器件的光功率计使用半导体光电二极管作为检测器来产生与入射光功率成正比的电流.它们通常采用跨阻放大器和模数转换器对这个光电流进行测量,以确定其功率.这需要从 mA 电流到 mW 功率的转换 ...

  7. 700m信号测试软件,5G(NR)中同步信号的测量(SS-RSRP)

    同步信号SS-RSRP (Synchronization Signal Reference Signal Received Power) 是同步信号在每个RE的平均功率,其测量在SMTC中的窗时段进行 ...

  8. RS232/RS485信号转12路模拟信号 隔离D/A转换器WJ34

    产品特点: ●  RS-485/232接口,隔离转换成12路标准模拟信号输出 ● 可选型输出4-20mA或0-10V控制其他设备 ● 模拟信号输出精度优于 0.2% ● 可以程控校准模块输出精度 ● ...

  9. RS232/RS485信号转8路模拟信号 隔离D/A转换器WJ33

    产品特点: ● 低成本.小体积模块化设计 ●  RS-485/232接口,隔离转换成8路标准模拟信号输出 ● 模拟信号输出精度优于 0.2% ● 可以程控校准模块输出精度 ● 信号输出 / 通讯接口之 ...

最新文章

  1. 利用kickstart实现pxe自动安装linux
  2. 不可错过! CMU《高级自然语言处理》
  3. Python DB-API 2.0规范
  4. 图数据库Neo4j简介
  5. TopHQBooks – PDF 搜索引擎 - 小众软件
  6. Android Context Hook
  7. 判断三角形java代码_java基础编程题之异常处理
  8. MFC中添加的ID资源号提示找不到声名问题
  9. Python学习笔记----基础篇10----模块2
  10. 请键入 net helpmsg 3534 以获得更多的帮助。_身边有人得了抑郁症,可以做点什么帮助Ta?| 心理小课...
  11. 0831 - 每晚放松一刻
  12. [恢]hdu 2042
  13. 为什么像王者荣耀这样的游戏Server不愿意使用微服务??
  14. Xiaojie雷达之路---TI实战笔记---OSAL详解
  15. 极验打码平台官网地址
  16. 【Multisim仿真】用555定时器+CD4017实现流水灯
  17. 域名该怎样选_怎样选择域名?
  18. OpenCV色域转换
  19. BUUCTF Pwn warmup
  20. 【唐老狮】C#——转义字符

热门文章

  1. 【源码】感应电动机直接转矩控制DTC仿真
  2. golang常用库之-uuid相关库(satori/go.uuid、google/uuid)
  3. Element UI 中文英文混合字符长度校验
  4. KeyboardEvent.metaKey 苹果电脑command键按下、win键按下
  5. 全网最全Fiddler抓包教程,超过十万人学习此教程!
  6. 香港将发展中央儿童数据资料库 研究整合各部门数据
  7. rstudio安装后如何打开_Rstudio安装及安装问题总结
  8. Linux Command snap 包管理
  9. xposed下载出错 http://dl.xposed.info/repo
  10. 寄我的第一台笔记本电脑