前言:

1、由于我和我的partner都用的WSL(Windows Subsystem for Linux),对于通信方面有一定的优化,在读取信号方面代码可以做到很简洁。
2、如果代码方面有问题或者想尝试安装一个WSL可以移步我的计算机系统专栏,里面有一篇文章有教学。其实安装挺简单的,半个小时就ok了,比虚拟机好得多。
3、先赞后看,养成习惯。
4、仅供参考,谨慎抄袭

RS485信号的测量

一、实验目的
1、熟练使用Linux下io函数read、write和epoll等
2、熟练RS485串口的信号特点

二、RS485信号介绍





三、实验过程
两个同学一人下载A板文件,一人下载B板文件

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

先将板子连接电脑,第一次我下载B程序,我的partner下载A程序。用示波器与板子标有485位置的两个孔相连,调整示波器参数,使得波形方便看清楚,单次触发,可以计算出A板的波特率。

这里计算出波特率是九千多那个档次(1除以一个稍微比100微秒大一点的数)
然后将示波器与B板相连,通过调节B板的摇杆,使得它与A板有相同的的波特率。
现在准备工作就算做完了,波特率相同就可以通信了。现在最好不要再动板子,以防再出什么问题。

用电脑上之前下载的STC-ISP可以读取A板的序列号:波特率调成用示波器算出来的那个波特率,打开串口助手就可以了。

下载B程序的就要在电脑上写程序来读取密码(注意在com.c里面要改波特率)。


这个代码只能在WSL顺利得到结果,虚拟机上不行。

#include <stdio.h>
#include "com.h"
#include "com.c"
#include <assert.h>int main(void)
{//unsigned char tmp[15] = {0}; //用于存放读取出来的数据的缓冲区int rl; //读取数据的长度(单位:字节)fd = openSerial("/dev/ttyS4"); //打开串口,ttyUSB0是串口文件if(fd < 0){printf("open com fail!\n");return 0;}EpollInit(fd); //初始化终端事件触发函数epoll,设置要监听的事件及相关参数等unsigned char number[14] = {0xAA,0x55,0x02,0x00,0x02,0x00,0x00,0x08,0x00,0x01,0x00,0x03,0x00,0x03};write(fd, number, sizeof(number));unsigned char tmp[19] = {0};unsigned char fill[6] = {0};while(1){int i;//bzero(tmp,sizeof(tmp)); //把tmp对应的内存块的前sizeof(tmp)置零rl = ComRead(tmp,18);//读取18个字节放到缓存assert(rl > 6);//打印读到的数据printf("read_len = %d\n", rl);tmp[rl] = '\0';for(i = 0; i < rl; i++)printf(" %02x", tmp[i]);printf("\n\n");for(i = 0; i < 6; i++){if(i == 0)fill[i] = 0xAA;else if(i == 1)fill[i] = 0x55;elsefill[i] = tmp[(int)tmp[2]-3+i];}for(i = 0; i < 6; i++)printf(" %02x", fill[i]);printf("\n\n");//unsigned char fill[6] = {0xaa, 0x55, 0xe4, 0xc3, 0x11, 0x7a};bzero(tmp, 19);if(write(fd, fill, 6) > 0)printf("Write success\n");bzero(fill, 6);}close(epid);close(fd);return 0;
}


curl “132.232.98.70:6363/check485?id=学号&v=序列号&s=密码”
回应OK表示正确,其它表示错误。例如,序列号是D9 01 49 8A ,学号是202201030303,回应的密码为 01 8A D9 49,那么上报结果命令为:
curl “132.232.98.70:6363/check485?id=202201030303&v=D901498A&s=018AD949”

这样就算成功一次了。再两个人交换一下,下载另一个程序,重复上述步骤就完成了此任务。

RS485总线数据收发

一、实验目的
1、熟练使用Linux下io函数read、write和epoll等
2、熟练处理流式通信数据
3、理解485总线的冲突问题

二、预备知识
RS485总线有两条线信号线,能够传输一个逻辑信号。计算机标准的UART串口有RX、TX收发两条线,因此能够同时进行数据的接收和发送。而RS485只有一个逻辑信号,因此同一时刻只能有一个主体进行数据发送(因此叫做半双工通信串口)。
单片机板上使用了一颗MAX485芯片作为标准UART接口向485接口转换的接口芯片。请同学们学习该芯片介绍和各引脚的功能。
如下图所示,单片机串口数据发送脚与MAX485的DI脚相连接。在发送数据前,单片机会将DE脚置为高电平,此时A、B引脚信号为所发送的单片机串口数据。

如果多个单片机将DE脚置为高电平,则A、B信号线同时被多个单片机板的MAX485芯片驱动,则会造成数据收发错误甚至损坏芯片。因此,多个单片机对485总线操作的时间控制至关重要。

四、实验过程
和上一个任务一样,分A,B两个程序,两个人每个人下一个程序,总共要做两遍,不同之处在于波特率是确定的,不用再拿示波器测量了。

1、下载程序后,A板单片机将使用1200波特率约每300ms发送一次自身序列号,格式为
0xAA 0x55 4字节序列号
还是用电脑上的STC-ISP波特率调为1200打开串口助手来获得序列号
2、通过B板串口向RS485总线写入自己的学号,格式为
0xAA 0x55 十二位学号数字。
例如学号20220110203,应该通过串口发送以下数据
AA 55 02 00 02 02 00 01 01 01 00 02 00 03
3、A板单片机接收到学号后会每300m发送第一串密码,密码长度为4字节。请将解析出该串密码并在150ms内原样发回给串口(否则会造成总线的冲突)。STC单品机收到返回后会继续发送下一串密码,请继续解析出该串密码并在150ms内原样发回给串口。以此往复,将收到的最后一串密码记录下来。
例如,收到以下密码串
AA 55 00 00 00 00 00 C9 34 3F 5D
其中AA 55为前导串,最后4个字节是密码。请将密码原样发回给串口。
AA 55 C9 34 3F 5D
通过写程序来不断获取密码,等到密码一直相同时中断程序,就能向系统发送数据了。


#include <stdio.h>
#include "com.h"
#include "com.c"
#include <assert.h>int main(void)
{//unsigned char tmp[15] = {0}; //用于存放读取出来的数据的缓冲区int rl; //读取数据的长度(单位:字节)fd = openSerial("/dev/ttyS4"); //打开串口,ttyUSB0是串口文件if(fd < 0){printf("open com fail!\n");return 0;}EpollInit(fd); //初始化终端事件触发函数epoll,设置要监听的事件及相关参数等unsigned char number[14] = {0xAA,0x55,0x02,0x00,0x02,0x00,0x00,0x08,0x00,0x01,0x00,0x03,0x00,0x03};write(fd, number, sizeof(number));unsigned char tmp[19] = {0};unsigned char fill[6] = {0};while(1){int i;//bzero(tmp,sizeof(tmp)); //把tmp对应的内存块的前sizeof(tmp)置零rl = ComRead(tmp,18);//读取18个字节放到缓存//打印读到的数据printf("read_len = %d\n", rl);tmp[rl] = '\0';for(i = 0; i < rl; i++)printf(" %02x", tmp[i]);printf("\n\n");/*for(i = tmp[2] - 0x30 + 1; i < tmp[2] - 0x30 + 5; i++)printf(" %02x", tmp[i]);printf("\n\n");
*/    for(i = 0; i < 6; i++){if(i == 0)fill[i] = 0xAA;else if(i == 1)fill[i] = 0x55;elsefill[i] = tmp[rl-6+i];}for(i = 0; i < 6; i++)printf(" %02x", fill[i]);printf("\n\n");//unsigned char fill[6] = {0xaa, 0x55, 0xe4, 0xc3, 0x11, 0x7a};bzero(tmp, 19);if(write(fd, fill, 6) > 0)printf("Write success\n");bzero(fill, 6);}close(epid);close(fd);return 0;
}

4、将学号、序列号、最后一串密码发送到课程后台。上送命令语法为
curl “132.232.98.70:6363/check485Secret?id=学号&v=序列号&s=密码”
例如,序列号是2C9363F5E,学号是202201110203,最后一串密码为51ED8D3A,那么上报结果命令为:
curl “132.232.98.70:6363/check485Secret?id=202201110203&v=2C9363F5E&s=51ED8D3A”

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

湖南大学平台2串口部分第二次实验相关推荐

  1. 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  2. 【正点原子FPGA连载】 第二章 实验平台简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  3. 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. 20145233 20145228《信息安全系统设计基础》第二次实验报告

    20145233 20145228<信息安全系统设计基础>第二次实验报告 实验贡献:江苒 韩昊辰 实验报告贡献:韩昊辰 江苒 实验二要求 Linux使用:先打开桌面 vmware,然后打开 ...

  5. 20155235 信息安全技术概论 第二次实验报告

    20155235 信息安全技术概论 第二次实验报告 实验原理 一.口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测其可能使用某些信息作为密码,例如 ...

  6. 2014522420145238 《信息安全系统设计基础》第二次实验

    20145224&20145238 <信息安全系统设计基础>第二次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  7. 20189200余超 2018-2019-2 移动平台应用开发实践第二周作业

    2018-2019-2 移动平台应用开发实践第二周作业 实验部分,在linux中用git命令将代码传到码云上 成功上传的截图 码云上的截图 遇到如下的问题 解决方法 我发现在进行第一步git clon ...

  8. logisim 快速加法器设计实验报告_基于Logisim平台的《计算机组成原理》实验教学探究...

    邵雄凯 杨习伟 摘要:在分析现有<计算机组成原理>实验教学现状的基础上,针对软件类专业学生硬件基础知识薄弱.一般地方高校硬件设备不足等实际情况,提出基于Logisim平台的<计算机组 ...

  9. 串口使用及测量实验1

    工程文件:https://github.com/A-Y-1/HNU 串口部分的实验和综合实验(RS485总线评分系统)我都是使用c或c++编写,结果不是很好(上课用老师的代码速通了,懒得改,直接一个字 ...

最新文章

  1. python【力扣LeetCode算法题库】365- 水壶问题(裴蜀等式)
  2. win2012每次启动显示服务器管理器,win2012r2服务器管理器打开角色.功能出错
  3. 组合模式_设计模式结构性:组合模式(CompositePattern)
  4. 剑指 Offer 07. 重建二叉树【千字分析,三种方法】
  5. matlab求kcf算法响应图_Kernelized Correlation Filters(KCF)算法
  6. oracle自定义存储过程:删除表(无论表是否存在)和检测表是否存在
  7. JQuery实现ajax跨域
  8. gcc编译器_2020好用的C++编译器有哪些?这几款值得下载
  9. 如何制作一个可控制的人体骨骼模型
  10. Notelife for Mac(笔记管理工具)
  11. 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
  12. java 金融面试题目_面试题 - java金融 - 博客园
  13. 小程序发布上线流程_小程序怎么上线?
  14. 网站优化关键词排名不进不退该怎么办
  15. 最优化理论——(一)绪论1 模型与实例
  16. 手机号,身份证,银行卡号数据脱敏
  17. Lombok @Slf4j 使用和配置
  18. 从 VSCode 看大型 IDE 技术架构
  19. 导电滑环技术标准是什么
  20. 推荐:深入研究ITL阻塞与ITL死锁(转载)

热门文章

  1. 文科河南省单招学计算机专业,文科生选哪个单招学校好河南的
  2. 解决:unable to connect to X server
  3. StataIC——数据描述性统计分析、平稳性检验、平稳化
  4. 陶哲轩实分析-第2章-从头开始:自然数
  5. 世界编程大赛冠军用汇编语言所写的三维程序
  6. 知识人脉和经验究竟哪个是成功路上最重要的元素
  7. QEMU 使用手册(英文)
  8. 在project 2007中实现企业自定义域与视图
  9. 上周热点回顾(9.11-9.17)
  10. 解决云开会难题,英特尔联合腾讯会议打造“会开会”的会议室