cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1361|回复: 5

求助:怎样把单片机发过来的85字节的BCD码数据通过串口发送?

[复制链接]
发表于 2007-5-30 23:11:56 | 显示全部楼层 |阅读模式
小弟最近做毕设,做一个功率测量系统,单片机通过串口发过来85字节的BCD码数据,怎样才能用LABVIEW把编程实现串口通信?并且从中分离出有用的数据?望高手指教!
以前有师兄用VC++编程实现,附上:
4.4.4 对接收到的数据进行处理
1)        将接收到的字符串通过公式提取出要得的数据。
m_wzs=(os.data[2]-0x30)*1000+(os.data[3]-0x30)*100+(os.data[4]-0x30)*10+(os.data[5]-0x30);  外轴转速,取第3,4,5,6个字节
根据数据传送的通信协议格式,os.data[2]为第三个字节的一个字符,由于在传送过程中加了30H,因此“-0x30”即可以得到我们所需要的位数上的数据。每个参数都取四个字节构成一个4位的十进制数,因此将最高位乘以1000,第二位乘以100,第三位乘以10,与第四位累加,即得到原始数据。
例如:发送字节为31H 33H 35H 37H 则提取出4个数位上的数为1、3、5、7,再根据以上公式计算得到数据:1357,即为我们要的原始数据。
以下同理可得:
m_wzj=(os.data[6]-0x30)*1000+(os.data[7]-0x30)*100+(os.data[8]-0x30)*10+(os.data[9]-0x30);  外轴转矩,取第7,8,9,10个字节

m_smwz1=(os.data[66]-0x30)*1000+(os.data[67]-0x30)*100+(os.data[68]-0x30)*10+(os.data[69]-0x30);  外轴水门位置,取第67,68,69,70个字节

功率 = 转矩*转速/9550
m_wgl = (float) m_wzj*m_wzs/9550;

内轴与外轴算法相同:
m_nzs=(os2.data[2]-0x30)*1000+(os2.data[3]-0x30)*100+(os2.data[4]-0x30)*10+(os2.data[5]-0x30); 内轴转速,取第3,4,5,6个字节

m_nzj=(os2.data[6]-0x30)*1000+(os2.data[7]-0x30)*100+(os2.data[8]-0x30)*10+(os2.data[9]-0x30); 内轴转矩,取第7,8,9,10个字节

m_smwz2=(os2.data[66]-0x30)*1000+(os2.data[67]-0x30)*100+(os2.data[68]-0x30)*10+(os2.data[69]-0x30); 内轴水门位置,取第67,68,69,70个字节

功率 = 转矩*转速/9550
m_ngl = (float) m_nzj*m_nzs/9550;
2) 将数据转化成位置图象
CProgressCtrl        m_progress2;//图象定义
CProgressCtrl        m_progress1;//图象定义
……
void CComRecvDlg::OnOutofmemoryProgress1(NMHDR* pNMHDR, LRESULT* pResult) //定义图象条的指针位置
{
        // TODO: Add your control notification handler code here
       
        *pResult = 0;//定义图象初始位置为0,这与初始数据中初始外轴转速为0相对应。
} //外轴图象设定
void CComRecvDlg::OnOutofmemoryProgress2(NMHDR* pNMHDR, LRESULT* pResult)
{
        // TODO: Add your control notification handler code here
       
        *pResult = 0;// 定义图象初始位置为0,这与初始数据中初始内轴转速为0相对应。

}//内轴图象设定

3) 接收停止
void CComRecvDlg::OnCancel()
{
        exit(0);
}
4)以时间为格式记录数据到TXT文档中。
fprintf(fp,"%s",CTime::GetCurrentTime().Format("%H:%M:%S"));//创建文件夹,文件夹名为日期
fprintf(fp,"外轴: %04d %04.0f %08.1f %04d 内轴: %04d %04.0fd %08.1f %4d\r\n",m_wzs,m_wzj,m_wgl,m_smwz1,m_nzs,m_nzj,m_ngl,m_smwz2); //将处理过的数据按照“外轴转速、外轴转矩、外轴功率、外轴水门位置、内轴转速、内轴转矩、内轴功率、内轴水门位置”的格式记录在文件夹中
4.5 数据通信协议
水下航行器对转电机水力测功系统的通信采用的是RS232通信协议。使用串口调试助手采集数据进行综合分析。


根据通信协议,首先必须先向对转电机水力测功系统发送命令字节FFH。


对转电机水力测功系统接收到命令字节,向上位机发送采集到的数据:



测试软件每发送一次命令字节,对转电机水力测功系统便发送一次数据。因此,如果需要连续采集多次数据,就必须按一定的周期连续发送命令字节到对转电机水力测功系统:

图4.8连续发送命令字节
经过多次测试,最后确定通信格式如下:
串行口1(COM1)4800波特率  
发送 :FFH    对转电机水力测功系统才向上位机转送
8个数据位   1个停止位    偶校验,共发送下列85个字节数据:
   41H   42H    转速    扭矩    油耗    油耗率   机油温度
                 4       4        4       4         4
出水温度    排气温度   燃油温度    进水温度    机油压力  
4           4          4           4           4
  前进气压    后进气压    中冷前温    中冷后温    备用温
4           4          4           4          4
油门位置    水门位置    控制状态字    油门设定    水门设定
     4           4           1             4          4
效验和
    6
每个参数共发4个字节,高位在前,低位在后,每字节为非压缩BCD码并加上30H,如转速为1234转/分,则发送格式为:31H  32H  33H  34H  
由于水力测功机是两个分别独立的系统采集内轴和外轴的数据,因此接收软件必须同时以同一周期向两个端口发送命令字节。
发表于 2007-5-31 09:50:48 | 显示全部楼层
用LABVIEW把编程实现串口通信,labview有相关的范例,可以参考一下.至于怎么分离出有用的数据,这也是我遇到的问题.
发表于 2008-6-19 22:32:56 | 显示全部楼层
这位兄弟的问题正是我现在遇到差不多的,还没头绪怎么解决。顶一下让会的朋友看到,嘿嘿
发表于 2008-6-19 23:30:24 | 显示全部楼层
收回来用STRING SUBSET能分出来的!
发表于 2008-6-19 23:30:54 | 显示全部楼层
http://www.cpubbs.com/bbs/thread-54941-1-2.html

我们的学习套件的温度和电压的,其中也有取有效部分的!现在能全套下载了!
发表于 2022-2-16 15:19:42 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-5-4 17:32 , Processed in 0.624482 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表