TF-R4-30 RS485風(fēng)速傳感器調(diào)試記錄
風(fēng)速傳感器如下,貼的是北京無(wú)線(xiàn)聯(lián)科的標(biāo)簽,估計(jì)也是做貿(mào)易買(mǎi)進(jìn)貼logo賣(mài)出,也不是自己研發(fā)的,因?yàn)檎伊思夹g(shù)支持,他們轉(zhuǎn)給了另外一家公司:
2、通過(guò)RS485和USR-TCP232-304 RS485轉(zhuǎn)以太網(wǎng)模塊相連,獲取風(fēng)速,然后通過(guò)RJ45端口送到互聯(lián)網(wǎng)上,風(fēng)速傳感器只有三組命令可以使用,分別是:查詢(xún)當(dāng)前風(fēng)速;查詢(xún)當(dāng)前從機(jī)地址;修改當(dāng)前從機(jī)地址,如果發(fā)送的命令錯(cuò)誤,比如CRC不對(duì),是沒(méi)有任何返回的,這點(diǎn)比較狗血,按理說(shuō)應(yīng)該有個(gè)錯(cuò)誤返回提示,但是沒(méi)有。
3、這款風(fēng)速傳感器使用的是CRC16 Modbus算法校驗(yàn)的,所以通過(guò)查表即可得出兩個(gè)字節(jié)的CRC16,計(jì)算CRC函數(shù)代碼如下,不過(guò)注意大小端,風(fēng)速傳感器使用的是大端模式,所以高字節(jié)在低位,且高字節(jié)先發(fā)送:
WORD?CheckCRCModBus?(const?BYTE?*nData,?WORD?wLength) { BYTE?nTemp; WORD?wCRCWord?=?0xFFFF; const?WORD?wCRCTable[]?=?{ 0X0000,?0XC0C1,?0XC181,?0X0140,?0XC301,?0X03C0,?0X0280,?0XC241, 0XC601,?0X06C0,?0X0780,?0XC741,?0X0500,?0XC5C1,?0XC481,?0X0440, 0XCC01,?0X0CC0,?0X0D80,?0XCD41,?0X0F00,?0XCFC1,?0XCE81,?0X0E40, 0X0A00,?0XCAC1,?0XCB81,?0X0B40,?0XC901,?0X09C0,?0X0880,?0XC841, 0XD801,?0X18C0,?0X1980,?0XD941,?0X1B00,?0XDBC1,?0XDA81,?0X1A40, 0X1E00,?0XDEC1,?0XDF81,?0X1F40,?0XDD01,?0X1DC0,?0X1C80,?0XDC41, 0X1400,?0XD4C1,?0XD581,?0X1540,?0XD701,?0X17C0,?0X1680,?0XD641, 0XD201,?0X12C0,?0X1380,?0XD341,?0X1100,?0XD1C1,?0XD081,?0X1040, 0XF001,?0X30C0,?0X3180,?0XF141,?0X3300,?0XF3C1,?0XF281,?0X3240, 0X3600,?0XF6C1,?0XF781,?0X3740,?0XF501,?0X35C0,?0X3480,?0XF441, 0X3C00,?0XFCC1,?0XFD81,?0X3D40,?0XFF01,?0X3FC0,?0X3E80,?0XFE41, 0XFA01,?0X3AC0,?0X3B80,?0XFB41,?0X3900,?0XF9C1,?0XF881,?0X3840, 0X2800,?0XE8C1,?0XE981,?0X2940,?0XEB01,?0X2BC0,?0X2A80,?0XEA41, 0XEE01,?0X2EC0,?0X2F80,?0XEF41,?0X2D00,?0XEDC1,?0XEC81,?0X2C40, 0XE401,?0X24C0,?0X2580,?0XE541,?0X2700,?0XE7C1,?0XE681,?0X2640, 0X2200,?0XE2C1,?0XE381,?0X2340,?0XE101,?0X21C0,?0X2080,?0XE041, 0XA001,?0X60C0,?0X6180,?0XA141,?0X6300,?0XA3C1,?0XA281,?0X6240, 0X6600,?0XA6C1,?0XA781,?0X6740,?0XA501,?0X65C0,?0X6480,?0XA441, 0X6C00,?0XACC1,?0XAD81,?0X6D40,?0XAF01,?0X6FC0,?0X6E80,?0XAE41, 0XAA01,?0X6AC0,?0X6B80,?0XAB41,?0X6900,?0XA9C1,?0XA881,?0X6840, 0X7800,?0XB8C1,?0XB981,?0X7940,?0XBB01,?0X7BC0,?0X7A80,?0XBA41, 0XBE01,?0X7EC0,?0X7F80,?0XBF41,?0X7D00,?0XBDC1,?0XBC81,?0X7C40, 0XB401,?0X74C0,?0X7580,?0XB541,?0X7700,?0XB7C1,?0XB681,?0X7640, 0X7200,?0XB2C1,?0XB381,?0X7340,?0XB101,?0X71C0,?0X7080,?0XB041, 0X5000,?0X90C1,?0X9181,?0X5140,?0X9301,?0X53C0,?0X5280,?0X9241, 0X9601,?0X56C0,?0X5780,?0X9741,?0X5500,?0X95C1,?0X9481,?0X5440, 0X9C01,?0X5CC0,?0X5D80,?0X9D41,?0X5F00,?0X9FC1,?0X9E81,?0X5E40, 0X5A00,?0X9AC1,?0X9B81,?0X5B40,?0X9901,?0X59C0,?0X5880,?0X9841, 0X8801,?0X48C0,?0X4980,?0X8941,?0X4B00,?0X8BC1,?0X8A81,?0X4A40, 0X4E00,?0X8EC1,?0X8F81,?0X4F40,?0X8D01,?0X4DC0,?0X4C80,?0X8C41, 0X4400,?0X84C1,?0X8581,?0X4540,?0X8701,?0X47C0,?0X4680,?0X8641, 0X8201,?0X42C0,?0X4380,?0X8341,?0X4100,?0X81C1,?0X8081,?0X4040?}; ???while?(wLength--) ???{ ??????nTemp?=?*nData++?^?wCRCWord; ??????wCRCWord?>>=?8; ??????wCRCWord?^=?wCRCTable[nTemp]; ???} ???return?wCRCWord; }
4、注意,USR-TCP232-304模塊要作為server使用,(PS:很疑惑,要是作為client,那服務(wù)端怎么主動(dòng)和它發(fā)起通訊請(qǐng)求呢,肯定不行,因?yàn)闆](méi)有監(jiān)聽(tīng)端口,無(wú)從談起。)而且要配置為透?jìng)髂J?,否則485那一端的數(shù)據(jù)沒(méi)辦法收發(fā),所有的USR-TCP232-304-software-V1.0.1.pdf手冊(cè)上的那些命令,都是針對(duì)USR-TCP232-304模塊進(jìn)行配置的,包括配置什么端口,波特率啥玩意的,原理無(wú)非是發(fā)送接收解析命令格式,執(zhí)行相關(guān)的配置修改而已。