|
小弟最近做毕设,做一个功率测量系统,单片机通过串口发过来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
由于水力测功机是两个分别独立的系统采集内轴和外轴的数据,因此接收软件必须同时以同一周期向两个端口发送命令字节。 |
|