Matlab環(huán)境下PC與單片機(jī)的串行通信及數(shù)據(jù)處理
摘要:結(jié)合單片機(jī)和Matlab兩者的優(yōu)點(diǎn),基于事件驅(qū)動(dòng)的中斷通信機(jī)制,提出一種Matlab環(huán)境下PC機(jī)與單片機(jī)實(shí)時(shí)串行通信及數(shù)據(jù)處理的方法;完成單片機(jī)數(shù)據(jù)采集系統(tǒng)與PC機(jī)的RS-232/RS-485串行通信及其通信數(shù)據(jù)的分析處理、文件存儲(chǔ)、FIR濾波及圖形顯示;簡(jiǎn)化系統(tǒng)開(kāi)發(fā)流程,提高開(kāi)發(fā)效率。該方法已成功應(yīng)用于一個(gè)PIC16F876單片機(jī)應(yīng)用系統(tǒng)實(shí)例之中。 關(guān)鍵詞:PIC16F876 Matlab 串口通信 RS-232 事件驅(qū)動(dòng) 回調(diào)函數(shù) 引言 Matlab是由美國(guó)Mathworks公司開(kāi)發(fā)的面向理論分析研究、工程計(jì)算數(shù)據(jù)處理和緩圖的一套具有強(qiáng)大功能的軟件系統(tǒng)。其中Matlab語(yǔ)言是一種以矩陣為基本運(yùn)算單元的解釋執(zhí)行的高級(jí)語(yǔ)言,編程簡(jiǎn)例,只要幾條語(yǔ)句就能實(shí)現(xiàn)諸如FFT變換、FIR/IIR濾波等數(shù)據(jù)分析處理,易于掌握。從 Matlab6.0版本開(kāi)始,Mathworks公司在軟件中增加了設(shè)備控制箱(instrument control toolbox),提供了對(duì)RS-232/RS-485通信標(biāo)準(zhǔn)的串口通信的正式支持。利用該工具箱的serial類及instrcallback()回調(diào)函數(shù),能可靠地進(jìn)行實(shí)時(shí)串地通信。為此,筆者充分結(jié)合單片機(jī)和Matlab的優(yōu)點(diǎn),基于事件驅(qū)動(dòng)的中斷通信機(jī)制,提出了一種Matlab環(huán)境下PC機(jī)與單片機(jī)實(shí)時(shí)串行通信的數(shù)據(jù)處理方法,極大地簡(jiǎn)化開(kāi)發(fā)流程,提高了系統(tǒng)開(kāi)發(fā)效率。另外,與目前普遍采用的基于Matlab查詢方式下的非實(shí)時(shí)串行通信技術(shù)相比,這種方法的實(shí)用性也大大增強(qiáng)了。
本文引用地址:http://www.ex-cimer.com/article/201610/306771.htm1 系統(tǒng)總體設(shè)計(jì)簡(jiǎn)介 下面以Mircochip公司的PIC16F876單片機(jī)為下位機(jī),PC機(jī)為上位機(jī)組成的實(shí)時(shí)數(shù)據(jù)采集處理系統(tǒng)為例,介紹基于Matlab環(huán)境下PC機(jī)與單片機(jī)串行通信的實(shí)時(shí)數(shù)據(jù)處理方法的實(shí)現(xiàn)。數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)框圖如圖1所示。PC機(jī)串口與單片機(jī)USART口通過(guò)MAX232電平轉(zhuǎn)換芯片相連,系統(tǒng)工作時(shí),Matlab通過(guò)調(diào)用設(shè)備控制工具箱中的serial類及相關(guān)函數(shù)。來(lái)創(chuàng)建串口設(shè)備對(duì)象,得到設(shè)備的文件句柄,從而以操作文件的方式實(shí)現(xiàn)對(duì)PC機(jī)串行口的讀寫操作。因而PC機(jī)可以通過(guò)Matlab向串行口發(fā)送特殊指令,PIC單片機(jī)應(yīng)用系統(tǒng)對(duì)此作出相應(yīng)的反應(yīng),將A/D采樣數(shù)據(jù)通過(guò)串行口回送給PC 機(jī)。此時(shí),Matlab通過(guò)中斷的方式,實(shí)時(shí)接收單片機(jī)發(fā)送的數(shù)據(jù),并完成對(duì)數(shù)據(jù)的分析處理、文件存儲(chǔ)、FIR濾波及圖形顯示。 2 PIC16F876與PC機(jī)串行通信接口的設(shè)計(jì) 2.1 PIC16F876單片機(jī)串行通信接口的硬件設(shè)計(jì) PIC16F876微處理器芯片內(nèi)部集成了一個(gè)串行通信(SCI)模塊。該模塊是一個(gè)通用的同步/異步收發(fā)(USART)通信接口。 圖2 PIC16F876的SCI通信接口有兩個(gè)外部引腳——RC6/TX(SCI發(fā)送輸出引腳)和RC7/RX(SCI接收輸入引腳),引腳的信號(hào)電平為 TTL類型;而PC機(jī)串口的異步串行通信基于RS232標(biāo)準(zhǔn)。兩者通信信號(hào)的邏輯電平不一致,必須進(jìn)行信號(hào)電平轉(zhuǎn)換。為此,在電路中選用Maxim公司的 MAX232芯片,以實(shí)現(xiàn)TTL電平與RS-232電平的雙向轉(zhuǎn)換。RS-232通信距離一般以不超過(guò)12m為宜,在工業(yè)控制現(xiàn)場(chǎng)很受限制。為保證硬件設(shè)計(jì)的兼容性和易擴(kuò)展性,能夠應(yīng)用于不同場(chǎng)合,考慮到實(shí)際應(yīng)用的需要,在硬件電路中還可選用一個(gè)MAX491芯片,添加了一個(gè)RS-485通信接口。 如圖2所示,實(shí)際使用過(guò)程中,系統(tǒng)可以根據(jù)需要,靈活使用不同的通信標(biāo)準(zhǔn),十分方便。當(dāng)PIC單片機(jī)SCI通信接口引腳直接通過(guò)MAX232芯片與PC機(jī)串口相連時(shí),系統(tǒng)采用RS-232的通信標(biāo)準(zhǔn);當(dāng)PIC單片機(jī)SCI通信接口口引腳與MAX489芯片的DI、RO引腳相連時(shí),系統(tǒng)采用RS-485的通信標(biāo)準(zhǔn)。另外,還可通過(guò)PIC單片機(jī)控制MAX489芯片的DE、RE引腳,隨時(shí)使能或屏蔽掉MAX489的數(shù)據(jù)接收和數(shù)據(jù)發(fā)送功能。 2.2 PIC16F876與PC機(jī)串行通信接口的軟件設(shè)計(jì) 本通信系統(tǒng)中規(guī)定的字符格式為:每一幀的數(shù)據(jù)占10位——1位起始位,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn)位。中間的8位數(shù)據(jù)位即為有效的通信傳輸字節(jié)。雙方的波特率設(shè)置為115.2kb/s,以較高速度進(jìn)行通信。同時(shí),為了增強(qiáng)通信的可靠性、減少通信的誤碼率,在通信過(guò)程中約定了雙方的軟件握手方法。為了不致使通信過(guò)于復(fù)雜,提高通信速度,可以直接將握手信號(hào)0xFF嵌入到數(shù)據(jù)包中。軟件握手協(xié)議規(guī)定如下:PC機(jī)發(fā)送符合握手信號(hào)0xFF給單片機(jī),PIC單片機(jī)接收到的上位機(jī)數(shù)據(jù)若為握手信號(hào)0xFF,則回送兩次A/D采樣數(shù)據(jù)包,并將握手信號(hào)0xFF嵌入到數(shù)據(jù)包作為第一個(gè)數(shù)據(jù),兩次發(fā)送數(shù)據(jù)的時(shí)間間隔為5ms;單片機(jī)接收到的上位機(jī)數(shù)據(jù)若不是握手信號(hào),則繼續(xù)等待。若PC機(jī)接收到的數(shù)據(jù)包的第1個(gè)字節(jié)不是0xFF,則屏棄該數(shù)據(jù)包;若是,則表示握手成功,經(jīng)校驗(yàn)正確后將該數(shù)據(jù)包直接存儲(chǔ)接收,并從中分解有效的A/D采樣數(shù)據(jù)信息。 PIC16F876端串行通信的C語(yǔ)言程序流程如圖3所示,相應(yīng)的主要通信源代碼如下: //串口相關(guān)寄存器的初始化子程序 void sci_initial(){ SPBRG=0C0A; //設(shè)置通信波特率為115.2kb/s TXSTA=0X04; //選擇異步高速通信模式 RCSTA=0x80; //串行口使能,接收數(shù)據(jù)長(zhǎng)度為8位,無(wú)奇偶校驗(yàn) TRISC6=0; //RC6引腳設(shè)置為輸出方式 TRISC7=1; //PC7引腳設(shè)置為輸入方式 } //串口接收和發(fā)送數(shù)據(jù)子程序 void sci_com(){ while(!RCIF); //查詢接收中斷標(biāo)志位,等待上位機(jī)發(fā)送的串口數(shù)據(jù) rec_data[0]=RCREG;//接收串口數(shù)據(jù)
if(rec_data[0]==0xFF){ send_data[0]=rec_data[0]; //在第1組數(shù)據(jù)中嵌入回送握手?jǐn)?shù)據(jù)0xFF for(j=0;j33;j++){ TXREG=send_data[j]; //發(fā)送第1組32字節(jié)的A/D 轉(zhuǎn)換數(shù)據(jù),包含握手信號(hào)0xFF為33個(gè)字節(jié)數(shù)據(jù) while(!TXIF); //查詢發(fā)送標(biāo)志位,等待數(shù)據(jù)發(fā)送完畢再進(jìn)行下一次數(shù)據(jù)發(fā)送 } delay_ms(5); //PIC單片機(jī)定時(shí)5ms發(fā)送第2組A/D轉(zhuǎn)換數(shù)據(jù) send1_data[0]=rec_data[0]; //在第2組數(shù)據(jù)中嵌入回送握手?jǐn)?shù)據(jù)0xFF for(j=0;j33;j++){ TXREG=send1_data[j];//發(fā)送第2組32個(gè)字節(jié)A/D轉(zhuǎn)換數(shù)據(jù)及握手信號(hào)數(shù)據(jù) While(!TXIF); //查詢發(fā)送標(biāo)志位,等待數(shù)據(jù)發(fā)送完畢再進(jìn)行下一次數(shù)據(jù)發(fā)送 } } } 3 Matlab環(huán)境下PC機(jī)與單片機(jī)的通信 在Matlab6.0中新增的設(shè)備控制工具條(instrument control toolbox)用來(lái)負(fù)責(zé)上、下位機(jī)之間的通信。該設(shè)備控制工具箱的特色如下: ①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB總線(IEEE2488、HPIB標(biāo)準(zhǔn))、VISA總線的通信; ②通信數(shù)據(jù)支持二進(jìn)制和文本(ASCII)兩種方式,文本方式支持SCPI(Standard Commands for Programmable Instruments)語(yǔ)言; ③支持異步通信和同步通信; ④支持基于事件驅(qū)動(dòng)的通信。 從以上的Matlab設(shè)備控制工具箱的特點(diǎn)可以看到,Matlab完全可以滿足我們實(shí)現(xiàn)串行通信的要求。 3.1 Matlab對(duì)串行口控制的基礎(chǔ)知識(shí) Matlab對(duì)串行口的編程控制主要分為四個(gè)步驟。 ①創(chuàng)建串口設(shè)備對(duì)象并設(shè)置其屬性。 scom=serial(com1);%創(chuàng)建串口1的設(shè)備對(duì)象scom scom.Terminator=CR;%設(shè)置終止符為CR(回車符),缺省為L(zhǎng)F(換行符) scom.InputBufferSize=1024;%輸入緩沖區(qū)為256B,缺省值為512B scom.OutputBufferSize=1024;%輸出緩沖區(qū)為256B,缺省值為512B scom.Timeout=0.5;%Y設(shè)置一次讀或?qū)懖僮鞯淖畲笸瓿蓵r(shí)間為0.5s,缺省值為10s s.ReadAsyncMode=continuous(缺省方式);%在異步通信模式方式下,讀取串口數(shù)據(jù)采用連續(xù)接收數(shù)據(jù) (continuous)的缺省方式,那么下位機(jī)返回的數(shù)據(jù)會(huì)自動(dòng)地存入輸入緩沖區(qū)中. 注意:在些屬性只有在對(duì)象沒(méi)有被打開(kāi)時(shí)才能改變其值,如InputBufferSize、OutputBufferSize屬性等。對(duì)于一個(gè)RS- 232/RS-422/RS-485串口設(shè)備對(duì)象,其屬性的缺省值為波特率9 600b/s,異步方式,通信數(shù)據(jù)格式為8位數(shù)據(jù)位,無(wú)奇偶校驗(yàn)位,1位停止位。如果要設(shè)置的串口設(shè)置對(duì)象的屬性值與缺省值的屬性值相同,用戶可以不用另行設(shè)置。 另外,設(shè)置串口設(shè)置對(duì)象的屬性也可以用一條指令完成,如:scom=serial(COM1,BaudRate,38400,Parity,none,DataBits,8,StopBits,1)。也可以用set命令,如set(scom,BaudRate,19200,Parity,even)。創(chuàng)建了對(duì)象后可以在Matlab命令窗口直接敲對(duì)象名并回車,看到其基本屬性和當(dāng)前狀態(tài)。若需要知道其全部的屬性,可以用get(scom)命令。 ②打開(kāi)串口設(shè)備對(duì)象。 fopen(scom); ③讀寫串口操作。初始化并打開(kāi)串口調(diào)協(xié)對(duì)象之后,現(xiàn)在可以對(duì)串口設(shè)備對(duì)象進(jìn)行讀寫操作,串口的讀寫操作支持二進(jìn)制和文本(ASCII)兩種方式。當(dāng) Matlab通信數(shù)據(jù)采用西方(ASCII)方式時(shí),讀寫串口設(shè)備的命令分別是fscanf、fpritf;當(dāng)Matlab通信數(shù)據(jù)采用二進(jìn)制方式時(shí),讀寫串口設(shè)備的命令分別是fread、fwrite。下面以文本方式讀寫串口為例: a.讀串口。A=fscanf(scom,%d,[10,100];%從串口設(shè)備對(duì)象scom中讀入10*100個(gè)數(shù)據(jù)填充到數(shù)組A[10,100] 中,并以整型的數(shù)據(jù)格式存放。
h.寫串口。Fprintf(scom,%s,RS232,async);%將字符串‘RS232?’以字符的數(shù)據(jù)格式寫入到串口設(shè)備 scom,寫操作以異步的方式進(jìn)行。 ④關(guān)閉并清除設(shè)備對(duì)象。 fclose(scom);%關(guān)閉串口設(shè)備對(duì)象 delete(scom);%刪除內(nèi)存中的串口設(shè)備對(duì)象 clear scom; %清除工作空間中的串口設(shè)備對(duì)象 當(dāng)不再使用該串口設(shè)備對(duì)象時(shí),順序使用以上3條命令,可以將所創(chuàng)建的串口對(duì)象對(duì)象清除,以免占用系統(tǒng)資源。 可以看出,在Matlab中進(jìn)行串行通信是十分方便的,編程較為簡(jiǎn)單。而且,在Matlab中串行通信的失誤率很低,通信較為可靠,也可以采用增加握手信號(hào)以及數(shù)據(jù)校驗(yàn)等的方式進(jìn)一步增加通信的可靠性。 3.2 Matlab實(shí)現(xiàn)串行通信的軟件設(shè)計(jì) 在Matlab環(huán)境下,讀取串口數(shù)據(jù)的方式可以分為兩種—查詢和中斷。以查詢的方式進(jìn)行串行通信時(shí),如下位單片機(jī)有大量的數(shù)據(jù)分時(shí)分批傳送給PC機(jī),就需要不停查詢串行口的緩沖區(qū),有數(shù)據(jù)就讀取;雖然編程容易,但這樣做不能對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理,系統(tǒng)實(shí)時(shí)性不高,而且會(huì)極大地占用系統(tǒng)的資源。以中斷的方式對(duì)串口進(jìn)行控制實(shí)現(xiàn)串行通信,就可以實(shí)時(shí)處理下位機(jī)傳送的數(shù)據(jù);但編程相對(duì)復(fù)雜一些,需要采用Matlab的事件和回調(diào)函數(shù)機(jī)制。 (1)基于Matlab查詢方式的異步串行通信編程 Matlab查詢方式的串行通信編程雖然簡(jiǎn)單,但這種方法在實(shí)際應(yīng)用中實(shí)用價(jià)值不高,下面只作簡(jiǎn)單介紹。通信源程序如下: clc;%初始化串口設(shè)備對(duì)象,設(shè)置串口屬性為:PC機(jī)com2口,輸入緩沖區(qū)為1024,讀寫最大完成時(shí)間為0.6s,波特率為115 200b/s,1位停止位,遇到換行符中止,硬件流控制 g=serial(com2); g.InputBufferSize=4096; g.timeout=0.6; g.BaudRate=115200; g.Parity=none; g.StopBits=1; g.Terminator=LF; g.FlowControl=hardware; fopen(g);%打開(kāi)串口設(shè)備對(duì)象s fwrite(g,255);%以二進(jìn)制的方式發(fā)送握手信號(hào)0xFF,缺省為異步通信方式 out=fread(g,33,uint8)%接收單片機(jī)發(fā)送的33個(gè)數(shù)據(jù)(8位),并存入out數(shù)組中 %釋放串口設(shè)備對(duì)象 fclose(g); delete(g); clear g; (2)基于Matlab中斷方式的實(shí)時(shí)串行通信編程 在Matlab環(huán)境下以中斷的方式進(jìn)行串行通信,實(shí)際上是采用事件驅(qū)動(dòng)的方法實(shí)現(xiàn)的。Matlab提供了 instrcallback(obj,event)回調(diào)函數(shù),用戶根據(jù)需要可以自行設(shè)置具體的串行通信事件。Matlab常用的串行口通信中斷事件有:緩沖區(qū)有指定字節(jié)數(shù)目的數(shù)據(jù)可用事件(bytes-available event)、串口接收到的數(shù)據(jù)長(zhǎng)時(shí)間處于非激活狀態(tài)事件(break-interrupt event)、串行口引腳狀態(tài)改變事件(pin-status event)、輸出緩沖區(qū)為空事件(output empty event)等。當(dāng)串口上有監(jiān)視的事件發(fā)生時(shí),Matlab會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)進(jìn)行通信事件的處理。因此,事件驅(qū)動(dòng)實(shí)質(zhì)上是一種中斷機(jī)制,而回調(diào)函數(shù)實(shí)質(zhì)上相當(dāng)于一個(gè)中斷服務(wù)子程序。Matlab端實(shí)時(shí)串行通信的程序流程如圖4所示。以下是具體的編程步驟。 ①建立一個(gè)串行通信主程序:serial.m文件,在主程序中進(jìn)行串口設(shè)備初始化操作,并指定回調(diào)函數(shù)中串行通信的事件。 程序主要源代碼如下(創(chuàng)建串口設(shè)備對(duì)象、設(shè)備串口設(shè)備屬性及打開(kāi)串口等初始化操作的代碼與前述的查詢方式下的初始化代碼相同): %設(shè)置回調(diào)函數(shù)觸發(fā)事件—當(dāng)串口緩沖區(qū)中有33字節(jié)的數(shù)據(jù)時(shí),觸發(fā)中斷事件,此后主程序自動(dòng)調(diào)用instrcallback(obj,event)回調(diào)函數(shù) g.BytesAvaibleFcnMode=byte;%中斷觸發(fā)事件為‘bytes-available Event’ g.BytesAvailableFcnCount=33;%接收緩沖區(qū)每收到33個(gè)字節(jié)時(shí),觸發(fā)回調(diào)函數(shù) g.BytesAvailableFcn=@instrcallback;%得到回調(diào)函數(shù)句柄 fopen(g);%連接串口設(shè)備對(duì)象 fwrite(g,255);%寫串口,發(fā)送握手信號(hào)0xFF(等價(jià)于十進(jìn)制下的數(shù)值255) ②修改instrcallback(obj,event)回調(diào)函數(shù),對(duì)所發(fā)生的串口通信事件進(jìn)行處理。 Matlab缺省的回調(diào)函數(shù)instrcallback(obj,event)存在于instrcallback.m文件中。該文件實(shí)際上是一個(gè)有待于用戶修改的程序模塊。其中只有一些最基本的程序代碼,能夠顯示導(dǎo)致串口中斷發(fā)生的是哪一類事件,中斷事件所發(fā)生的時(shí)間以及導(dǎo)致事件發(fā)生的對(duì)象名等信息(修改回調(diào)函數(shù)文件時(shí),注意要取消文件中相應(yīng)信息后的分號(hào),才能夠在Matlab的命令窗口(command window)中將這些信息顯示出來(lái))。中斷發(fā)生后的通信事件處理以及通信數(shù)據(jù)的分析處理任務(wù),需要用戶自行添加相應(yīng)的服務(wù)程序代碼。
Matlab安裝目標(biāo)下有兩個(gè)instrcallback.m文件,我們只需要修改@instrument目錄下的instrcallback.m文件即可。當(dāng)然,在修改instrcallback.m文件之前,最好對(duì)其做一個(gè)備份。另外,需要注意的是:程序調(diào)試過(guò)程中如果再次修改了該回調(diào)函數(shù),要重新啟動(dòng)Matlab配置該文件,才能使得新的回調(diào)函數(shù)文件生效。 修改后的instrcallback.m文件見(jiàn)網(wǎng)站www.dpj.com.cn。該修改后的回調(diào)函數(shù)能夠完成如下任務(wù): ①實(shí)時(shí)接收單片機(jī)實(shí)時(shí)5ms發(fā)送的33個(gè)串行通信數(shù)據(jù),其中包括1個(gè)握手信號(hào)和32個(gè)A/D轉(zhuǎn)換數(shù)據(jù)(這些數(shù)據(jù)是PIC單片機(jī)系統(tǒng)采集到的傳感器信號(hào),每個(gè)數(shù)據(jù)占1字節(jié)),并存儲(chǔ)在out數(shù)組中; ②對(duì)接收到的數(shù)據(jù)進(jìn)行處理,由于PIC單片機(jī)的A/D轉(zhuǎn)換值為10位,占2字節(jié),而單片機(jī)每次只能傳送1個(gè)字節(jié)的數(shù)據(jù),故將收到的每?jī)蓚€(gè)通信數(shù)據(jù)整合成為 1個(gè)真實(shí)的A/D轉(zhuǎn)換數(shù)據(jù),共16個(gè)A/D轉(zhuǎn)換數(shù)據(jù),并存儲(chǔ)在Dataout數(shù)組中; ③將接收到的串口數(shù)據(jù)存儲(chǔ)到serialdata.txt文件中,將整合后的單片機(jī)A/D轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)到一個(gè)以中斷事件發(fā)生的時(shí)間為文件名的txt文件中; ④根據(jù)A/D轉(zhuǎn)換數(shù)據(jù),利用Matlab求其最大值、最小值和平均值,并利用FIR濾波器對(duì)傳感器信號(hào)A/D轉(zhuǎn)換值作FIR濾波處理,得到窗格為5的滑動(dòng)濾波平均值; ⑤利用Matlab中的plot()函數(shù)實(shí)時(shí)繪制單片機(jī)采集到的傳感器信號(hào)的原始波形圖和FIR濾波后波形圖,如圖5所示,可以看到經(jīng)過(guò)FIR濾波后的傳感器動(dòng)態(tài)信號(hào)值較為穩(wěn)定,精度大幅提高。 實(shí)驗(yàn)證明,基于Matlab中斷方式的PC機(jī)與單片機(jī)的實(shí)時(shí)串行通信穩(wěn)定可靠,處理數(shù)據(jù)方便,編程簡(jiǎn)單,開(kāi)發(fā)效率大大提高。 4 結(jié)論 本文介紹的基于Matlab環(huán)境下PC機(jī)與PIC單片機(jī)串行通信的實(shí)現(xiàn)方法,利用Matlab的Instrument Control Tollbox的serial類及instrcallback()回調(diào)函數(shù),實(shí)現(xiàn)基于事件驅(qū)動(dòng)的實(shí)時(shí)中斷通信。使開(kāi)發(fā)人員可以充分利用Matlab工具箱中的現(xiàn)有函數(shù),方便地實(shí)現(xiàn)串行通信、數(shù)據(jù)分析處理和圖形顯示,大大簡(jiǎn)化系統(tǒng)上位機(jī)軟件的編程工作量。
評(píng)論