串口調(diào)試助手
PH儀與上位機(jī)之間采用MODBUS協(xié)議進(jìn)行通信,波特率固定為9600bps。具體協(xié)議如下:
1.1讀取測量信息和狀態(tài)(讀多個寄存器) 功能碼(0x03)
命令格式:
定義 | 地址 | 功能碼 | 起始地址 | 寄存器個數(shù) | CRC校驗 |
數(shù)據(jù) | ADDR | 0x03 | 0x 0000 | 0x 0006 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 2 |
返回格式:
定義 | 地址 | 功能碼 | 數(shù)據(jù)個數(shù) | 數(shù)據(jù) | CRC校驗 |
數(shù)據(jù) | ADDR | 0x 03 | 0x 0C | Data | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 1 | 12 | 2 |
注釋:
(1) 數(shù)據(jù)字節(jié)長度:為返回數(shù)據(jù)的實際字節(jié)長度。
(2) CRC 16,低8位在前,高8位在后。
(3) DATA數(shù)據(jù)格式如下:
PH模式的DATA數(shù)據(jù)
1 | 2 | 3 |
PH值高8位字節(jié) | PH值低8位字節(jié) | 溫度值高8位字節(jié) |
4 | 5 | 6 |
溫度值低8位字節(jié) | 高點報警值高8位字節(jié) | 高點報警值低8位字節(jié) |
7 | 8 | 9 |
低點報警值高8位字節(jié) | 低點報警值低8位字節(jié) | 滯后值高8位字節(jié) |
10 | 11 | 12 |
滯后值低8位字節(jié) | 報警狀態(tài) | PH/ORP模式 |
例,發(fā)送命令:01 03 00 00 00 06 C5 C8
返回:01 03 0C 1B 8F 00 FA 03 E8 01 90 00 32 00 00 1C 3E
則數(shù)據(jù)部分為:1B 8F 00 FA 03 E8 01 90 00 32 00 00
PH值:由整數(shù)部分和小數(shù)部分組成,整數(shù)的有效數(shù)字是2位,小數(shù)有效數(shù)字是3位。比如PH值的高8位字節(jié)為0x1B,PH值的低8位字節(jié)為0x8F,則PH值為0x1B8F,轉(zhuǎn)化成10進(jìn)制為7055,PH值為7.055,2位整數(shù),3位小數(shù),整數(shù)前面的零省去。
溫度值:為0x09C4,轉(zhuǎn)化成10進(jìn)制為2500,溫度值為25.00,保留兩位小數(shù)。
高點報警值:為0x03E8,轉(zhuǎn)化成10進(jìn)制為1000,值為10.00,保留兩位小數(shù)。
低點報警值:為0x0190,轉(zhuǎn)化成10進(jìn)制為400,值為4.00,保留兩位小數(shù)。
滯后值:為0x0032,轉(zhuǎn)化成10進(jìn)制為50,值為0.50,保留兩位小數(shù)。
報警狀態(tài):為0x00,無報警。(注:0x00為無報警,0x01為低點報警,0x02為高點報警)
PH/ORP模式:為0x00,PH模式。(注:0x00為PH模式, 0x01為ORP模式)
ORP模式的DATA數(shù)據(jù)
1 | 2 | 3 |
ORP值高8位字節(jié) | ORP值低8位字節(jié) | 溫度值高8位字節(jié) |
4 | 5 | 6 |
溫度值低8位字節(jié) | 高點報警值高8位字節(jié) | 高點報警值低8位字節(jié) |
7 | 8 | 9 |
低點報警值高8位字節(jié) | 低點報警值低8位字節(jié) | 滯后值高8位字節(jié) |
10 | 11 | 12 |
滯后值低8位字節(jié) | 報警狀態(tài) | PH/ORP模式 |
例,發(fā)送命令:01 03 00 00 00 06 C5 C8
返回:01 03 0C FF 30 00 FA 03 E8 FC 18 00 0A 00 01 BC 26
則數(shù)據(jù)部分為:FF 30 00 FA 03 E8 FC 18 00 0A 00 01
ORP值:為0xFF30,當(dāng)ORP值為負(fù)數(shù)時,數(shù)據(jù)以補碼形式運算,0xFFFF-0xFF30+1=0x00D0,轉(zhuǎn)化成10進(jìn)制為208,ORP值為-208mV。ORP若為0x011E,轉(zhuǎn)化成10進(jìn)制為286,ORP值為286mV。
溫度值:為0x00FA,轉(zhuǎn)化成10進(jìn)制為250,溫度值為25.0,保留一位小數(shù)。
高點報警值:為0x03E8,轉(zhuǎn)化成10進(jìn)制為1000,值為1000 mV。
低點報警值:為0x FC18,數(shù)據(jù)以補碼形式運算,值為-1000 mV。
滯后值:為0x000A,轉(zhuǎn)化成10進(jìn)制為10,值為10 mV。
報警狀態(tài):為0x00,無報警。(注:0x00為無報警,0x01為低點報警,0x02為高點報警)
PH/ORP模式:為0x01,ORP模式。(注:0x00為PH模式, 0x01為ORP模式)
1.2讀取測量信息和狀態(tài)(讀1個寄存器) 功能碼(0x03)
命令格式:
定義 | 地址 | 功能碼 | 起始地址 | 寄存器個數(shù) | CRC校驗 |
數(shù)據(jù) | ADDR | 0x03 | 0x 0000-0x 0004 | 0x 0001 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 2 |
返回格式:
定義 | 地址 | 功能碼 | 數(shù)據(jù)個數(shù) | 數(shù)據(jù) | CRC校驗 |
數(shù)據(jù) | ADDR | 0x 03 | 0x 02 | Data | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 1 | 2 | 2 |
注釋:
(1) 數(shù)據(jù)字節(jié)長度:為返回數(shù)據(jù)的實際字節(jié)長度。
(2) CRC 16,低8位在前,高8位在后。
數(shù)據(jù)處理同1.1節(jié)一樣。
1.3.錯誤響應(yīng)
如果監(jiān)測器不能正確執(zhí)行上位機(jī)命令,返回如下格式:
定義 | 地址 | 功能碼 | CODE | CRC校驗 |
數(shù)據(jù) | ADDR | COM+80H | 1 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 1 | 2 |
◆ CODE: 01 – 功能碼異常
02 – 起始地址異常
03 – 寄存器數(shù)量異常
◆ COM: 接收到的功能碼
◆ CRC校驗,低8位在前,高8位在后。
例如:
1、發(fā)送命令:01 01 00 00 00 06 BC 08
返回:01 81 01 81 90 說明功能碼錯誤
2、發(fā)送命令:01 03 00 06 00 06 25 C9
返回:01 83 02 C0 F1 起始地址錯
3、發(fā)送命令:01 03 00 00 00 08 44 0C
返回:01 83 03 01 31 數(shù)據(jù)錯(數(shù)據(jù)個數(shù)錯)
2.1.寫數(shù)據(jù)寄存器(寫多個寄存器) 功能碼(0x10)
命令格式:
定義 | 地址 | 功能碼 | 起始地址 | 寄存器數(shù)量 | 字節(jié)數(shù) |
數(shù)據(jù) | ADDR | 0x10 | 0x 0000 | 0x 0003 | 0x 06 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 1 |
高報高8 | 高報低8 | 低報高8 | 低報低8 | 滯后高8 | 滯后低8 | CRC校驗 |
自定義 | 自定義 | 自定義 | 自定義 | 自定義 | 自定義 | CRC 16 |
1 | 1 | 1 | 1 | 1 | 1 | 2 |
返回格式:
定義 | 地址 | 功能碼 | 起始地址 | 寄存器數(shù)量 | CRC校驗 |
數(shù)據(jù) | ADDR | 0x 10 | 0x 0000 | 0x 0003 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 2 |
例,發(fā)送命令:01 10 00 00 00 03 06 03 E8 01 90 00 32 06 A0
返回: 01 10 00 00 00 03 80 08
附:PH:高點報警(范圍0~14.00)、低點報警(范圍0~14.00)、滯后值(范圍0~9.90)數(shù)據(jù)格式同上。
ORP:高點報警(范圍-1999~1999)、低點報警(范圍-1999~1999)、滯后值(范圍0~1000)數(shù)據(jù)格式同上。
2.2.錯誤響應(yīng)
如果監(jiān)測器不能正確執(zhí)行上位機(jī)命令,返回如下格式:
定義 | 地址 | 功能碼 | CODE | CRC校驗 |
數(shù)據(jù) | ADDR | COM+80H | 1 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 1 | 2 |
◆ CODE: 01 – 功能碼異常
02 – 起始地址異常
03 – 寄存器數(shù)量異常
04 – 寫多個寄存器異常
◆ COM: 接收到的功能碼
◆ CRC校驗,低8位在前,高8位在后。
例如:
1、發(fā)送命令:01 16 00 00 00 03 06 03 E8 02 70 00 32 0F1A
返回:01 96 01 8E 60 功能碼異常
2、發(fā)送命令:01 10 00 01 00 03 06 03 E8 01 90 00 32 57 65
返回:01 90 02 CD C1 起始地址異常
3、發(fā)送命令:01 10 00 00 00 05 06 03 E8 01 90 00 32 86 8A
返回:01 90 03 0C 01 寄存器數(shù)量異常
2.3.寫數(shù)據(jù)寄存器(寫單個寄存器) 功能碼(0x06)
命令格式:
定義 | 地址 | 功能碼 | 寄存器地址 | 寄存器值 | CRC校驗 |
數(shù)據(jù) | ADDR | 0x06 | 自定義 | 自定義 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 2 |
返回格式:
定義 | 地址 | 功能碼 | 寄存器地址 | 寄存器值 | CRC校驗 |
數(shù)據(jù) | ADDR | 0x06 | 自定義 | 自定義 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 2 | 2 | 2 |
例,發(fā)送命令:01 06 00 0A 03 E9 68 B6
返回: 01 06 00 0A 03 E9 68 B6
高點報警值:為0x03E9,轉(zhuǎn)化成10進(jìn)制為1001,值為10.01,保留兩位小數(shù)。CRC 16 校驗值因輸入地址和值的不同也不同,校驗值對才能寫入數(shù)據(jù)。
PH高點報警點寄存器地址:0X000A
PH低點報警點寄存器地址:0X000C
PH滯后量寄存器地址: 0X000E
ORP高點報警點寄存器地址:0X0014
ORP低點報警點寄存器地址:0X0016
ORP滯后量寄存器地址: 0X0018
附:PH:高點報警(范圍0~14.00)、低點報警(范圍0~14.00)、滯后值(范圍0~9.90)數(shù)據(jù)格式同上。
ORP:高點報警(范圍-1999~1999)、低點報警(范圍-1999~1999)、滯后值(范圍0~1000)數(shù)據(jù)格式同上。
注:PH模式時只能寫PH相關(guān)的寄存器(PH的高低點等寄存器),ORP模式時只能寫ORP相關(guān)的寄存器(ORP的高低點等寄存器)。
2.4.錯誤響應(yīng)
如果監(jiān)測器不能正確執(zhí)行上位機(jī)命令,返回如下格式:
定義 | 地址 | 功能碼 | CODE | CRC校驗 |
數(shù)據(jù) | ADDR | COM+80H | 1 | CRC 16 |
字節(jié)數(shù) | 1 | 1 | 1 | 2 |
◆ CODE: 01 – 功能碼異常
02 – 寄存器地址異常
03 – 寄存器值異常
04 – 寫單個寄存器異常
◆ COM: 接收到的功能碼
◆ CRC校驗,低8位在前,高8位在后。
例如:
1、發(fā)送命令:01 07 00 0A 03 E9 55 76
返回:01 87 01 82 30 說明功能碼異常
2、發(fā)送命令:01 06 00 02 03 E9 E9 74
返回:01 86 02 C3 A1 寄存器地址異常
3、發(fā)送命令:01 06 00 0A XX D0 3C 05
返回:01 86 03 02 61 寄存器值異常(超限)
4、發(fā)送命令:01 06 00 0A 07 D0 AA 64
返回:01 86 04 43 A3 寫單個寄存器異常
CRC校驗:低位在前,高位在后,各個地址效驗碼如下:
01地址:01 03 00 00 00 06 C5 C8
02地址:02 03 00 00 00 06 C5 FB
03地址:03 03 00 00 00 06 C4 2A
04地址:04 03 00 00 00 06 C5 9D
05地址:05 03 00 00 00 06 C4 4C
06地址:06 03 00 00 00 06 C4 7F
07地址:07 03 00 00 00 06 C5 AE
08地址:08 03 00 00 00 06 C5 51
09地址:09 03 00 00 00 06 C4 80
10地址:10 03 00 00 00 06 C6 89
3.CRC檢測
CRC添加到命令中時,低字節(jié)先加入,然后高字節(jié)?!?/span>
CRC簡單函數(shù)如下:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* 要進(jìn)行CRC校驗的消息 */
unsigned short usDataLen ; /* 消息中字節(jié)數(shù) */
{
unsigned char uchCRCHi = 0xFF ; /* 高CRC字節(jié)初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低CRC 字節(jié)初始化 */
unsigned uIndex ; /* CRC循環(huán)中的索引 */
while (usDataLen--) /* 傳輸消息緩沖區(qū) */
{
uIndex = uchCRCHi ^ *puchMsgg++ ; /* 計算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
/* CRC 高位字節(jié)值表 */
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字節(jié)值表*/
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6 F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
歡迎您關(guān)注我們的微信公眾號了解更多信息