帮着一个朋友调试这个协议,把调试过程中遇到的问题记录下,希望能帮助后来人吧,
废话少说,直接上主体。
一、真空计通信方式
主要分为两类,数字和模拟。由于我们调试的是数字真空计,因此以下主题主要围绕
数字真空计。接口方式如下:
由于是RS485通信,可以级联,如下图:
设置地址方式:
PS:选择24V电源,要尽量保留余量,我测试发现安装上真空计影响了温度采集,查找原因,是把电源拉低了。
二、真空计协议
帧格式:
说明:
PS:
1、Action为'0'则为数据;为‘1’则为命令;
举例:
PS:
1、帧协议为ASCII码格式;
2、结尾为13即0x0D(我刚开始发的0x13怎么也不通,仔细看协议是0x0D);
3、校验值是前面所有数据的校验和,算法如下:
/*******************************************************************************
* Function: vacuum_gauge_calculate_sum
* PreCondition: None
* Input: pchBuffer,hwSize
* Output: uint8_t
* Side Effects: None
* Overview: ¼ÆËãÕæ¿Õ¼ÆµÄ¼ìÑéºÍ
* Note: None
*******************************************************************************/
uint8_t vacuum_gauge_calculate_sum(uint8_t* pchBuffer,uint16_t hwSize)
{
uint8_t chSum = 0;
uint16_t i = 0;
if(NULL == pchBuffer || !hwSize){
return 0;
}
for(i=0;i<hwSize;i++){
chSum += pchBuffer[i] - '0';
}
chSum += '0' * hwSize;
return chSum;
}
命令码:
数据格式:
三、读取数据
740位读数据,数据格式为10-u_expo_new
PS:
1、根据手册,“104223”=1.042×10^3,“750015”=7.500×10^(-5),我就解释我最后一位代表指数,倒数第二位代表符号;调试过程中发现数据不对,最后分析数据得出:最后两位-20代表指数部分;
2、输出单位为hPa,如果现实单位为Pa,则转换后数据×100;
计算方法:
/*******************************************************************************
* Function: vacuum_gauge_calculate_pa
* PreCondition: None
* Input: pchBuffer,hwSize
* Output: double
* Side Effects: None
* Overview: ¼ÆËãÕæ¿Õ¼ÆÖµ
* Note: None
*******************************************************************************/
double vacuum_gauge_calculate_pa(uint8_t* pchBuffer,uint16_t hwSize)
{
uint8_t chTemp[50];
double dfTemp = 0.0,dfTemp1 = 0.0,dfTemp2 = 10;
uint16_t i= 0,j=0,m=0;
if(NULL == pchBuffer || hwSize < 2){
return 0;
}
if(hwSize > sizeof(chTemp)){
hwSize = sizeof(chTemp);
}
//±ä³ÉHEX¸ñʽ
for(i=0;i<hwSize;i++){
chTemp[i] = pchBuffer[i] - '0';
}
//Ñ°ÕÒ·ÇÁãÖµ
for(i=0;i<hwSize-2;i++){
if(chTemp[i]){
break;
}
}
//È·¶¨ÕûÊý²¿·Ö
if(i < (hwSize-2)){
dfTemp = chTemp[i];
}else{
dfTemp = 0.0;
}
//È·¶¨Ð¡Êý²¿·Ö
dfTemp2 = 10;
for(j=i+1;j<hwSize-2;j++){
dfTemp1 = chTemp[j];
dfTemp1/= dfTemp2;
dfTemp += dfTemp1;
dfTemp2*= 10;
}
//hPa±äΪPa
dfTemp = dfTemp * 100;
//È·¶¨Ö¸Êý²¿·Ö
j=chTemp[hwSize-2]*10+chTemp[hwSize-1];
if(j >= 20){
m = j - 20;
for(i=0;i<m;i++){
dfTemp*=10;
}
}else{
m = 20 - j;
for(i=0;i<m;i++){
dfTemp/=10;
}
}
return dfTemp;
}