使用STWI056WT-01串口屏的医疗笔记
這個項目首先是基于一個手術醫生的私人微信云開發小程序。眾所周知,騰訊為微信云開發小程序提供了5GB的免費云存儲,足夠一般用戶個人的賬目需求,而且云存儲又有隨時隨地方便訪問的特點,只要有wifi、有流量,拿起手機、打開微信,就能調用自己的小程序訪問、查詢、統計自己的私人數據。這個醫生在湖南株洲是很有名氣,作為人才引進來到深圳平樂骨傷科醫院,認識到一位幫人做微信小程序的深圳軟件工程師,驚喜云開發小程序的妙用,嘗試了第一個自己的微信云開發小程序:記錄、查詢、統計多年來自己做過的超過千臺數量的泌尿科結石手術。通過小程序中提供的時間段查詢功能,可以方便快捷的查詢某年、某月的手術數量,通過小程序的綜合查詢統計功能,輸入不同的“關鍵字”,可以統計某個醫院、某個部位的結石、某種治療結石的技術以及其他某種特定的說明的手術數量。下圖(1)是這個微信小程序的4個界面。
圖(1)云開發小程序的4個界面?
在手術室我們使用STONE的觸控串口屏會更適合,STONE串口屏很高興能為醫療器械提供更安全可靠的顯示和控制界面。如果我們在手術室里要錄入這些手術內容,手術設備的型號、參數也當然更加容易得到,甚至可以從系統中通過共享得到,更準確且省去了二次錄入,當然這樣的功能需要在設備前期規劃,此處我通過STONE串口屏來演示這個微信小程序功能(不涉及數據庫和云存儲),作為拋磚引玉,讀者有興趣還可以進一步通過藍牙配對,實現系統與手機的數據共享,完成本地數據的云端存儲、以及云端數據下載到本地,通過藍牙也能實現手機對STONE屏的控制、以及屏對手機端的反饋等。
結合STONE串口屏的軟件平臺,圖(1)中的界面需做一些修改,操作方式和展示方法也會有所不同,當然程序代碼也差別很大。微信小程序是基于JavaScript的,本STONE串口屏項目是基于arduino的ESP32環境。新的STONE界面醫生手術筆記項目記錄將按如下展開。
敘述內容:
1.人機界面和控件制作說明
如圖(2)開機可以通過不同的按鈕分別進入手術記錄---圖(3)、時間段查詢---圖(5)、綜合查詢功能---圖(7)。
如圖(3),手術記錄界面首先通過text_selector控件選擇手術時間:年、月、日,選擇手術部位,然后通過edit控件填入手術地點、手術使用的關鍵設備、手術說明,完成后點擊save按鈕,會彈出記錄成功界面如圖(4)。
圖(2)開機功能界面?
圖(3)手術記錄界面?
在圖(4)界面點擊back按鈕,返回到圖(2)功能界面。若選擇時間段查詢,就進入圖(5)界面,這里也是通過text_selector控件選擇查詢的開始日期和結束日期的年、月、日,再點擊read按鈕,進入圖(6)查詢結果展示。
圖(4)記錄成功界面?
圖(5)時間段查詢界面?
圖(6)將展示指定時間段總共有記錄多少臺手術,并將第一臺手術記錄的內容展示在屏幕中間,點擊Next按鈕,會依次展示第二臺、第三臺的內容。這些內容都是通過ESP32控制表與STONE屏串口通訊傳入到label控件、HScroll_label滾動控件中顯示的。其中年、月、日、手術總數都是label控件,其他都是HScroll_label控件,可以滾動顯示更多的內容。點擊Back按鈕返回在到圖(2)功能界面。若在圖(2)選擇綜合查詢功能,就進入圖(7)界面。
圖(6)時間段查詢結果界面?
圖(7)綜合查詢功能界面?
在圖(7)中通過edit接收關鍵字輸入,點擊read按鈕進入圖(8)結果界面,點擊Back按鈕返回圖(2)。在圖(8)中同圖(6)類似,展示了符合關鍵字的總共手術臺數,配合Next按鈕展示全部手術的內容。也通過Back按鈕返回圖(2)。
上述提到的各個界面中涉及編程需要的控件name和范圍、內容等,統一陳列在一起,方便編程時查閱。
圖(8)綜合查詢結果界面? ?
編程控件name:
手術記錄界面save按鈕:name = b12
手術記錄內容text_selector,name分別為:? year = ts11,month = ts12,day = ts13,part = ts14
其中:
ts11(2000--2099)年,ts12(1--12)月,ts13(1--31)日,
ts14(1:left renal;2:right renal;3:left ureteral;4:right ureteral;5:bladder;6:urethral;7:others;)
手術記錄內容edit,name分別為:
Location = e11,Equipment = e12,Description = e13
手術時間段查詢read按鈕:name = b32
Start date:year = ts31,month = ts32,day = ts33
End date:year = ts34,month = ts35,day = ts36
范圍同上。
時間段查詢結果 Next 按鈕:name = b42
? ??? Labal顯示name分別為:
year = l41,month = l42,day = l43,total = l44
Hscroll label顯示name分別為:
Location = hl41,equipment = hl42,part = hl43,description = hl44,during = hl45
關鍵字read按鈕:name = b52,edit name = e51
關鍵字查詢結果Next按鈕:name = b62
??????? Labal顯示name分別為:
year = l61,month = l62,day = l63,total = l64
Hscroll label顯示name分別為:
Location = hl61,equipment = hl62,part = hl63,description = hl64,during = hl65
2.界面下載
參照充電樁項目的方法B下載界面成功。
3.硬件連接與指令測試
圖(9)串口助手指令測試V1.2轉接板跳線鏈接圖 ?
STONE新版軟件在持續升級完善中,使用中發現有部分功能與手冊有出入,因此有必要在編程之前對需要用到的指令進行驗證。按圖(9)連接,通過串口助手查看STONE的反饋、驗證指令的有效性。
本項目涉及的控件有button、label、HScroll_Label、edit、text_selector共5種,下面我們逐個測試驗證。
button相關:
0x1001??? button鍵值主動下發
鍵值(數據部分最后一字節):
0x01???????? press down按鈕按下
0x02 ?????? press up 按鈕松開(按鈕完成? 觸發click點擊事件)
例:
手術記錄界面save按鈕(name = b12 )按下主動下發指令:
ST<0x10 0x01 0x00 0x04 ?b12 ?0x01>ET
串口助手返回十六進制數據:?? ????????? 驗證OK
53 54 3C ?10 01 00 04 ?62 31 32 ?01 ?3E 45 54 ?5C 4F
按鈕松開(完成按鈕click動作)主動下發指令
ST<0x10 0x01 0x00 0x04 ?b12 ?0x02>ET
串口助手返回十六進制數據:?????? 驗證OK
53 54 3C ?10 01 00 04 ?62 31 32 ?02 ?3E 45 54 ?18 4F
注:按鈕b12(ASCII碼 0x62 ?0x31 ?0x32)。
label相關:
set_text?? 設置label顯示的文本
例:
設置文本:? (關鍵字查詢總數 name = l64)
ST<{"cmd_code":"set_text","type":"label","widget":"l64","text":"520"}>ET???? 驗證上屏OK
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是我自己嘗試成功上屏的指令格式!這也是驗證的重要收獲!
edit相關:
get_text? 獲取edit顯示的內容
0x1070??? edit文本下發? ???? (主動被動下發? 可以是edit數據更改之后主動下發? 也可以使用get_text主動獲取)
文本:? "控件名稱":文本內容?? 數據長度不能超過1024字節 (:號之后的文本內容)
例:
獲取文本:? (手術記錄的 Location 處edit控件 name = 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
edit文本數據下發指令:??????????????? 驗證 ?OK
ST< 0x10 0x70 0x00 0x0C ?"e11":??????????? abcdef? >ET???????????? e11文本數據:abcdef?
text selector相關:
get_text?????????? 獲取文本選擇器的當前文本
get_value???????? 獲取文本選擇器的當前數值
get_selected?? 獲取文本選擇器當前選擇項序號(獲取的是當前選擇項的序號)
0x1080??? text selector文本下發? ??????? (被動下發 MCU使用get_text主動獲取)
0x1081??? text selector數值下發?? (int類型 主動/被動下發:MCU使用get_value命令獲取)
0x1082??? text selector序號下發?? (int類型 被動下發:MCU使用get_selected命令獲取)
數據格式:
text文本:"控件名稱":文本內容?? 長度不超過1024字節 (控件名稱:號之后的文本內容)
value數值:數據部分最后四字節
index數值:數據部分最后四字節
例1: (手術記錄的部位控件name = ts14,當前是序號為0的“1:left renal;”)
獲取文本選擇器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文本數據: left renal??? OK
獲取文本選擇器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 0x01? >ET???????? ? ts14當前數值數據:1
獲取文本選擇器t14當前序號:
ST<{"cmd_code":"get_selected","type":"text_selector","widget":"ts14"}>ET
串口助手反饋十六進制數據是:(ts14是序號為0的“1:left renal;”)
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? >ET????????? ts14當前序號:0
注:ts14的options為,
1:left renal;2:right renal;3:left ureteral;4:right ureteral;5:bladder;6:urethral;7:others;
***本處使用get_value獲取的是格式中的編號; 而使用get_selected獲取的是當前選擇項的序號(該序號是從0開始的)。
例2: (手術記錄的年控件name = ts11,options: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 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。
圖(10)NodeMCU-32S開發板的TX0、RX0位置圖?
圖(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;
???
? // 讀取串口發送的信息,并簡單解碼:?
? 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);??
}
查詢說明:
綜合查詢的包含關鍵字判斷使用了String對象的indexOf() 方法(一個字符串在另一個字符串中的位置!)
語法:string.indexOf(val)
????????????? string.indexOf(val, from)
參數:? string: ???? a variable of type String
???????????????????? val: ??????????? the value to search for -?char?or?String
????????????? from: ? the index to start the search from
返回值:在其中的位置,否則返回 -1
例:
? stringOne = "<HTML><HEAD><BODY>";
? int bodyTag = stringOne.indexOf("<BODY>");
5.附錄:ASCII碼表
圖(12)?
總結
以上是生活随笔為你收集整理的使用STWI056WT-01串口屏的医疗笔记的全部內容,希望文章能夠幫你解決所遇到的問題。