8通道电导率采集器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 332|回复: 0

8通道电导率采集器

[复制链接]
发表于 2022-1-7 03:17 | 显示全部楼层 |阅读模式
本帖最后由 王大富 于 2022-1-7 08:13 编辑

复制代码
  1. //这个为esp32的主机程序,硬件选择DOIT ESP32 DEVKIT V1
  2. #include <WiFi.h>
  3. #include <PubSubClient.h>                        //MQTT协议中的库
  4. #include <ArduinoJson.h>                         //调用Json数据库
  5. #include <Wire.h>
  6. #include "FastLED.h"                             //FastLED库用于调用随机函数库
  7. #include <stdlib.h>                              //接收数据的转化
  8. #include <stdio.h>

  9. #include "TD4027.h"
  10. #include "SDCARD.h"
  11. #include "HMI.h"

  12. ////////////////////////////////////////////////////////
  13. #define PRODUCT_ID "447665"                      //Onenote产品名(需修改)
  14. #define API_KEY    "KOPgb=Mqy3OgfZf8SE2eGjpSMoY="//"CDglbagwPMllUURDk9mO=qKTozU="//产品密钥(需修改)
  15. #define DEVICE_ID  "852782109"                   //设备名(需修改),与开发板没有关系,由平台生成的
  16. const char* mqttServer = "183.230.40.39";        //onenet地址(不修改)
  17. const uint16_t mqttPort = 6002;                  //mqtt接口端口(不修改)
  18. #define TOPIC      "ceshitopic1"                 //订阅主题
  19. ////////////////////////////////////////////////////////////
  20. #define RUNLED 22
  21. unsigned char nowpage = 0;
  22. ///////////////////////////////////////////////////////////                                 
  23. WiFiClient wifiClient;                           //
  24. PubSubClient mqttClient(wifiClient);             //
  25. //////////////////////////////////////////////
  26. int count=0,aa =0,bt=0,i=0,ii=0,j=0,jj=0,ij=0,nn=5,n=20,m=1,k=0,kk=0,N=0,NN=100;//一分钟发nn=20                              //定义参数变量
  27. float kvalue[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0},tt;
  28. float rawEC[8];
  29. float value[8] ;
  30. float ecValue[8] ;
  31. float advalue1[8];
  32. float ecValue_aver[8];
  33. float ecValue_sum[8];

  34. float ecValue_t[100][8];
  35. ///////////////////////////////////
  36. char msgJson[1000];//msgJson数据长度
  37. char msgJson1[1000];//msgJson数据长度
  38. char msg_buf[1000];//
  39. char msg_buf1[1000];//
  40. char dataTemplate0[] = "{"rtCH1":%.3f,"rtCH2":%.3f,"rtCH3":%.3f,"rtCH4":%.3f,"rtCH5":%.3f,"rtCH6":%.3f,"rtCH7":%.3f,"rtCH8":%.3f,"m":%d}"; //rt代表real time 实时数据
  41. char dataTemplate1[] = "{"CH1":%.3f,  "CH2":%.3f,  "CH3":%.3f,  "CH4":%.3f,  "CH5":%.3f,  "CH6":%.3f,  "CH7":%.3f,  "CH8":%.3f}"; //间隔指定时间的数据               

  42. //////////////////////////////////////////////  
  43. const char* ssid = "4G-UFI-5FD6";
  44. const char* password =  "onenetesp8266";
  45. /////////////////////////////////////////////////

  46. void setup() {
  47.   Serial.begin(9600);

  48.   TDInit();
  49.   pinMode(RUNLED, OUTPUT);
  50.   hmiInit(9600);

  51.   WiFi.mode(WIFI_STA);                          //设置wifi模式
  52.   WiFi.begin(ssid, password);
  53.   connectWiFi();                                //链接Wifi函数
  54.   mqttClient.setServer(mqttServer, mqttPort);   //mqttServer是onenet地址,mqtt接口端口mqttPort
  55.   mqttClient.setCallback(receiveCallback);      //设置MQTT订阅回调,函数
  56.   connectMQTTServer();                          //链接MQTT服务器函数
  57. }

  58. void loop() {
  59.   if (mqttClient.connected()) {                 //如果开发板成功连接服务器                                         
  60.       pubMQTTmsg();                             //调用pubMQTTmsg()函数发送数据到云端
  61.       mqttClient.loop();                        //调用回调函数,接收平台下发的数据
  62.   } else {                                      //如果开发板未能成功连接服务器
  63.     connectMQTTServer();                        //则尝试连接服务器
  64.   }
  65.   
  66. }

  67. void connectMQTTServer() {                     //通过MQTT协议链接Onenet
  68.   String clientId = DEVICE_ID;
  69.   String productId = PRODUCT_ID;
  70.   String apiKey = API_KEY;
  71.   if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
  72.     subscribeTopic();                          //订阅指定主题
  73.   } else {
  74.     delay(3000);
  75.   }
  76. }
  77.                                                
  78. void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
  79.   String topicString = "temperature"+ WiFi.macAddress();
  80.   char subTopic[topicString.length() + 1];
  81.   strcpy(subTopic, topicString.c_str());       //                                                
  82.   if (mqttClient.subscribe(subTopic)){         //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  83.   } else {
  84.   }
  85. }
  86. ///////////////////////////////////
  87. void receiveCallback(char* topic, byte* payload, unsigned int length) {//反调函数用于接收平台下发的消息              
  88.   for (int i = 0; i < length; i++){  //按字符一个一个输出
  89.   }
  90.   payload[length] = '\0'; // 添加一个空值使其转化为字符数组
  91.   String payload1=(char *)payload;
  92.   m = atoi((char *)payload);//将字符数组转化为整型数组
  93.   n=nn*m;
  94.   if (payload1 == "21")//测试下发数据,如果收到的信息以“21”为开始
  95.   {}
  96.   else if (payload1 == "20")
  97.   {}   
  98. }                                                                 
  99. ////////////////////////////////////////                                                                          
  100. void pubMQTTmsg() {                              //onenet数据点上传系统主题
  101.   String topicString = "$dp";
  102.   char publishTopic[topicString.length() + 1];
  103.   strcpy(publishTopic, topicString.c_str());     //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,json数据转换为数组

  104. /////////////////////////////////////////////////////////////
  105. for(ii=1;ii<=n;ii++){                                       
  106. connectMQTTServer();
  107. mqttClient.loop();                        //则尝试连接服务器
  108. ledFlash();
  109. ////////采集电导率数据/////////////////
  110.   readDataOntimer();
  111.   TDRListen();  
  112.   //ECdata();
  113.   
  114.   for (k = 0; k < NN; k++)
  115.   {readDataOntimer();//发送问询帧
  116.    TDRListen();//接收问询帧
  117.    ECdata();//根据测试电压计算电导率
  118.    
  119.    
  120.    for (i = 0; i < 8; i++)
  121.         {ecValue_t[k][i]=ecValue[i];
  122.         
  123.         }//行是读取次数,列是通道数        
  124.        delay(10);//间隔10ms采集一个数据
  125.   }
  126.   
  127.   sort();//数据排序
  128.    
  129.   for (j = 0; j < 8; j++)
  130.       {ecValue_sum[j]=0;N=0;
  131.       for (k = 20; k < 80; k++)
  132.           {ecValue_sum[j]+=ecValue_t[k][j];N++;         
  133.           }//去掉前后各20个数据
  134.       ecValue[j]=ecValue_sum[j]/N;//取剩下数据平均值
  135.       }

  136.   hmiListen();
  137.   showToHMI();

  138. //////////////////////////////////////////////////////////////  
  139. snprintf(msgJson, 800, dataTemplate0,ecValue[0],ecValue[1],ecValue[2],ecValue[3],ecValue[4],ecValue[5],ecValue[6],ecValue[7],m);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson   
  140.   int json_len = strlen(msgJson);                //msgJson的长度
  141.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  142.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  143.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  144.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  145.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  146.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  147. }
  148. //////////////////////////////////////////////////
  149. snprintf(msgJson1, 800, dataTemplate1,ecValue[0],ecValue[1],ecValue[2],ecValue[3],ecValue[4],ecValue[5],ecValue[6],ecValue[7]);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson   
  150.   int json_len1 = strlen(msgJson1);                //msgJson的长度
  151.   msg_buf1[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  152.   msg_buf1[1] = char(json_len1 >> 8);              //数据第二位是要发送的数据长度的高八位
  153.   msg_buf1[2] = char(json_len1 & 0xff);            //数据第三位是要发送数据的长度的低八位
  154.   memcpy(msg_buf1 + 3, msgJson1, strlen(msgJson1)); //从msg_buf的第四位开始,放入要传的数据msgJson
  155.   msg_buf1[3 + strlen(msgJson1)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了  
  156.   mqttClient.publish("$dp", (uint8_t *)msg_buf1, 3 + strlen(msgJson1)); //发送数据到主题$dp         
  157. }

  158. void connectWiFi() {                              //wifi连接函数   
  159.   int ii=0;  
  160.   while (WiFi.status()!= WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
  161.   delay(1000);
  162.   }
  163.   Serial.println('\n');                     // WiFi连接成功后
  164.   Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  165.   Serial.println(WiFi.SSID());              // 连接的WiFI名称
  166.   Serial.print("IP address:\t");            // 以及IP
  167.   Serial.println(WiFi.localIP());           // NodeMCU的IP地址  
  168. }
  169. /////////////////////////////////////////////////////////////////////////
  170. void ECdata()
  171. { for (kk = 0; kk < 8; kk++)
  172.   {rawEC[kk] = (double)advalue[kk]*1000/820/196;//需要数据类型转换
  173.   value[kk] = rawEC[kk]*kvalue[kk];
  174.   ecValue[kk]=value[kk]/(1.0+0.0185*(25-25.0));
  175.   }
  176. }


  177. float sort()
  178. {
  179. float temp1;
  180. for(ij=0;ij<8;ij++)
  181.     {for(ii=0;ii<NN-1;ii++)
  182.       {for(jj=0;jj<NN-1-ii;jj++)
  183.         {if(ecValue_t[jj][ij]>ecValue_t[jj+1][ij])
  184.             {temp1=ecValue_t[jj][ij];
  185.              ecValue_t[jj][ij]=ecValue_t[jj+1][ij];
  186.              ecValue_t[jj+1][ij]=temp1;
  187.             }
  188.         }
  189.       }
  190.     }

  191. }
  192. ///////////////////////////////////////////////////////////////
  193. void ledFlash()
  194. {
  195.   static unsigned long ledtimer;
  196.   static bool output;
  197.   if (millis() - ledtimer >= 1000)
  198.   {
  199.     ledtimer = millis();
  200.     digitalWrite(RUNLED, output);
  201.     output = !output;
  202.   }


  203. }

  204. /*  HMI按键回调函数
  205.    使用方法:如果在HMI端的按键勾选了“发送键值”,则可以在case 后添加 0x页面+按键+事件
  206.    如果自定义 printh 65 03 12 01  则case 后面是 0x031201
  207.    所有按键的动作都在这个函数里写
  208. */

  209. void keyEventCallBack(unsigned long keyvalue)
  210. {

  211.   switch (keyvalue)
  212.   {
  213.     case 0x000100: //进入主菜单
  214.       nowpage = 1;
  215.       break;

  216.     case 0x010100: //进入通道电压监视
  217.       nowpage = 2;
  218.       delay(500); //页面滑动,最好阻塞一下
  219.       break;
  220.   }
  221.   keyvalue = 0;
  222. }

  223. void showToHMI()
  224. {
  225.   if ( nowpage == 2)
  226.   {
  227.     String texttemp = "";
  228.     texttemp = advalue[0];
  229.     writeTextbox("t0", texttemp);
  230.     delay(2);  //指令间加点延时,不至于两条指令混了
  231.     texttemp = advalue[1];
  232.     writeTextbox("t1", texttemp);
  233.     delay(2);
  234.     texttemp = advalue[2];
  235.     writeTextbox("t2", texttemp);
  236.     delay(2);
  237.     texttemp = advalue[3];
  238.     writeTextbox("t3", texttemp);
  239.     delay(2);
  240.     texttemp = advalue[4];
  241.     writeTextbox("t4", texttemp);
  242.     delay(2);
  243.     texttemp = advalue[5];
  244.     writeTextbox("t5", texttemp);
  245.     delay(2);
  246.     texttemp = advalue[6];
  247.     writeTextbox("t6", texttemp);
  248.     delay(2);
  249.     texttemp = advalue[7];
  250.     writeTextbox("t7", texttemp);
  251.     delay(2);
  252.   }
  253. }
复制代码


HMI.h


  1. /*
  2. * 这是HMI的头文件,有些功能可能并没有用到
  3. */
  4. #define  hmiSerial Serial2

  5. unsigned char hmi_done_flag = false;
  6. //unsigned char  key_page = 0;
  7. //unsigned char  key_id = 0;   
  8. //unsigned char  key_event = 0; //按键事件,00
  9. unsigned char  string_return_flag=false;
  10. unsigned char  page_switch_flag = false;
  11. unsigned char page_id=0;
  12. unsigned char hmiBuf[32];
  13. String textbox_text="";

  14. extern void keyEventCallBack(unsigned long keyvalue);
  15. void sendEnd(void) {
  16.   hmiSerial.write(0xff);
  17.   hmiSerial.write(0xff);
  18.   hmiSerial.write(0xff);
  19. }
  20. void  hmiInit(unsigned int bandrate) {
  21.   
  22.   hmi_done_flag = false;
  23. //  key_page = 0;
  24. //  key_id = 0;
  25. //  key_event = 0; //按键事件,00
  26.   string_return_flag=false;
  27.   page_switch_flag = false;
  28.   hmiSerial.begin(bandrate);
  29. }

  30. void writeTextbox(String textbox_name, String textbox_text) {
  31.   hmiSerial.print(textbox_name);
  32.   hmiSerial.print(".txt=");
  33.   hmiSerial.print(""");
  34.   hmiSerial.print(textbox_text);
  35.   hmiSerial.print(""");
  36.   sendEnd();
  37. }

  38. void selectPage(unsigned char page_id) {
  39.   String page = "";
  40.   page = page_id;
  41.   hmiSerial.print("page");
  42.   hmiSerial.write(0x20);  //空格
  43.   hmiSerial.print(page);
  44.   sendEnd();
  45. }

  46. void writePicturebox(String picturebox_name, unsigned char picture_id) {
  47.   String pic = "";
  48.   pic = picture_id;
  49.   hmiSerial.print(picturebox_name);
  50.   hmiSerial.print(".pic=");
  51.   hmiSerial.print(pic);
  52.   sendEnd();
  53. }

  54. void writeNumbox(String numbox_name, int num) {
  55.    hmiSerial.print(numbox_name);
  56.   
  57.   if(num<0)
  58.   {hmiSerial.print(".val=-");
  59.   hmiSerial.print(abs(num));
  60.   }else
  61.   {hmiSerial.print(".val=");
  62.   hmiSerial.print(num);}
  63.   sendEnd();
  64. }

  65. void setCombox(String Combox_name,unsigned char cbval) //设置下拉框
  66. {
  67.    hmiSerial.print(Combox_name);
  68.   hmiSerial.print(".val=");
  69.   hmiSerial.print(cbval);
  70.   sendEnd();
  71.   }


  72. void writefloat(String floatname, unsigned int floatval) //写入虚拟浮点数,小数点在HMI端设定
  73. {
  74.   hmiSerial.print(floatname);
  75.   hmiSerial.print(".val=");
  76.   hmiSerial.print(floatval, DEC);
  77.   sendEnd();
  78. }

  79. int key_data_return1=0;  //数值返回后合成的int
  80. int key_data_return2=0;  //数值返回后合成的int

  81. void hmiListen(void) {
  82.   unsigned char hmi_num = 0;
  83.   while (hmiSerial.available()) {
  84.     char inChar = (char)hmiSerial.read();
  85.     hmiBuf[hmi_num] = inChar;
  86.     hmi_num++;
  87.     hmi_done_flag = true;
  88.     delay(2);//一定要加这个延时,否则串口最后一个字节可能收不到
  89.   }

  90.   if (hmi_done_flag == true)
  91.   {
  92.     if (hmiBuf[0] == 0x65) //按键事件
  93.     {
  94.       unsigned long keyvalue=hmiBuf[1]*0x10000+hmiBuf[2]*0x100+hmiBuf[3];   
  95.    //   key_page = hmiBuf[1];
  96.    //   key_id = hmiBuf[2];
  97.    //   key_event = hmiBuf[3];
  98.       key_data_return1=hmiBuf[5]*0x100+hmiBuf[4];
  99.       key_data_return2=hmiBuf[9]*0x100+hmiBuf[8];
  100.      if(key_data_return2>=32768)
  101.     {
  102.       key_data_return2=-1*(65536-key_data_return2);
  103.       }
  104.       keyEventCallBack(keyvalue);
  105.   
  106.     }
  107.     if (hmiBuf[0] == 0x66) //页面切换事件,在HMI端前初始化事件中加入 printh 66 02 FF FF FF,02代表页面ID
  108.     {
  109.       page_id = hmiBuf[1];
  110.     }
  111.     if(hmiBuf[0]==0x70)  //get返回
  112.     {
  113.       unsigned char i=1;
  114.       textbox_text="";
  115.       while(hmiBuf[i]!=0xff)
  116.       {
  117.         textbox_text+=char(hmiBuf[i]);
  118.         i=i+1;
  119.       }
  120.      string_return_flag=true;
  121.      }
  122.     hmi_done_flag = false;
  123.   }
  124. }

  125. void clearBuf(void) {
  126.   hmiSerial.print("code_c");
  127.   sendEnd();
  128. }

  129. void resetHmi()  //重启
  130. {
  131.    hmiSerial.print("rest");
  132.    sendEnd();
  133. }
复制代码
SDCARD.h
  1. /*
  2.   依赖外部库:esp32-micro-sdcard-master.zip
  3. */
  4. #include <SPI.h>
  5. #include <mySD.h>
  6. File root;

  7. bool SD_init()
  8. {
  9.   bool initflag = false;
  10.   // Serial.begin(115200);
  11.   // Serial.print("Initializing SD card...");
  12.   /*初始化SD库SPI引脚*/
  13.   if (!SD.begin(5, 23, 19, 18)) {
  14.     initflag = false;
  15.   } else
  16.   {
  17.     initflag = true;
  18.   }
  19.   return initflag;
  20.   Serial.println("initialization done.");

  21. }
  22. /*从根目录root“/”*/
  23. bool SD_openFileToWriteOnce(char *filepath,String text)
  24. {
  25.      root = SD.open(filepath, FILE_WRITE);
  26.      if(root)
  27.      {
  28.      root.println(text);
  29.      root.flush();
  30.      /*关闭文件 */
  31.      root.close();
  32.      return 1;
  33.      }else
  34.      return 0;
  35. }
复制代码
TD4027.h


  1. HardwareSerial mySerial(1);

  2. #define TDSerial Serial
  3. #define DebugSerial mySerial
  4. #define RS485DIR 21 //RS485的方向引脚

  5. bool TDflag = false;
  6. #define SLAVE_ARRDESS 0x01

  7. const unsigned char readcmd[8] = {SLAVE_ARRDESS, 0x03, 0x00, 0x08, 0x00, 0x08, 0xC5, 0xCE};
  8. unsigned char combuf[32];
  9. int advalue[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  10. /*********
  11.    //将两个字节转为16位的有符号int,因为esp32是32位机,单纯转为会出错。
  12.    输入(高字节,低字节)
  13.    输出,16位有符号整数
  14. */
  15. int byteToInt16(unsigned char highbyte, unsigned char lowbyte)
  16. {
  17.   int a;
  18.   a = highbyte * 0x100 + lowbyte;
  19.   if (a >= 32768)
  20.   {
  21.     a = -1 * (65536 - a);
  22.   }
  23.   return a;
  24. }


  25. void DebugOutput()
  26. {

  27.   DebugSerial.print("AD0:");
  28.   DebugSerial.println(advalue[0], DEC);
  29.   DebugSerial.print("AD1:");
  30.   DebugSerial.println(advalue[1], DEC);
  31.   DebugSerial.print("AD2:");
  32.   DebugSerial.println(advalue[2], DEC);
  33.   DebugSerial.print("AD3:");
  34.   DebugSerial.println(advalue[3], DEC);
  35.   DebugSerial.print("AD4:");
  36.   DebugSerial.println(advalue[4], DEC);
  37.   DebugSerial.print("AD5:");
  38.   DebugSerial.println(advalue[5], DEC);
  39.   DebugSerial.print("AD6:");
  40.   DebugSerial.println(advalue[6], DEC);
  41.   DebugSerial.print("AD7:");
  42.   DebugSerial.println(advalue[7], DEC);


  43. }

  44. void TDInit()
  45. {
  46.   TDSerial.begin(9600);
  47.   DebugSerial.begin(9600);
  48. //33脚:RXD
  49. //25脚:TXD
  50.   mySerial.begin(9600,SERIAL_8N1,33,25);
  51.   DebugSerial.println("debug");
  52.   pinMode(RS485DIR, OUTPUT);
  53.   digitalWrite(RS485DIR, LOW);
  54. }



  55. void readDataOntimer() //定时读取,放在loop中
  56. {
  57.   static unsigned char read_status;
  58.   static unsigned long read_timer;

  59.   switch (read_status)
  60.   {
  61.     case 0:
  62.       digitalWrite(RS485DIR, HIGH);
  63.       delay(2);
  64.       TDSerial.write(readcmd, 8);
  65.       delay(8); //延时20ms,等待数据发送完毕,波特率是9600,使用10位异步通信,则每秒可传960个字节,每个字节(字符)1.04毫秒。
  66.       digitalWrite(RS485DIR, LOW);
  67.       read_timer = millis();
  68.       read_status++;
  69.       break;

  70.     case 1:
  71.       if (millis() - read_timer >= 1000)
  72.       {
  73.         read_status = 0;
  74.       }
  75.       break;
  76.       default:
  77.       break;
  78.   }

  79. }


  80. void TDRListen()  //放在loop中
  81. {
  82.   unsigned char num = 0;
  83.   while (TDSerial.available()) {
  84.     char inChar = (char)TDSerial.read();
  85.     combuf[num] = inChar;
  86.     num++;
  87.     TDflag = true;
  88.     delay(2);//一定要加这个延时,否则串口最后一个字节可能收不到
  89.   }

  90.   if (TDflag == true)
  91.   {
  92.     if (combuf[0] == SLAVE_ARRDESS and combuf[1] == 0x03) //并没有验证CRC,所以这方式不是最可靠的
  93.     {
  94.       advalue[0] = byteToInt16(combuf[3], combuf[4]);
  95.       advalue[1] = byteToInt16(combuf[5], combuf[6]);
  96.       advalue[2] = byteToInt16(combuf[7], combuf[8]);
  97.       advalue[3] = byteToInt16(combuf[9], combuf[10]);
  98.       advalue[4] = byteToInt16(combuf[11], combuf[12]);
  99.       advalue[5] = byteToInt16(combuf[13], combuf[14]);
  100.       advalue[6] = byteToInt16(combuf[15], combuf[16]);
  101.       advalue[7] = byteToInt16(combuf[17], combuf[18]);
  102.       combuf[0] = 0;
  103.       combuf[1] = 0;
  104.       //DebugOutput();  ///调试输出,可以去掉此句
  105.     }
  106.     TDflag = false;
  107.   }


  108. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:47 , Processed in 0.229229 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表