基于485总线的评分系统双机实验报告

这篇具有很好参考价值的文章主要介绍了基于485总线的评分系统双机实验报告。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本来还想着做多机的,但老师已经打分了就算了。为了压缩到6页删减了很多内容,将就看吧

基于485总线的评分系统实验报告

实验目标:

通过本案例加深理解RS485通信方式,实现上位机的主控制器与所有的下位机进行通信。

B级任务

实验要求:

使用两块STC板分别下载上一节所提供的.hex文件,搭建485双机通信电路,在linux中编程实现打分程序代码。

实验资源:Windows10电脑,Ubuntu18.04,单片机,杜邦线

实验步骤:

  1. 阅读程序系统流程框图,明确双机通信的功能需求。

  2. 熟悉上一节中模拟MODBUS协议的数据包结构,相关功能码及附加数据定义

  3. 回顾485总线数据收发实验,搭建双机通信电路。

  4. PC端串口设置如下:串口波特率:9600 数据位:8位 校验位:无 停止位:

5.所编写的PC端程序应参考上一节中的通信协议完成一次完整的评分过程:

  • 需要包含串口的设置

  • 主节点发起从机检测过程:发送指定从机编号正常检测数据包,判断回应查询数据包是否符合上一节中的通信协议。

  • 主机获取从机评分过程:发送指定从机评分相关数据包,判断回应查询数据包是否符合上一节中的通信协议。

  • 主机发起结束评分的过程,若复位成功,STC从机上第1位和第8位LED 灯会熄灭。

  • 展示串口相关信息,展示检测到的从机编号和从机的评分等。

代码设计思路:

1.定义了几个本次实验要用到的函数:

string format(const vector<uchar> &data);		  //数据处理为字符串
int check(serial &pipe, int addr);				 //设备检测
int get_score(serial &pipe, int addr);			  //获取分数
void reset(serial &pipe);				         //从机复位

2.接下来是主函数,首先从单片机读入数据,波特率设为9600(题目已给出)

serial pipe("/dev/ttyUSB0", B9600);

3.接着根据题目的要求根据用户输入来选择想要的功能。第一个是根据单片机的编号查找对应的分数,第二个是将从机复位,第三个是退出程序,通过设置循环来重复用户的选择。具体代码如下:

    while(1){
        cout<<"--------------------基于RS485总线的评分系统-------------------------"<<endl;
        cout<<"输入说明:\n1. 输入合法从机地址查询分数\n2. 输入-2将从机复位\n3. 输入-1退出程序\n请输入指令:";
        cin>>addr;
        if(addr == -1) break;
        if(addr == -2) {
            reset(pipe);
            continue;
        }
        check_ret = check(pipe, addr);
        if(check_ret == 1){
            cout<<"设备检测正常"<<endl;
            sleep(1);
    	    if(!(score = get_score(pipe, addr)))
    	        cout<<"获取分数失败"<<endl;
    	    else 
    	        cout<<"分数:"<<score<<endl;
        }
        else if(check_ret == 0){
            cout<<"地址错误,请输入地址重试"<<endl;
            continue;
        }
	else{
	    cout<<"数据传输错误,请重启从机"<<endl;
	}        

        //reset(pipe);
        cout<<"从机已复位,输入-1退出"<<endl;
    }

可以看到,输入-1时退出循环,然后return 0退出程序。输入-2时调用reset函数使从机复位。输入正确的从机编号后就会输出对应的成绩,主要是通过调用check函数来检测从机编号是否正确,调用get_score来获得成绩,下面具体再分析一下这三个函数的实现思路。

4.reset函数完整代码:

void reset(serial &pipe){
	vector<uchar> code = {0x5a, 0x00, 0x01,0x00,0x5b};
	//cout <<"reset:"<< format(code) << endl;				
	/* 发送数据包 */
	for(int i=0;i<600;i++) {
	    pipe.myWrite(code);
	}
	return;	    
}

参数值是serial串口的数据,根据实验指导可以知道,当主机要发送复位信号给从机时,其序列号应为5a + 广播地址00 + 复位功能码01 + 00 +校验字节,所以实现思路就是定义一个字符串序列号,然后通过主机不断向从机发送数据包,最终实现从机复位。

5.check函数完整代码:

int check(serial &pipe,int addr){
	int check_code = 117 + addr, ret;				//校验码为累加和
	vector<uchar> code = {0x5a, 0x08, 0x13};
	vector<uchar> rec;
	code.insert(code.begin()+1, (uchar)addr);			//插入从机地址
	code.push_back((uchar)check_code);				//插入校验码
	//cout << format(code) << endl;					
	/* 写入并接收回应数据包 */
	pipe.myWrite(code);
	sleep(1);
	rec = pipe.myRead(5);
	if(format(rec) == format(code))				//检验接收数据包是否与发送相同,相同则从机地址正确
	    ret = 1;
	else{
	    if(rec[3] == 0x6f) ret = 0;
	    else ret = -1;
	}
	return ret;	    
}

函数的参数为串口数据和从机地址。主机发送进行数据检测的序列号为5a + 从机地址 + 检测功能码08 + 13 + 校验码 。实现思路就是将数据检测序列号写入,然后根据收到的数据包来判断从机地址是否正确。如果返回1说明地址正确,返回0说明地址错误,返回-1说明数据错误。

6.get_score函数完整代码:

int get_score(serial &pipe, int addr){
	int check_code = 93 + addr, ret;				//校验码为累加和
	vector<uchar> code = {0x5a, 0x00, 0x03};
	vector<uchar> rec;
	code.insert(code.begin()+3, (uchar)addr);			//插入从机地址
	code.push_back((uchar)check_code);				//插入校验码
	//cout << format(data) << endl;					
	/* 写入并接收回应数据包 */
	pipe.myWrite(code);
	sleep(1);
	rec = pipe.myRead(5);
	if(rec[3] == 0x6f) ret = -1;					//检验是否错误
	else {
	    ret = (int)rec[3];						//转为数字
	    if(ret < 0 || ret > 100) ret =-2;				//检测数字是否合法
	}
	return ret;	    
}

函数的参数为串口数据和从机地址。主机发送进行分数获取序列号为5a + 00 + 读取功能码03 + 从机地址 + 校验码 。实现思路和上一个函数一样,将数据检测序列号写入,然后根据收到的数据包来获得分数,同时要对分数的合法性进行判断。如果正确则返回正确分数,返回-1说明从机未准备好,返回-2说明从机错误。

7.format函数完整代码如下:

string format(const vector<uchar> &data) {
    std::string str(2 * data.size() + 1, '\x00');
    for (int i = 0; i < data.size(); i++) {
        sprintf(&str[i * 2], "%02X", data[i]);
    }
    return str;
}

函数的功能主要是将数据处理为字符串,在check函数中使用

验证及结果分析:

这里设置下位机的编号为2号,分数为66分
基于485总线的评分系统双机实验报告

打开程序,运行后输入从机编号2可得成绩,输入-2可复位从机,输入-1可退出程序
基于485总线的评分系统双机实验报告
可以看到,结果正确,当输入正确的从机地址2时,输出了分数66。当输入了-2时,从机就会复位,效果如第一张图所示,单片机上的第一个和第八个灯熄灭。当输入-1时,直接退出程序。文章来源地址https://www.toymoban.com/news/detail-489711.html

实验总结:

  • 人文:认识到交流的重要性。很多不懂的问题通过和同学交流都得到了有效解决。同时遇到问题时可以向老师虚心求问。
  • 知识:掌握了基于485总线的评分系统的工作原理和具体实现。学会了如何获取串口数据,并利用串口数据进行一些判断。还学会了如何使用c++来实现基于485总线的评分系统的双机评分。
  • 技能:能够较快的编写出c++代码,同时对于单片机的使用和串口助手软件的使用更加得心应手,对于单片机的一些按键能够简单使用。

到了这里,关于基于485总线的评分系统双机实验报告的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于微信小程序的产品评分小程序(附开题报告)

    💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。 👇🏻 精彩专栏 推荐订阅👇🏻 计算机毕业设计精品项目案例-200套 🌟 文末获取源码+数据库+文档 🌟 🌟 开题报告在下方 🌟 感兴趣的可以先收藏起来,还有大家在毕设

    2024年02月05日
    浏览(44)
  • 基于springboot的实验室资源预约管理系统 毕业设计开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月05日
    浏览(48)
  • 基于JAVA(Springboot框架)高校实验室管理系统 毕业设计开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月04日
    浏览(56)
  • 基于51的双机通信系统

            最近在做关于双机通信系统的课设,遇到了一些问题,查了好几个小时也没找到原因,郁闷了半天,老师要求主机在发送数据的时候显示数据,从机接受数据并对数据进行处理后显示数据。因为没有要求数据具体是什么,是几位的数据,所以刚开始搭建仿真时使用的

    2024年02月08日
    浏览(37)
  • RS485通信总线详解

    RS-485 是美国电子工业协会(EIA)在 1983 年批准了一个新的平衡传输标准(Balanced Transmission Standard)也称作差分,EIA 刚开始将 RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,将 RS 改为 EIA/TIA,所以目前该标准的名称为 TIA-485,但目前工程师们依旧习

    2024年02月05日
    浏览(46)
  • 【总线】一文看懂RS232和RS485通信总线

    目录   RS232概述 RS232特性 RS485 概述 RS485 特性 RS232 和 RS485 的区别 区别总结   RS-232接口符合电子工业联盟(EIA)建立的串行数据通信接口标准。原始编号是EIA-RS-232(简称232,RS232)。它广泛用于计算机串行接口外设连接。连接电缆以及机械、电气、信号和传输过程。 RS-232-C标

    2024年02月02日
    浏览(52)
  • 计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

        总线是计算机中连接各个功能部件的纽带,是计算机各部件之间进行信息传输的公共通路。 总线不只是一组简单的信号传输线,它还是一组协议。他有两大特征   分时:   同一总线在同一时刻, 只能有一个部件占领总线发送信息 ,其他部件要发送信息得在该 部件发送

    2024年02月01日
    浏览(67)
  • RS485总线的抗干扰处理

    地线隔离:在RS485总线的两端分别使用隔离器对地线进行隔离,以消除地线干扰。 增加线路阻抗:通过在总线两端加入电阻,使总线的阻抗增加,降低信号反射,提高信号质量。 RS485总线通常需要在总线两端(也就是接口处)连接120欧姆的终端电阻。这个终端电阻的作用是抑

    2024年02月06日
    浏览(85)
  • STM32+收发器实现CAN和485总线

    RS485总线是一种常见的(Recommended Standard)串行总线标准(485是它的标识号),采用平衡发送与差分接收的方式,因此具有抑制共模干扰的能力。CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络,属于CSMA(多路载波侦听)/CD(冲突检测

    2024年02月05日
    浏览(52)
  • 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计

    仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0006 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计 结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为: 由51单片机、按键模块、LCD1602液晶屏、蜂鸣器呼叫模块构成 具

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包