宁波海达注塑机机怎样从上位机或下位机取生产数据

查看: 10018|回复: 6
如何将下位机采集的浮点型数据发送给上位机
本帖最后由 xiao_yp2014 于
14:21 编辑
大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术、一直到今年毕业。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力
在有些项目中,需要单片机把数据处理完后,返回给上位机,数据处理离不成计算,有计算就会涉及到小数,那么,如何将小数转换成十六进制数据呢,下面请看简便算法。
上位机发送命令:01 02 EB 00 55& &
下位机返回-5.625 的十六进制数据 C0 B4 00 00
捕获.PNG (95.6 KB, 下载次数: 192)
22:15 上传
#include &REG52.H&
#define const_voice_short&&40 //蜂鸣器短叫的持续时间
#define const_rc_size&&10& &&&//接收串口中断数据的缓冲区数组大小
#define const_receive_time&&5 //如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小
unsigned char xdata array[10];//缓存数组
float value = -5.625;& && && && && && &//模拟下位机采集经过计算后的数据
/*
-5.625 = C 0 B 4 0 0 0 0
C& & 0& &&&B& &4& &&&0& &0& & 0& & 0
11 00
按照浮点数格式切割成相应的域 1 101 000000
经分析:符号域1 意味着负数;指数域为129 意味着实际的指数为2 (减去偏差值127);
尾数域为01101 意味着实际的二进制尾数为1.01101 (加上隐含的小数点前面的1)。
所以,实际的实数为:
= -1.01101 × 2^2 =- ( 1*2^0 + 1*2^(-2) + 1*2^(-3) + 1*2^(-5) ) × 2^2
= -(1+0.25+0.125+0.03125)*4
= -1.40625*4
= -5.625
*/
void initial_myself(void);& &
void initial_peripheral(void);
void delay_long(unsigned int uiDelaylong);
void T0_time(void);& && & //定时中断函数
void usart_receive(void); //串口接收中断函数
void usart_service(void); //串口服务程序,在main函数里
sbit beep_dr=P3^6; //蜂鸣器的驱动IO口
unsigned int&&uiSendCnt=0;& &&&//用来识别串口是否接收完一串数据的计时器
unsigned char ucSendLock=1;& & //串口服务程序的自锁变量,每次接收完一串数据只处理一次
unsigned int&&uiRcregTotal=0;&&//代表当前缓冲区已经接收了多少个数据
unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组
unsigned int&&uiRcMoveIndex=0;&&//用来解析数据协议的中间变量
unsigned int&&uiVoiceCnt=0;&&//蜂鸣器鸣叫的持续时间计数器
void usart_send();& && && && && & //串口发送程序
void&&Change();& && && && && && && && &//将浮点弄转换成字符弄
void main()
{
& && &&&initial_myself();&&
& && &&&delay_long(100);& &
& && &&&initial_peripheral();
& && &&&while(1)&&
& && &&&{
& && && &&&usart_service();&&//串口服务程序
& && &&&}
}
union& && && && && && && && && & //联合体定义
{
& & char a[4];
& && &&&
}
void usart_service(void)&&//串口服务程序,在main函数里
{
/* 注释一:
* 识别一串数据是否已经全部接收完了的原理:
* 在规定的时间里,如果没有接收到任何一个字节数据,那么就认为一串数据被接收完了,然后就进入数据协议
* 解析和处理的阶段。这个功能的实现要配合定时中断,串口中断的程序一起阅读,要理解他们之间的关系。
*/
& &&&if(uiSendCnt&=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
& &&&{
& && && && &ucSendLock=0;& & //处理一次就锁起来,不用每次都进来,除非有新接收的数据
& && && && && && &&&//下面的代码进入数据协议解析和数据处理的阶段
& && && && && &uiRcMoveIndex=uiRcregT //由于是判断数据尾,所以下标移动变量从数组的最尾端开始向0移动
& && && && &while(uiRcMoveIndex&=5)& &//如果处理的数据量大于等于5(2个有效数据,3个数据头)说明还没有把缓冲区的数据处理完
& && && && &{
& && && && && &if(ucRcregBuf[uiRcMoveIndex-3]==0xeb&&ucRcregBuf[uiRcMoveIndex-2]==0x00&&ucRcregBuf[uiRcMoveIndex-1]==0x55)&&//数据尾eb 00 55的判断
& && && && && &{
& && && && && && && && && && && && && & if(ucRcregBuf[uiRcMoveIndex-5]==0x01&&ucRcregBuf[uiRcMoveIndex-4]==0x02)&&//有效数据01 02的判断
& && && && && && && && && && && && && & {
& && && && && && && && && && && && && && && && &usart_send();& && &&&//收到正确的数据后,开发发送采集到的数据
& && && && && && && && && && && && && && && && &uiVoiceCnt=const_voice_ //蜂鸣器发出声音,说明数据发送完毕
& && && && && && && && && && && && && && && && &
& && && && && && && && && && && && && & }
& && && && && && && &//退出循环
& && && && && &}
& && && && && &uiRcMoveIndex--; //因为是判断数据尾,下标向着0的方向移动
& && && &&&}
& && && &&&uiRcregTotal=0;&&//清空缓冲的下标,方便下次重新从0下标开始接受新数据
& &&&}
void usart_send()& && && &&&//串口发送
{
& & static unsigned int ucSendCnt = 0;
& && &&&ES = 0; //关串口中断
& && &&&TI = 0; //清零串口发送完成中断请求标志
& && &&&Change();
& && &&&
& && &&&for(ucSendCnt = 0;ucSendCnt&4;ucSendCnt++)//发送四个字节,表示一个浮点数
& && &&&{
& && && && & SBUF = array[ucSendCnt];& && && && && && && && &//将数据装入缓冲区
& && && && & delay_long(50);& && && && && && && && && && && && && & //延时一会儿
& && &&&}
& && &&&
& && &&&TI = 0; //清零串口发送完成中断请求标志
& && &&&ES = 1; //允许串口中断
}
/*
联合休:
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。
& &&&在C Programming Language 一书中对于联合体是这么描述的:
& &&&1)联合体是一个结构;
& &&&2)它的所有成员相对于基地址的偏移量都为0;
& &&&3)此结构空间要大到足够容纳最&宽&的成员;
& &&&4)其对齐方式要适合其中所有的成员;
下面解释这四条描述:
& &&&由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量
& && && &的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,
& && && &因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是
& && && &指其必须符合所有成员的自身对齐方式。
*/
void&&Change()
{
& &&&temp.b& &=& && && && && & //将数据存入联合休中
& &&&array[0] = temp.a[0];& && &&&//一个字节一个字节的取出来
& &&&array[1] = temp.a[1];
& &&&array[2] = temp.a[2];
& &&&array[3] = temp.a[3];
}
void T0_time(void) interrupt 1& & //定时中断
{
& && &&&TF0=0;&&//清除中断标志
& && &&&TR0=0; //关中断
& && &&&
& && && &uiSendCnt++;& & //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
& && &&&if(uiSendCnt&=const_receive_time)& &//如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完
& && &&&{
& && && && &ucSendLock=1;& &&&//开自锁标志
& && &&&}
& && &&&
& && &&&if(uiVoiceCnt!=0)
& && &&&{
& && && && &uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
& && && && &beep_dr=0;&&//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
& && &&&}
& && &&&else
& && &&&{
& && && && &; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
& && && && &beep_dr=1;&&//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
& && &&&}
& && &&&
& && &&&
& && &&&TH0=0& &//重装初始值()=65035=0xfe0b
& && &&&TL0=0x0b;
& && &&&TR0=1;&&//开中断
}
void usart_receive(void) interrupt 4& && && && && &&&//串口接收数据中断& && &&&
{& && &&&
& && &&&if(RI==1)&&
& && &&&{
& && && && && & RI = 0;
& && && && && & ++uiRcregT
& && && && && & if(uiRcregTotal&=const_rc_size)&&//超过缓冲区
& && && && && & {
& && && && && && &&&uiRcregTotal=const_rc_
& && && && && & }
& && && && && & ucRcregBuf[uiRcregTotal-1]=SBUF;& &//将串口接收到的数据缓存到接收缓冲区里
& && && && && & uiSendCnt=0;&&//及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。
& && &&&}
& && &&&else&&//我在其它单片机上都不用else这段代码的,可能在51单片机上多增加& TI = 0;&稳定性会更好吧。
& && &&&{
& && && && && & TI = 0;
& && &&&}
}& && && && && && && && && && &&&
void delay_long(unsigned int uiDelayLong)
{
& &
& &
& &for(i=0;i&uiDelayLi++)
& &{
& && &for(j=0;j&50;j++)&&//内嵌循环的空指令数量
& && && & {
& && && && & ; //一个分号相当于执行一条空语句
& && && & }
& &}
}
void initial_myself(void)&&//第一区 初始化单片机
{
& && && & beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
& && &&&
& && && & //配置定时器
& && && & TMOD=0x01;&&//设置定时器0为工作方式1
& && && & TH0=0& &//重装初始值()=65035=0xfe0b
& && && & TL0=0x0b;
& && &&&
& && &&&
& && && & //配置串口
& && && & SCON=0x50;
& && && & TMOD=0X21;
& && && & TH1=TL1=-(/32/9600);&&//这段配置代码具体是什么意思,我也不太清楚,反正是跟串口波特率有关。
& && && & TR1=1;& && &&&
}
void initial_peripheral(void) //第二区 初始化外围
{
& && && &&&EA=1;& &&&//开总中断
& && && &&&ES=1;& &&&//允许串口中断
& && && &&&ET0=1;& & //允许定时中断
& && && &&&TR0=1;& & //启动定时中断
}复制代码
标题是不是写错了?
帖子内容讲的是联合体字节流。
这个方法比效率比sprintf高,但是代码较多,适合于大量源数据采集/传输。
标题是不是写错了?
帖子内容讲的是联合体字节流。
这个方法比效率比sprintf高,但是代码较多,适合于大 ...
标题没有错,我的主导思想是联合体共用内存首地址一个优点,也可以叫做是缺点来为我办事,你也可以晒晒你的方法。
本帖最后由 exv 于
23:27 编辑
标题没有错,我的主导思想是联合体共用内存首地址一个优点,也可以叫做是缺点来为我办事,你也可以晒晒你 ...
联合休==&联合体
这个别字太显眼了,看标题感觉很奇怪,点进来才知讲的联合体。
联合体的这个特点也不好说是缺点,就像一个可自由存取可分隔的盒子,在执行效率上有优势。
联合休==&联合体
这个别字太显眼了,看标题感觉很奇怪,点进来才知讲的联合体。
现在正在回家的火车上面阅读楼主的帖子。刚刚从一个隧道里面出来。一看就知道楼主一定是一个代码高手,这个程序非常精辟,果断收藏了。我以前也是实现过类似的功能,也是需要把浮点数上传到上为机上位机里面。为了这个功能我头疼了很多天。后面还是在51hei论坛里面找到了一个函数先把浮点数转化为字符串,然后再把字符串到上位机。然后上位机程序再把字符串转化为浮点数据。勉为其难地解决了这个问题。楼主这个程序改天回去试一下。
现在正在回家的火车上面阅读楼主的帖子。刚刚从一个隧道里面出来。一看就知道楼主一定是一个代码高手,这个 ...
希望对你有所帮助,带着回家喜悦的心情,阅读如此精彩的程序,相信你会满载而归的。
Powered by上位机、下位机是什么?_百度知道
上位机、下位机是什么?
我有更好的答案
上位机  上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。
下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但
万变不离其宗
:上下位机都需要编程,都有专门的开发系统。   下位机  下位机是直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的。   上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般模拟量),转化成数字信号反馈给上位机。简言之如此,真实情况千差万别不离其宗。上下位机都需要编程,都有专门的开发系统。   在概念上,被控制者和被服务者是下位机。   两机如何通讯,一般取决于下位机。
TCP/IP一般是支持的。但是下位机一般具有更可靠的独有通讯协议。
在概念上  控制者和提供服务者是上位机   
被控制者和被服务者是下位机   
也可以理解为主机和从机的关系   
但上位机和下位机是可以转换的   
,一般取决于下位机。
但是下位机一般具有更可靠的独有通讯协议,购买下位机时,会带一大堆手册光盘
采纳率:64%
为您推荐:
其他类似问题
下位机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。您可能还感兴趣的厂家:
您可能还感兴趣的产品:
您可能还感兴趣的其他内容什么是上位机和下位机_百度知道
什么是上位机和下位机
我有更好的答案
上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化。下位机是直接控制设备、获取设备状况的的计算机、处理器等。一般是单片机(51 AVR MSP430 ARM 等等)、PLC等。
上位(发送)-&命令&下位机,下位机-&分析、计算、解析-&相应时序信号-&控制相应设备。下位机根据软件设计的时序-&读取设备状态数据(数字、模拟),转化-&数字信号发送-&位机。
比如:用电脑给手机刷系统,PC:上位机;手机:下位机。
比如:用myphone控制我们的窗帘开启关闭、台灯亮度等。上位机:myphone
.....(物联网的节奏啊)。
采纳率:38%
上位机是控制部分,发出指令,和接收反馈信息,下位机就是接受指令并执行,同事把信息发送给上位机,比如上位是监控室的电脑,下位就是车间的设备的控制系统。
上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。。下位机是直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的
为您推荐:
其他类似问题
下位机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 海达注塑机如何 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信