PressureSensor.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "PressureSensor.h"
  2. #include "Modbus.h"
  3. PressureSensor::PressureSensor(SerialUi* pSerial)
  4. {
  5. m_pSerial = pSerial;
  6. }
  7. bool PressureSensor::Read(float& pressure)
  8. {
  9. QByteArray tx_buf;
  10. char zero = 0x00;
  11. tx_buf.append(PRESSURESENSOR_ADDRESS);
  12. tx_buf.append(0x04);
  13. tx_buf.append(zero);
  14. tx_buf.append(zero);
  15. tx_buf.append(zero);
  16. tx_buf.append(0x02);
  17. unsigned short crc;
  18. crc=CRC16_MODBUS((unsigned char *)tx_buf.data(),tx_buf.size());
  19. tx_buf.append((crc>>8)&0xff);
  20. tx_buf.append(crc&0xff);
  21. QByteArray rx_buf;
  22. rx_buf = m_pSerial->serialWriteReponse(tx_buf);
  23. if(rx_buf.size() > 0){
  24. if(check_crc(rx_buf)){
  25. char value[4];
  26. value[3] = rx_buf.at(5);
  27. value[2] = rx_buf.at(6);
  28. value[1] = rx_buf.at(3);
  29. value[0] = rx_buf.at(4);
  30. float* p = (float*)value;
  31. pressure = *p;
  32. return true;
  33. }else{
  34. qDebug("PressureSensor::Read <<< check crc failed");
  35. return false;
  36. }
  37. }else{
  38. qDebug("PressureSensor::Read <<< no data received");
  39. return false;
  40. }
  41. }
  42. bool PressureSensor::Set_Zero()
  43. {
  44. QByteArray tx_buf;
  45. char zero = 0x00;
  46. tx_buf.append(PRESSURESENSOR_ADDRESS);
  47. tx_buf.append(0x06);
  48. tx_buf.append(zero);
  49. tx_buf.append(0x1E);
  50. tx_buf.append(zero);
  51. tx_buf.append(0x01);
  52. unsigned short crc;
  53. crc=CRC16_MODBUS((unsigned char *)tx_buf.data(),tx_buf.size());
  54. tx_buf.append((crc>>8)&0xff);
  55. tx_buf.append(crc&0xff);
  56. QByteArray rx_buf;
  57. rx_buf = m_pSerial->serialWriteReponse(tx_buf);
  58. if(rx_buf.size() > 0){
  59. if(check_crc(rx_buf)){
  60. return true;
  61. }else{
  62. qDebug("PressureSensor::Set_Zero <<< check crc failed");
  63. return false;
  64. }
  65. }else{
  66. qDebug("PressureSensor::Set_Zero <<< no data received");
  67. return false;
  68. }
  69. }
  70. bool PressureSensor::check_crc(QByteArray data)
  71. {
  72. int size = data.size();
  73. unsigned short crc1 =0, crc2= 0;
  74. unsigned char crc_h = data.at(size-2);
  75. unsigned char crc_l = data.at(size-1);
  76. crc1 = (crc_h <<8) |crc_l;
  77. crc2 = CRC16_MODBUS((unsigned char *)data.data(),data.size()-2);
  78. if(crc1 == crc2){
  79. return true;
  80. }else{
  81. return false;
  82. }
  83. }