大哥,相问一下这个程序里面的RxdBuf里面的值是怎么来的?

作者&投稿:张饱 (若有异议请与网页底部的电邮联系)
上位机与下位机通讯方式的比较~

这要看哪种单片机,常用的是串口远距离是rs485,有一些高档的单片机也用CAN总线通信,这种方式汽车上常用。

http://www.ca800.com/apply/html/2007-12-7/n25043.html

上位机与下位机通信的设计初步

1 引言

现代化集中管理需要对现场数据进行统计、分析、制表、打印、绘图、报警等,同时,又要求对现场装置进行实时控制,完成各种规定操作,达到集中管理的目的。加之单片机的计算能力有限,难以进行复杂的数据处理。因此在功能比较复杂的控制系统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。

2 PC机与单片机8051之间的通信特点

在工业控制系统中,各种数据的采集和执行机构的控制都是由下位机或探测站来完成。由于单片机具有体积小、价格低廉、可应用于恶劣工业环境的特点,在分布式控制系统中大多采用单片机作为下位机来进行数据采集和现场控制。在这些应用中,单片机只是直接面向被控对象底层。而对采集到的数据进行进一步分析和处理的工作是由功能强大的主控PC机来完成的。因此,PC机和单片机之间就有着大量的数据交换。

3 PC机与单片机8051通信的硬件设计

通常PC机和单片机之间的通信是通过串行总线RS-232实现的。因此采用一种以MAX232为核心的通信接口电路。该接口电路适用于由一台PC机与多个8051单片机串行通信的设计,其原理和方法同样适用于PC机与其它单片机之间的串行数据通信。其原理框图见图1:


图1 单片机与PC机通信原理框图


该框图中,起着重要作用的是RS-232C通信接口电路。它是上位机和下位机之间信息传递的枢纽,一切数据的传输必需由它完成,上位机直接利用它的RS-232串行口,为此,采用了RS-232串行通信来接收或上传数据和指令。但RS-232信号的电平和单片机串口信号的电平不一致,必须进行二者之间的电平转换。在此电路中,采用MAX232实现TTL逻辑电平和RS-232电平之间的相互转换。 MAX232由单一的+5V电源供电,只需配接5个高精度10μF/50V的钽电容即可完成电平转换。因此,避免了用1488和1489时必需两路电源的麻烦。转换后的串行信号TXD、RXD直接与PC机的串行口连接。如此设计,既可发挥出PC机强大的计算和显示功能,又可以体现出单片机灵活的控制功能,有利于对现场信号的实时采集、处理和监控。

3.1 8051与PC机之间的通信协议
在许多场合的测控系统中,约定PC机和8051单片机的通信协议为:
Number+Command+Length+Data+Check
Number:下位机的机号,若设计中有3台下位机,即Number 取01H,02H,03H,分别代表:#1,#2,#3号下位机;
Command:本次命令的代码;Length:本次发送数据段的字节数;
Data:要发送的数据段;
Check:1字节的校验码。
本设计只考虑一个8051单片机,故可对上述通信协议进行简化。

3.2 8051和PC机之间通信的软件设计
VB提供了串行端口控件Mscomm方便应用程序实现串行通讯,该控件屏蔽了通信过程中的底层操作,程序员应用时只需设置、监视Mscomm控件的属性和事件即可完成对串行口的初始化和数据的输入、输出工作。汇编语言是一种执行效率高、可读性强的语言。为实现通讯正常,PC机与单片机约定如下:
波特率:2400bps;
信息格式:1个起始位,8位数据位,1个停止位,无奇偶校验位;
串行口操作模式:标准异步串行通信,串行口模式1;
传送方式:PC机采用查询方式接收数据,8051单片机采用中断方式接收信息。
(1) 总体功能设计
通过综合分析,本系统至少应具备如下功能:
PC机与单片机8051都可发送和接收数据,进行可以异步串行通信;
PC机键盘输入发送给单片机8051,单片机接收PC机发来的数据并送LED显示;
单片机8051键盘的每次输入以BCD码送给单片机的LED显示,单片机发送的数据由四次按键的BCD码组成,发送时作为一个队列发送,PC机接收单片机发送来的数据并送窗口显示;
上位机程序即PC端程序采用VB6.0制作,人机界面友好,界面简洁,功能完善,下位机程序即单片机端采用汇编语言进行开发。
系统功能模块图见图2和图3。


图2 上位机模块

图3 下位机模块


(2) 通讯流程图
主程序
实现下位机即单片机8051系统的初始化,8255初始化,设置单片机串行口控制寄存器SCON,电源控制寄存器PCON,定时器T1初始化,开中断。
系统不停的对键盘和RxD线进行监测,当通过扫描发现有按键输入时,经过按键处理后就启动该模块向上位机PC端发送所检测到的键码;当单片机8051监测到RxD线上有数据到时就启动该子程序对PC发来的数据进行接收,同时经过BCD转换送单片机系统的LED进行显示以方便和PC机发送的数据进行比较,以确认通信是否正确。流程图见图4。


图4 主程序流程图

图5 数据队列发送流程图


数据队列发送子程序
当单片机8051键盘已有4次输入时,就启动该模块向上位机PC端发送所检测到的键码。流程图见图5。
键码发送子程序
当单片机8051检测到键盘有输入时,就通过按键处理启动该模块向上位机PC端发送所检测到的键码。流程图见图6。


图6 键码发送流程图

图7 数据接收流程图

图8 BCD转换流程图


数据接收子程序
当8051监测到RxD线有数据到时就启动子程序对PC发来的数据进行接收。流程图见图7。
BCD码转换子程序
该程序通过把#DATABUF中的十进制数值除以100(64H),得到的商就是百位数的BCD码,然后把余数除以10(0AH)便可以得到十位和个位的BCD码,从而得到相应的三位BCD码。在该子程序中进行双字节无符号二进制数的除法时要用到前面介绍的多字节无符号二进制数的除法算法,由于原理相似,在此不再重述。流程图见图8。在此程序中因原来的接收数据存在于#DATABUF附近,为防止发生信息覆盖故使用了暂存单元来暂时寄存除法计算的中间值。
LED显示子程序
该子程序实现对接收数据进行BCD码转换并输出到LED,采用动态显示的方式进行显示。流程图见图9:


图9 LED显示流程图


4 结束语

上位机与下位机通讯是一个应用性广,适用性强的基础设计,可以应用在变频器上。要真正做好一个具有良好人机界面及交互性,使上位机和下位机能正常高效的通讯,需要设计人员具有很强的VB和单片机汇编语言的驾驭能力。同时,需要相当程度的设计经验,这样才能对设计中出现的问题采取行之有效的解方案。本文的研究对以后进一步深入奠定了基础。

参考文献

[1> 杨恢先,黄辉先. 单片机原理及应用. 长沙:国防科技大学出版社,2003.
[2> 白 鹏,莫卫东等. VB6.0高级编程技巧. 西安:西安交通大学出版社,2002.

作者简介

朱建林(1943-) 男 教授/博士生导师 研究方向为交流调速系统与电力电子技术,计算机控制技术。
郭有贵(1968-) 男 博士生 研究方向为交流调速系统与电力电子装置,计算机控制技术。

① 你要搞明白UART传输的顺序,都是LSB(最低位)先传输的。举例来说你接受完起始位之后,再收到的第一个位就是Bit0,所以要先放在接收缓冲的最高位,收到下一个位再右移。最好拿纸拿笔画一下,就能想清楚了。
② if(PIN_RXD),就是判断接收脚上的电平。如果为高电平,表明UART发过来的这个位是一个“1”;如果为低电平,表明UART发过来的这个位是一个“0”。前面①已经说了,新收到的位都是最高位,所以要对最高位进行处理(收到“1”的时候就或上0x80,也就是1000 0000b)。
③ RxdBuf加1比较无厘头。你可以前后翻翻,看看这个程序到底要实现什么功能。(比如说,这个实验程序本来就是要让你收一个数然后加1回发回去的)
最后忍不住要说一点:图片中展现出的文字描述部分和程序部分,水平真的好差……这种书籍你只能祈祷不要有太多错误就好了……

这是个软仿UART的程序,通过定时器来按时序采集P3.0管脚上的电平变化(串行信号),并将其按照UART规格组装成接收到的帧。


C语言简单程序不懂,请各位老大解释一下!
所以最后输出结果为:-1→65535 printf("%d→%u\\n",b,a);因为b=a,而a=65534u,当我们用二进制表示时可以发现最高位为1,说明此数为负数,表示为:1111 1111 1111 1110此时为补码,反码=补码-1,为:1111 1111 1111 1101,再把反码变成原码(符号位不变)为:1000 0000 0000 0010,这个二进制数...

朋友们,哥哥们,师傅们,在这里我想问的是,学习c语言的正确方法以及在学习...
看啥书?去看视频,职高没啥前途,但是flash和vb也要学精通了,对学c有一点好处。正确的顺序就是,视频-书籍 视频是指c的入门,至于书籍是用于提高的,比如你指针不动,视频可能看不明白,但是看书一下就懂了,理论部分完败视频 视频的好处是他实践了就等于你实践了,实践完败书籍 职高可以带手机,在...

大哥大姐们,偶想问一下,对于计算机考试是怎么规定的??
为了适应科技的发展和社会需求的变化,适应知识经济和信息产业发展的要求,教育部考试中心于1994年开始推行全国计算机等级考试,1998年适时地制订了新的考试大纲,为适应我国计算机技术的快速发展,2001年相继对一、二、三级考试科目设置进行了调整,对部分考试科目的内容作了更新,对上机考试软件进行了改进,对考试管理的手段也...

想问一下这个图片的电视剧电影名字是什么
出自影片《东北往事之黑道风云20年》,这是主人公之一刘海柱。http:\/\/baike.baidu.com\/view\/6647288.htm

各位哥哥姐姐们,我想问一下,绿源电动车好不好?立马电动车好不好?_百...
我认为吧,如果你要买点动车,说真的,只要看电机和电瓶就可以了,通常64v的电动车骑行里程要长一点,就是可以不用总充电,你说的这个绿源的MKD-20TY,我知道的,总的来说没有什么问题。基本上属于基本款。立马的电动车是简易款的,就是电动自行车那样的好点。但是买豪华款还是绿源的好点。我个人...

春节七天假期,想去新疆玩,不是自驾,坐火车,感谢大哥大姐推荐一下...
春节七天假期,想去新疆玩,不是自驾,坐火车,感谢大哥大姐推荐一下路线?很高兴回答你的问题,我是爱旅游的老纪,正好这个路线老纪熟悉,给你点拙见。希望能帮到你。老纪想说春节7天玩新疆时间段,还是有点紧凑,不过时间规划到位,欣赏到美景还是很值得。行程老纪尽量给你写的详细一点,然后参考老纪路线自己量身在决定,...

我想问一下我哥哥得了癌症晚期他的女儿完全放弃不管他了我把他接回来...
如果你哥哥生前立有遗嘱 你就可以分得他的财产 。否则应该有他女儿继承遗产 ,如果他女儿放弃, 你可以继承 。虽然最后这一切都是由你去做的 ,但你却没有继承的权利 。

我是学网络工程专业的 我想问一下 如果我把这些课本学好 可以有所成就...
2、选择就业:看你的方向:网络方向和程序设计方向 重点学好c语言、数据结构、数据库、程序设计、操作系统,建议你打算就业的话,就在上学期间找个单位兼职工作,这几门课程一定要强,不光是书本,重点是能力。你可以看看招聘网站上相关程序员的岗位都是什么要求,然后选定方向好好学习。最重要的,大学的...

...哪位大哥大姐能帮我解决解决,希望能详细讲一下!
(1)方程组中的两个方程,如果同一个未知数的系数既不互为相反数又不相等,就可用适当的数去乘一 个方程或两个方程的两边,使两个方程中的某一个未知数的系数互为相反数或相等; (2)把两个方程的两边分别相加减(相同时相减,相反时相加),消去一个未知数,得到一个一元一次方 程; (3)解这个一元一次方程,求得...

...一点的大哥大姐从事游戏编程开发的,小弟想问一下学2D开发好还是3D...
那肯定是三维的技术含量更高,学成之后更吃香

且末县17683888693: 51单片机串口通信,刚开始电路完好,一段时间rxd开路,sbuf是不是一直是开路前的发送的那个数据?? -
门秀盐酸: sbuf是不是一直是开路前的发送的那个数据,这与RXD开路无关,是由程序决定的,程序要发送,SUBF才发送的,并不受RXD影响.你想问什么问题,不会就是这个问题.

且末县17683888693: 为什么汇编程序定义不了RXD/TXD? -
门秀盐酸: TXD和RXD都是编译器的关键字,不能被用户定义.

且末县17683888693: 哪位大侠帮我看下这个程序!我这个程序要求52单片机的P1^0口输出大小不同的脉冲! -
门秀盐酸: count=table[i]; th=(65536-count)/256; tl=(65536-count)%256; TH0=th; TL0=tl; TR0=1; while(P3!=0xf0); delay...

且末县17683888693: 汇编语言rxd与txd接口可以用于定时吗 -
门秀盐酸: 是问51单片机的引脚RXD,TXD吗?这两个引脚是串行通信的,与定时无关.要定时,可用内部定时器T0,T1,而且也不需要外部引脚的.这与什么语言写程序没有一点关系.

且末县17683888693: 如图7.2,问,是否可以将ch430t的RXD,TXD输出直接连在单片机相应的管脚上作烧写程序用?? -
门秀盐酸: 不可以的,虽然我没用过340,不过从你提供的电路上,可以看出,CH340的TXD和RXD输出的电平是RS232电平,即以 3---15V表示逻辑0,以-3---(-15)表示逻辑1,如果你直接接到单片机的引脚,一是单片机有可能会烧坏,二是单片机识别的是个错误的,所以必须要经过232转换成TTL电平.

且末县17683888693: CNCP30数控车床程序,麻烦哪位大哥帮忙解释一下下面一句程序中G92和R指令的意思 -
门秀盐酸: R表示该螺纹是锥螺纹,切削起点与切削终点X轴绝对坐标的差值(半径值),当R与U的符号不一致时,要求∣R│≤│U/2│

且末县17683888693: C语言:求程序中的一些元素 -
门秀盐酸: i=1时,b=a+1 b就好比这样一个数组:10 12 14 16 1818 20 22 24 26 ……*(b[i]+2)就是b[1][2],就是22 i=2时,b=a+2 b就好比这样一个数组:18 20 22 24 2626 28 30 32 3434 36 38 40 42 ……*(b[i]+2)就是b[2][2],就是38 i=3时,b=a+3 b就好比这样一个数组:26 28 30 32 3434 36 38 40 42 数组后面没有被定义*(b[i]+2)即b[3][2],这个位置没有被定义 而这个内存位置原先正好是0,所以输出了0 (最后这个0是不确定的,在我的机器上试验了一下,每次都不一样)

且末县17683888693: 哪位大哥大姐可以帮我下啊!我用VB6.0执行了一个文件 -
门秀盐酸: Dim str As String str = "youxi.exe " + Text1.Text Shell str

且末县17683888693: 大哥,这个程序是#include <stdio.h> main() { int x=8; for( ; x>0; x -- ) { if(x%3) -
门秀盐酸: 8, 5, 4, 2,空格 主要考察前自减,和后自减的区别--i; i-- ;--i表示,i自增1后再参与其它运算;而i-- 则是i参与运算后,i的值再自增1.

且末县17683888693: 哪位大哥帮忙下!如何解决应用程序错误:"0x009501e3"指令引用的"0xe895e6e9"内存.该内存不能为"written” -
门秀盐酸: 你好你说的这种情况,一般都是由 系统软件、内存、引起的.1 电脑不心装上了恶意...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网