使用STONE系列串口屏在医疗手术领域应用的解决方案

医疗手术记录项目最初基于一个面向外科医生的微信云开发小程序。

腾讯为微信云开发小程序提供5GB免费云存储空间,足以满足普通用户个人账户的需求,且云存储具备随时随地访问的特性, 随时随地访问。只要有Wi-Fi和流量,拿起手机,打开微信,即可调用自己的小程序访问、查询和统计私人数据。

通过小程序提供的时段查询功能,您可以轻松快速地查询某年或某月的手术数量。通过小程序的综合查询和统计功能,您可以输入不同的“关键词”来统计某家医院、某位 部分、特定治疗技术 以及其他具体描述。

在手术室中,我们更适合使用STONE系列串口屏,该屏幕为医疗设备提供更安全可靠的显示和控制界面。记录医疗手术笔记

如果我们在手术室中需要输入这些手术内容,手术设备的型号和参数当然更容易获取,甚至可以通过系统共享获取,更加准确,并节省二次录入。当然,此类功能需要在设备预先规划,这里我通过STONE串口屏演示了此微信小程序功能(不涉及数据库和云存储)。

感兴趣的读者还可以通过蓝牙配对,实现系统与手机的数据共享,完成本地数据云存储及云数据下载至本地,通过蓝牙还可实现手机对STONE串口屏的控制,以及屏幕向手机端的反馈等。

该Chat 小程序基于 JavaScript,而 STONE 串口屏项目基于 Arduino ESP32 环境。

STONE 接口的医师手术记录项将按以下方式扩展。

描述

  • HMI 和控制创建说明
  • 接口下载
  • 硬件连接与命令测试
  • 调试代码
  • 附录:ASCII 码表

1、串口屏HMI与控制创建说明

如图 (2) 所示,通过不同按钮可访问手术记录(图 (3))、时间段查询(图 (5))和综合查询功能(图 (7))。

如图(3)所示,手术记录界面首先通过文本选择控件选择手术时间:年、月、日,然后选择手术部位,接着通过编辑控件填写手术地点、手术所用关键设备及手术描述,完成后点击保存按钮,系统将弹出记录成功界面(如图(4)所示)。

Record medical procedure notes with STONE serial LCD Screen

图(2) 电源开启功能界面

串口屏

图(3)手术记录界面

点击图(4)屏幕上的返回按钮可返回图(2)的功能界面。若选择时间段查询,将进入图(5)界面,在此也可通过文本选择控件选择查询的起始日期和结束日期的年、月、日,然后点击红色按钮进入图(6)的查询结果显示界面。

Record medical procedure notes with STONE serial LCD Screen

图(4)记录成功界面

串口屏

图(5)时间段查询界面

图(6)将显示指定时间段内总共记录的手术数量,并在屏幕中部显示第一例手术的内容,点击“下一例”按钮将依次显示第二例和第三例的内容。这些内容通过ESP32控制表与STONE串口屏通信,传递至标签控件,并通过HScroll_label滚动控件显示。年、月、日及总程序数均为标签控件,其余均为HScroll_label控件,用于滚动显示更多内容。点击“返回”按钮可返回功能界面(图 (2)中的功能界面。若在图(2)中选择综合查询功能,将进入图(7)的界面。

串口屏

图(6) 时间段查询结果界面

Record medical procedure notes with STONE serial LCD Screen

图(7) 综合查询功能界面

在图(7)中,通过编辑输入关键词,点击读取按钮进入图(8)的结果界面,点击返回按钮返回图(2)。

在图(8)中,与图(6)类似,显示与关键词匹配的手术总数,并提供“下一页”按钮以显示所有手术内容。点击“返回”按钮可返回图(2)。

上述涉及编程需求的各界面控件名称、范围及内容以统一方式展示,便于编程时快速查阅。

Record medical procedure notes with STONE serial LCD Screen

图(8)集成查询结果界面

编程控件名称。

手术记录界面保存按钮:名称 = b12

手术记录内容文本选择器,名称为: 年 = ts11,月 = ts12,日 = ts13,部位 = ts14

其中。

ts11(2000 – 2099),ts12(1 – 12)月,ts13(1 – 31)日。

ts14(1:左肾;2:右肾;3:左输尿管;4:右输尿管;5:膀胱;6:尿道;7:其他;)

手术记录内容编辑,名称为。

位置 = e11,设备 = e12,描述 = e13

手术时间段查询阅读按钮:名称 = b32

开始日期:年 = ts31,月 = ts32,日 = ts33

结束日期:年 = ts34,月 = ts35,日 = ts36

范围同上。

时间段查询结果下一页按钮:名称 = b42

标签显示名称如下。

年 = l41,月 = l42,日 = l43,总数 = l44

Hscroll 标签显示名称分别如下。

位置 = hl41,设备 = hl42,部分 = hl43,描述 = hl44,期间 = hl45

关键词读取按钮: 名称 = b52,编辑名称 = e51

关键词查询结果 下一页按钮:名称 = b62

标签显示名称如下。

年 = l61,月 = l62,日 = l63,总数 = l64

Hscroll 标签分别显示名称。

位置 = hl61,设备 = hl62,部件 = hl63,描述 = hl64,期间 = hl65

2、接口下载

请参考充电桩项目中的方法 B 成功下载接口。

3. 硬件连接与命令测试

Record medical procedure notes with STONE serial LCD Screen

图 (9) 串口助手命令测试 V1.2 适配器板跳线连接图

STONE 软件的新版本正在持续升级和优化,使用过程中发现部分功能与手册描述存在差异,因此在编程前需验证需使用的命令。根据图(9)连接,并通过串口助手检查 STONE 的反馈,验证命令的有效性。

本项目涉及的控制元件包括按钮、标签、HScroll_Label、编辑框和文本选择器,共五种,我们将逐一测试并验证。

按钮相关:

0x1001 按钮键值主动发送

键值(数据段的最后一个字节):

0x01 按下按钮

0x02 释放按钮(按钮触发点击事件完成)

示例:

手术记录屏幕的保存按钮(名称=b12)被按下以主动发送命令。

ST<0x10 0x01 0x00 0x04 b12 0x01>ET

串口助手返回十六进制数据: 验证通过

53 54 3C 10 01 00 04 62 31 32 01 3E 45 54 5C 4F

按钮释放(按钮点击操作完成) 主动命令

ST<0x10 0x01 0x00 0x04 b12 0x02>ET

串口助手返回十六进制数据: 验证通过

53 54 3C 10 01 00 04 62 31 32 02 3E 45 54 18 4F

注:按钮 b12(ASCII 码 0x62 0x31 0x32)。

标签相关:

set_text 设置标签显示的文本

示例:

设置文本:(关键词查询总数 = l64)

ST<{“cmd_code”: “set_text”, “type”: “label”, “widget”: “l64”, ‘text’: “520”}>ET 验证顶部屏幕是否正常

hscroll_label 相关:

set_text 设置 hscroll_label 显示的文本

示例:

设置文本:

ST<{“cmd_code”: “set_text”, “type”: “hscroll_label”, “widget”: “hl61”, “text”: “ShenZhen”}>ET NG

ST<{“cmd_code”: “set_text”, “type”: “label”, “widget”: “hl61”, ‘text’: “ShenZhen”}>ET OK

注意:NG 是手册中给出的命令格式,OK 是本人成功尝试在屏幕上显示时使用的命令格式!这是验证中的重要发现!记录医疗手术笔记

编辑相关:

get_text 获取编辑框中显示的内容

0x1070 编辑文本发布 (主动-被动发送可在编辑数据更改后主动发送,或通过 get_text 主动触发)

文本:“控制名称”:文本内容 数据长度不得超过 1024 字节(冒号后面的文本内容)

示例:

获取文本:(编辑控制名称 = e11,位于手术记录位置)

ST<{“cmd_code”: “get_text”, “type”: “edit”, ‘widget’: “e11”}>ET

串口助手反馈的十六进制数据如下。

53 54 3C 10 70 00 0C 22 65 31 31 22 3A 61 62 63 64 65 66 3E 45 54 20 FF

编辑文本数据以发送命令: 验证 OK

ST< 0x10 0x70 0x00 0x0C “e11”: abcdef >ET e11 文本数据:abcdef

文本选择器相关:

get_text 获取文本选择器的当前文本

get_value 获取文本选择器的当前值

get_selected 获取文本选择器当前选中项的序列号(获取当前选中项的序列号)

0x1080 文本选择器文本下行 (被动发送,MCU使用get_text主动获取)

0x1081 文本选择器值发送 (整数类型,主动/被动发送:MCU使用get_value命令获取)

0x1082 文本选择器序列号发送 (整数类型 被动:MCU 使用 get_selected 命令获取)

数据格式:

文本文本:“控制名称”:文本内容 长度不超过 1024 字节(控制名称后跟数字的文本内容)

值值:数据段的最后四个字节

索引值:数据段的最后四个字节

示例 1:(现场控制名称为 ts14,当前程序记录为 “1:left renal;”,序列号为 0)

获取文本选择器 t14 的当前文本:

ST<{“cmd_code”: “get_text”, “type”: “text_selector”, ‘widget’: “ts14”}>ET

串口助手反馈的十六进制数据为。

53 54 3C 10 80 00 11 22 74 73 31 34 22 3A 6C 65 66 74 20 72 65 6E 61 6C 3E 45 54 F1 FE

屏幕上显示的指令为。

ST< 0x10 0x80 0x00 0x11 “ts14”:left renal >ET ts14 文本数据: 左肾正常

获取文本选择器 t14 的当前值:

ST<{“cmd_code”: “get_value”, “type”: “text_selector”, ‘widget’: “ts14”}>ET

串行助手反馈的十六进制数据为。

53 54 3C 10 81 00 08 74 73 31 34 00 00 00 01 3E 45 54 DE CA OK

屏幕上显示的指令为。

ST<0x10 0x81 0x00 0x08 ts14 0x00 0x00 0x00 0x00 0x01 >ET ts14 当前值数据:1

获取文本选择器 t14 的当前序列号:

ST<{“cmd_code”: “get_selected”, “type”: “text_selector”, ‘widget’: “ts14”}>ET

串行助手反馈的十六进制数据为:(ts14 为 “1:left renal;”,序列号为 0)

53 54 3C 10 82 00 08 74 73 31 34 00 00 00 00 3E 45 54 21 C8 OK

屏幕上显示的指令为。

ST<0x10 0x82 0x00 0x08 ts14 0x00 0x00 0x00 0x00 0x00 0x00 >ET ts14 当前序列号:0

注:ts14 的选项为。

1:左肾;2:右肾;3:左输尿管;4:右输尿管;5:膀胱;6:尿道;7:其他;

*** 该代码使用 get_value 获取数值,并使用 get_selected 获取当前选中项的序列号(从 0 开始)。

示例 2:(手术记录名称的年份控制,选项:2000-2099,当前值:2022)

获取文本选择器 t11 的当前文本:

ST<{“cmd_code”: “get_text”, “type”: “text_selector”, ‘widget’: “ts11”}>ET

序列号助手反馈的十六进制数据为: (ts11 是 2022)

53 54 3C 10 80 00 0B 22 74 73 31 31 22 3A 32 30 32 32 3E 45 54 D7 37

屏幕上显示的指令为:

ST< 0x10 0x80 0x00 0x0B “ts11”:2022 >ET ts11 当前文本:2022 OK

获取文本选择器 t11 的当前值:

ST<{“cmd_code”: “get_value”, “type”: “text_selector”, ‘widget’: “ts11”}>ET

串口助手反馈的十六进制数据为。

53 54 3C 10 81 00 08 74 73 31 31 00 00 07 E6 3E 45 54 95 89 OK

屏幕上显示的指令为。

ST<0x10 0x81 0x00 0x08 ts11 0x00 0x00 0x07 0xE6 >ET ts11的当前值:2022 = 7E6

获取文本选择器t11的当前序列号:

ST<{“cmd_code”: “get_selected”, “type”: “text_selector”, ‘widget’: “ts11”}>ET

串口助手反馈的十六进制数据为: (0x16 = 22)

53 54 3C 10 82 00 08 74 73 31 31 00 00 00 16 3E 45 54 56 0C OK

屏幕上显示的指令为:

ST<0x10 0x82 0x00 0x08 ts11 0x00 0x00 0x00 0x00 0x16 >ET ts11 当前串口编号:0x16 = 22

通过上述命令测试后,下一步是编程外科医生记录、查询和统计功能。当然,首先仍需确保硬件连接。我们使用ESP32开发板实现与STONE串口屏幕的通信。

如图(10)所示,NodeMCU-32S开发板的TX0、RX0和GND引脚需与STONE屏幕适配器板的对应引脚连接,详见图 (11)所示,以完成人机界面(HMI)信息交互。STONE屏幕接口为232信号,通过V1.2适配器板进入MCU接口时需转换为TX、RX信号,以实现电平匹配。图 (11) 显示 NodeMCU-32S 开发板位于左侧,蓝色(TX0)和红色(RX0)导线连接至 V1.2 适配器板的跳线位置(移除蓝色跳线后),黑色导线连接至 GND。

Record medical procedure notes with STONE serial LCD Screen

图(10) NodeMCU-32S开发板的TX0和RX0位置示意图

Record medical procedure notes with STONE serial LCD Screen

图(11) NodeMCU-32S开发板与V1.2适配器板的通信连接示意图

4、调试代码

由于空间限制,本项目重点在于按钮解码及查询统计编程。关于系统规划前的记录输入或数据共享,或手机蓝牙导入等细节解码,在此不做展开。以下收集的程序代码已验证,具体运行效果请参考视频。记录医疗手术笔记

/*
  Frank for Doctor T in 2022.05.01
  use ESP32 of NodeMCU-32s in arduino 1.8.13
  use STONE HMI in shenzhen
*/
//------Doctor T use----------2022.05.01------
int iSave = 0; // 1 = save key is true, 0 = save key is false.
int iReadTime = 0; // 1 = read time find is true, 0 = false.
int iNextTime = 0; // 1 = read time next is true, 0 = false.
int iReadWord = 0; // 1 = read word find is true, 0 = false.
int iNextWord = 0; // 1 = read word next is true, 0 = false.
int yearStart,monthStart,dayStart,yearEnd,monthEnd,dayEnd; //int (-32768,32767) unsigned int(0,65535)
String iwordIn,iwordBuf; // note: S is big of s.
int years[10],months[10],days[10];
String locations[10],equipments[10],parts[10],descriptions[10];
int totalTime,totalWord;
int iNumRecord = 0; // record num!
int nowNumWord = -1; //
int nowNumTime = -1; //
int i3;
int LED_blue = 2; // IO2, turn the LED on (HIGH is the voltage level)
int ii = 0;
int iii = 0;
//------------
unsigned int time_1s=0;
unsigned int time_1m=0;
unsigned int time_1h=0;
void setup() {
  Serial.begin(115200);
  pinMode(LED_blue, OUTPUT);
}
void loop() {
  
  int inChar;
    
  // Read the information sent by the serial port and simply decode it:  
  if (Serial.available() > 0) {inChar = Serial.read();}        
  if (inChar == 0x62)
  {
    if (Serial.available() > 0){inChar = Serial.read();}
    if (inChar == 0x31) {
       if (Serial.available() > 0){ inChar = Serial.read();}
       if (inChar == 0x32)
       {
         if (Serial.available() > 0){ inChar = Serial.read();}
         if (inChar == 0x02)
         {
              iSave = 1; //62 31 32 02 is save key ok!
              iReadWord = 0;  
              iReadTime = 0;  
              iNextWord = 0;
              iNextTime = 0;  
         }
       }
    } else if (inChar == 0x33)
    {
       if (Serial.available() > 0){ inChar = Serial.read();}
       if (inChar == 0x32)
       {
         if (Serial.available() > 0){ inChar = Serial.read();}
         if (inChar == 0x02)
         {
             iReadWord = 0;
             iReadTime = 1; //62 33 32 02 is time read key ok!
             iNextWord = 0;
             iNextTime = 0;
             i3 = 0;
             totalTime = 0;
             nowNumTime = 0;  
         }
       }
    } else if (inChar == 0x34)
    {
       if (Serial.available() > 0){ inChar = Serial.read();}
       if (inChar == 0x32)
       {
          if (Serial.available() > 0){ inChar = Serial.read();}
          if (inChar == 0x02)
          {
              iNextWord = 0;
              iNextTime = 1; //62 34 32 02 is time Next key ok!
          }
       }
    } else if (inChar == 0x35)
    {
       if (Serial.available() > 0){ inChar = Serial.read();}
       if (inChar == 0x32)
       {
           if (Serial.available() > 0){ inChar = Serial.read();}
           if (inChar == 0x02)
           {
              iReadWord = 1; //62 35 32 02 is word read key ok!
              iReadTime = 0;  
              iNextWord = 0;
              iNextTime = 0;  
              i3 = 0;
              totalWord = 0;
              nowNumWord = 0;
           }
       }
    } else if (inChar == 0x36)
    {
       if (Serial.available() > 0){ inChar = Serial.read();}
       if (inChar == 0x32)
       {
         if (Serial.available() > 0){ inChar = Serial.read();}
         if (inChar == 0x02)
         {
             iNextWord = 1; //62 36 32 02 is word find Next key ok!
             iNextTime = 0;  
         }
       }
    }
  }
//-------------test------begin----------------
    years[0]=2021;
    months[0]=1;
    days[0]=1;
    locations[0]="ShenZhen PinLe";
    equipments[0]="holmic laser light";
    parts[0]="left renal";
    descriptions[0]="0.6cm";
    years[1]=2021;
    months[1]=2;
    days[1]=2;
    locations[1]="ShenZhen PinLe";
    equipments[1]="holmic laser light";
    parts[1]="right renal";
    descriptions[1]="0.8cm";
    iNumRecord = 2;
    yearStart = 2021;
    monthStart = 1;
    dayStart = 1;
    yearEnd = 2022;
    monthEnd = 5;
    dayEnd = 1;
    iwordIn = "left";
//-------------test-----end-----------------     
  if(iReadTime == 1) // the time find!  
  {
    iReadTime = 0;
    
    for(int i = 0; i < iNumRecord; i++) // look totalTime
    {
      if(yearEnd > years[i] && years[i] > yearStart){
        totalTime += 1;
        if(nowNumTime == -1){ nowNumTime = i; }
      }
      else if(yearEnd == years[i]){
        if(months[i] < monthEnd)
        {
          totalTime += 1;
          if(nowNumTime == -1){ nowNumTime = i; }
        }
        else if(months[i] == monthEnd && days[i] <= dayEnd)
        {
          totalTime += 1;
          if(nowNumTime == -1){ nowNumTime = i; }
        }
      }
      else if(years[i] == yearStart)
      {
        if(months[i] > monthStart){
          totalTime += 1;
          if(nowNumTime == -1){ nowNumTime = i; }
        }
        else if(months[i] == monthStart && days[i] >= dayStart){
          totalTime += 1;
          if(nowNumTime == -1){ nowNumTime = i; }
        }
      }
    }
    if(nowNumTime >= 0)
    {
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l41\",\"text\":\"");
          Serial.print(years[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l42\",\"text\":\"");
          Serial.print(months[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l43\",\"text\":\"");
          Serial.print(days[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l44\",\"text\":\"");
          Serial.print(totalTime);
          Serial.println("\"}>ET");       
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl41\",\"text\":\"");   
          Serial.print(locations[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl42\",\"text\":\"");   
          Serial.print(equipments[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl43\",\"text\":\"");   
          Serial.print(parts[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl44\",\"text\":\"");   
          Serial.print(descriptions[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl45\",\"text\":\"");   
          Serial.print(String(yearStart)+"." +String(monthStart)+"." +String(dayStart)+"--"+String(yearEnd)+"." +String(monthEnd)+"." +String(dayEnd));
          Serial.println("\"}>ET");                    
    }
  }
  if(iNextTime == 1 && nowNumTime >= 0 )
  {
    int i4 = nowNumTime + 1;
    iNextTime = 0;  
      
    for(int i = i4; i < iNumRecord; i++) // look Next
    {
      if(yearEnd > years[i] && years[i] > yearStart){
        
          if(nowNumTime < i4){ nowNumTime = i; }
      }
      else if(yearEnd == years[i]){
        if(months[i] < monthEnd)
        {
          if(nowNumTime < i4){ nowNumTime = i; }
        }
        else if(months[i] == monthEnd && days[i] <= dayEnd)
        {
          
          if(nowNumTime < i4){ nowNumTime = i; }
        }
      }
      else if(years[i] == yearStart)
      {
        if(months[i] > monthStart){
          
          if(nowNumTime < i4){ nowNumTime = i; }
        }
        else if(months[i] == monthStart && days[i] >= dayStart){
          
          if(nowNumTime < i4){ nowNumTime = i; }
        }
      }
    }
    if(nowNumTime >= i4)
    {
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l41\",\"text\":\"");
          Serial.print(years[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l42\",\"text\":\"");
          Serial.print(months[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l43\",\"text\":\"");
          Serial.print(days[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l44\",\"text\":\"");
          Serial.print(totalTime);
          Serial.println("\"}>ET");       
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl41\",\"text\":\"");   
          Serial.print(locations[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl42\",\"text\":\"");   
          Serial.print(equipments[nowNumTime]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl43\",\"text\":\"");   
          Serial.print(parts[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl44\",\"text\":\"");   
          Serial.print(descriptions[nowNumTime]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl45\",\"text\":\"");   
          Serial.print(String(yearStart)+"." +String(monthStart)+"." +String(dayStart)+"--"+String(yearEnd)+"." +String(monthEnd)+"." +String(dayEnd));
          Serial.println("\"}>ET");     
    }
  }
  if(iReadWord == 1) // the word find!
  {
    iReadWord = 0;
    
    for(int i = 0; i < iNumRecord; i++) // look totalWord
    {
      if(locations[i].indexOf(iwordIn) >= 0 || equipments[i].indexOf(iwordIn) >= 0 )
      {
        totalWord += 1;
        if(nowNumWord == -1){ nowNumWord = i; }
      } else if(parts[i].indexOf(iwordIn) >= 0 || descriptions[i].indexOf(iwordIn) >= 0)
      {
          totalWord += 1;
          if(nowNumWord == -1){ nowNumWord = i; }
      }
    }
    if(nowNumWord >= 0)
    {
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l61\",\"text\":\"");
          Serial.print(years[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l62\",\"text\":\"");
          Serial.print(months[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l63\",\"text\":\"");
          Serial.print(days[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l64\",\"text\":\"");
          Serial.print(totalWord);
          Serial.println("\"}>ET");       
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl61\",\"text\":\"");   
          Serial.print(locations[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl62\",\"text\":\"");   
          Serial.print(equipments[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl63\",\"text\":\"");   
          Serial.print(parts[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl64\",\"text\":\"");   
          Serial.print(descriptions[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl65\",\"text\":\"");   
          Serial.print(iwordIn);
          Serial.println("\"}>ET");                    
    }
  }
  if(iNextWord == 1 && nowNumWord >= 0 )
  {
    int i5 = nowNumWord + 1;
    iNextWord = 0;  
      
    for(int i = i5; i < iNumRecord; i++) // look Next
    {
      if(locations[i].indexOf(iwordIn) >= 0 || equipments[i].indexOf(iwordIn) >= 0 ){
        
          if(nowNumWord < i5){ nowNumWord = i; }
      }
      else if(parts[i].indexOf(iwordIn) >= 0 || descriptions[i].indexOf(iwordIn) >= 0)
      {
        if(nowNumWord < i5){ nowNumWord = i; }
      }
    }
    if(nowNumWord >= i5)
    {
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l61\",\"text\":\"");
          Serial.print(years[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l62\",\"text\":\"");
          Serial.print(months[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l63\",\"text\":\"");
          Serial.print(days[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l64\",\"text\":\"");
          Serial.print(totalWord);
          Serial.println("\"}>ET");       
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl61\",\"text\":\"");   
          Serial.print(locations[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl62\",\"text\":\"");   
          Serial.print(equipments[nowNumWord]);
          Serial.println("\"}>ET");   
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl63\",\"text\":\"");   
          Serial.print(parts[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl64\",\"text\":\"");   
          Serial.print(descriptions[nowNumWord]);
          Serial.println("\"}>ET");
          Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"hl65\",\"text\":\"");   
          Serial.print(iwordIn);
          Serial.println("\"}>ET");        
    }
  }
  
    //--time ++ ------
  ii = ii + 1;
  if(ii > 29){
    time_1s = time_1s + 1;  
    ii = 0;
    if(iii == 0){
          digitalWrite(LED_blue, HIGH);  
          iii = 1;
    }else{
      iii = 0;
        digitalWrite(LED_blue, LOW);     
    }
  }
  if(time_1s >= 60){
    time_1s = 0;
    time_1m = time_1m + 1;
    if(time_1m >= 60){
      time_1m = 0;
      time_1h = time_1h + 1;
    }
  }
  delay(10);   
}
Query Description.
The combined query's include keyword determines the use of the String object's indexOf() method (the position of a string within another string!)
Syntax: string.indexOf(val)
 string.indexOf(val, from)
Parameters: string:  A variable of type String
 val:  the value to search for - char or String
 from:  the index to start the search from
Return value: the position in which, otherwise -1
Example:
  stringOne = "<HTML><HEAD><BODY>";
  int bodyTag = stringOne.indexOf("<BODY>");

记录医疗手术笔记

如在开发过程中遇到任何问题,请在我们的询盘表单下咨询

软件

滚动至顶部