介紹RPC模塊前,我們先淺聊一下RPC的相關說明,以及在什么樣的情況下需要了解本文。
1.
RPC 說明
遠程過程調用(RPC, Remote Procedure Call)是一種網絡通信協議,使得程序可以調用另一臺計算機上的程序或服務,就像調用本地的程序一樣。RPC 的主要目的是簡化分布式計算,使得開發者無需關注底層的網絡通信細節。
2.
什么情況下需要了解此文章?
用戶基于 TSMaster 開發了對應的應用工程,想在外部程序中自動化控制TSMaster,可以查閱此文章。(備注:除了 RPC,TSMaster還提供了基于COM的接口,有需求可另行查閱相關文章。)
本文適用程控模式:TSMaster1 控制 TSMaster2,或者其他進程控制 TSMaster 進程(使用 TSMaster.dll)適用于語言:C++ 、Python、 C#等語言。
1
RPC的基本概念
客戶端和服務器:
客戶端:發起 RPC 請求的程序。
服務器:接收 RPC 請求并執行相應過程的程序。
代理:
客戶端代理:封裝請求并將其發送到服務器。
服務器代理:接收請求,解包并調用本地過程,之后將結果返回給客戶端代理。
通信機制:
傳輸協議:底層使用的協議,比如 TCP、UDP。
數據序列化:將數據結構或對象轉換成可以傳輸的格式,比如 JSON、XML、ProtocolBuffers。
RPC 工作流程:
● 客戶端調用本地代理方法:客戶端調用一個看似本地的方法,但實際上這個方法由客戶端代理負責處理;
●客戶端代理序列化請求:將方法名、參數等信息打包成消息;
●消息傳輸:客戶端代理將消息通過網絡傳輸到服務器;
●服務器代理解包請求:接收到消息后,服務器代理解包消息并調用實際的本地方法;
●執行方法并生成響應:本地方法執行完畢后,生成響應結果;
●服務器代理打包響應:服務器代理將結果打包成消息并通過網絡發送回客戶端;
●客戶端代理解包響應:客戶端代理接收到響應消息后,解包并將結果返回給客戶端。
2
TSMaster RPC 應用
1.
RPC 功能
基于 TSMaster 的 RPC 機制,用戶可以在 TSMaster 上位機環境中搭建完整的工程,涵蓋從測試用例開發到程控設備管理、總線通訊配置以及控制板卡操作等一系列流程。通過這一機制,用戶能夠高效地在客戶端遠程控制 TSMaster 服務器,實現對系統變量、CAN 信號、LIN 信號、FlexRay 信號以及以太網(ETH)信號等的讀寫操作。此外,用戶還可以調用 TSMaster 服務器上定義的各種函數,進一步擴展和定制系統功能。
這種集成化的解決方案使得工程管理和自動化測試更加便捷和高效。用戶無需在多個平臺之間切換,即可完成包括硬件配置、信號監控、數據采集和測試執行等復雜任務。通過TSMaster 的 RPC 機制,用戶在客戶端即可實現對服務器的遠程程控,簡化了操作流程,提高了測試和開發效率,確保了系統的穩定性和可靠性。
TSMaster 提供了強大的接口和豐富的功能模塊,用戶可以根據需求靈活組合使用,實現對各種信號和設備的精細控制和管理。這種架構不僅適用于研發測試階段,也適用于生產環境中的實時監控和故障診斷,極大提升了工程項目的整體質量和效率。
不僅如此,TSMaster 的 RPC 機制支持多種拓撲結構,不僅可以實現客戶端與服務器之間的一對一通信,還能夠實現以下復雜的通信拓撲:
1:一對多 (One-to-Many):單個客戶端可以同時控制多個 TSMaster 服務器,適用于需要同時管理多個測試環境或設備的情況。
2:多對一 (Many-to-One):多個客戶端可以同時連接到一個 TSMaster 服務器,這樣不同的用戶或測試系統可以共享同一個服務器資源,實現協同工作和資源共享。
3:多對多 (Many-to-Many):多個客戶端和多個服務器之間可以進行靈活的通信和控制,構建復雜的分布式測試和控制系統,適用于大型工程項目和分布式測試環境。
這種靈活的拓撲結構使得 TSMaster 能夠適應各種復雜的工程需求,無論是在單一項目中還是在跨項目、跨地域的分布式測試中,都能提供高效、可靠的解決方案。通過這種多樣化的通信模式,用戶可以最大限度地利用硬件和軟件資源,提高系統的擴展性和靈活性,滿足不同規模和復雜度的工程項目需求。
3
TSMaster RPC 使用說明
基于RPC本身機制,TSMaster提供了相應接口,在需要被程控的工程中,激活RPC server端,為程控腳本提供相應資源。
1.
激活 server
開啟server端操作如下:
新建一個C腳本,在啟動事件中輸入下面代碼,即表示激活了當前工程的rpc server rpc_tsmaster_activate_server(true);
實際上,在 TSMaster v2024.06.05.1124 版本之后,所有TSMaster工程已經默認激活了RPC功能。
2.
激活 client
native_int h; //client 句柄
//參數 1 為提供 rpc 服務的 TSMaster 應用程序名
com.rpc_tsmaster_create_client(“TSMaster”,&h);
//激活 client 端
Com.rpc_tsmaster_activate_client(h,true);
3.
修改 server 端數據
3.1 啟動停止 server 工程
啟動工程:
TSMaster 小程序:
com.rpc_tsmaster_cmd_start_simulation(h);
API(C\C++\C#\Python):
rpc_tsmaster_cmd_start_simulation(h);
3.2 讀寫系統變量
設置系統變量:
TSMaster 小程序:
com.rpc_tsmaster_cmd_write_system_var(h, "Var1", "1.2345");
API(C\C++\C#\Python):
rpc_tsmaster_cmd_write_system_var(h,"Var1","1.2345");
獲取系統變量:
TSMaster 小程序:
com.rpc_tsmaster_cmd_read_system_var(h, "Var1", "1.2345");
API(C\C++\C#\Python):
rpc_tsmaster_cmd_read_system_var(h,"Var1","1.2345");
3.3 讀寫 CAN 信號
設置 CAN 信號:
TSMaster 小程序:
com.rpc_tsmaster_cmd_set_can_signal(h,"chnidx/net/node/msg/signal", 1234)
API(C\C++\C#\Python):
rpc_tsmaster_cmd_set_can_signal(h,"chnidx/net/node/msg/signal", 1234)
獲取 CAN 信號:
double d = 0;
TSMaster 小程序:
com.rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)
API(C\C++\C#\Python):
rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)
3.4 讀寫 LIN 信號
設置 LIN 信號:
TSMaster 小程序:
com.rpc_tsmaster_cmd_set_lin_signal(h,"chnidx/net/node/msg/signal", 1234);
API(C\C++\C#\Python):
rpc_tsmaster_cmd_set_lin_signal(h,"chnidx/net/node/msg/signal", 1234);
獲取 LIN 信號:
double d = 0;
TSMaster 小程序:
com.rpc_tsmaster_cmd_get_lin_signal(h,"chnidx/net/node/msg/signal", %d);
API(C\C++\C#\Python):
rpc_tsmaster_cmd_get_lin_signal(h,"chnidx/net/node/msg/signal", %d);
3.5 讀寫 FlexRay 信號
設置 FR 信號:
TSMaster 小程序:
com.rpc_tsmaster_cmd_set_flexray_signal(h,"chnidx/net/node/msg/signal", 1234);
API(C\C++\C#\Python):
rpc_tsmaster_cmd_set_flexray_signal(h,"chnidx/net/node/msg/signal", 1234);
獲取 FR 信號:
double d = 0;
TSMaster 小程序:
com.rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d);
API(C\C++\C#\Python):
rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)
3.6 RPC使用 TSMaster 系統函數
// 第一步:準備調用函數的輸入參數
#define STR_BUFFER_SIZE 1024
char args[4][STR_BUFFER_SIZE];
char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};
sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");
sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);
sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");
sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");
// 步驟 2:調用任意 API
s32 ret;
ret = com.rpc_tsmaster_call_system_api(h, "app.create_system_var", 4, STR_BUFFER_SIZE,
&pArgs[0]);
// 步驟 3:處理參數中的返回值(如果可用)
s32 i;
log("API call result = %d", ret);
for (i=0; i<4; i++){
log("Argument %d: %s", i+1, pArgs[i]);
}
上述代碼等價與在 TSMaster 進程中使用 app.create_system_var 來創建系統變量,即:app.create_system_var(var1,svtString,”string default value”,”this is a comment”);
需要注意的是,使用該方式調用 TSMaster 內的系統函數,無法使用參數為指針類型(報文類型除外)的函數。
3.7 RPC使用小程序庫函數
// 第一步:準備調用函數的輸入參數
#define STR_BUFFER_SIZE 1024
char args[4][STR_BUFFER_SIZE];
char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};
sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");
sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);
sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");
sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");
//步驟 2:調用任意 API
s32 ret;TSMaster RPC 編程指導
ret = com.rpc_tsmaster_call_library_api(h, "mylib.create_system_var", 4, STR_BUFFER_SIZE,
&pArgs[0]);
// 步驟 3:處理參數中的返回值(如果可用)
s32 i;
log("API call result = %d", ret);
for (i=0; i<4; i++){
log("Argument %d: %s", i+1, pArgs[i]);
}
4
TSMaster RPC 函數說明
1.
rpc_tsmaster_create_client
函數名稱 | UInt32 rpc_tsmaster_create_client(const char*ATSMasterAppName,const psize_t AHandle) |
功能介紹 | 創建一個 TSMaster Rpc 客戶端 |
調用位置 | 初始化 tsmaster lib 庫之后 |
輸入參數 | ATSMasterAppName: TSMaster server 端的應用程序名稱; AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | s32 h; rpc_tsmaster_create_client("TSMaster1", &h) |
2.
rpc_tsmaster_activate_client
函數名稱 | UInt32 rpc_tsmaster_activate_client(const size_t AHandle,constbool AActivate) |
功能介紹 | 激活或者停用一個 TSMaster Rpc 客戶端 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 AActivate: true=激活,false=停用 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_activate_client(h, true) |
3.
rpc_tsmaster_is_simulation_running
函數名稱 | UInt32 rpc_tsmaster_is_simulation_running(const size_tAHandle,const pbool AIsRunning) |
功能介紹 | 獲取遠程 TSMaster 仿真運行的狀態 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 AIsRunning:遠程 TSMaster 仿真運行的狀態的數據指針 True=正在運行,false=未運行 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | bool b; if (0 == com.rpc_tsmaster_is_simulation_running(h, &b)){ if (b){ // current simulation is running } } |
4.
rpc_tsmaster_cmd_set_mode_realtime
函數名稱 | UInt32 rpc_tsmaster_cmd_set_mode_realtime(const size_t AHandle) |
功能介紹 | 將 TSMaster Rpc server 配置為實時模式 |
調用位置 | 創建 TSMaster Rpc 客戶端之后,仿真運行之前 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_cmd_set_mode_realtime(h) |
5.
rpc_tsmaster_cmd_set_mode_sim
函數名稱 | UInt32 rpc_tsmaster_cmd_set_mode_sim(const size_t AHandle) |
功能介紹 | 將 TSMaster Rpc server 配置為仿真模式 |
調用位置 | 創建 TSMaster Rpc 客戶端之后,仿真運行之前 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_cmd_set_mode_sim(h) |
6.
rpc_tsmaster_cmd_start_simulation
函數名稱 | UInt32 rpc_tsmaster_cmd_start_simulation(const size_t AHandle) |
功能介紹 | 啟動 TSMaster Rpc server 仿真 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_cmd_start_simulation(h) |
7.
rpc_tsmaster_cmd_set_can_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_set_can_signal(const size_t AHandle,const char* ASgnAddress,const double AValue) |
功能介紹 | 在遠程 TSMaster 上修改數據庫中的 CAN 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | if(0==rpc_tsmaster_cmd_set_can_signal(h, "0/CAN_FD_Powertrain/Engine/EngineData/EngSpeed", 1234)){ // signal written } |
8.
rpc_tsmaster_cmd_get_can_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_get_can_signal(const size_t AHandle,const char* ASgnAddress,const pdouble AValue) |
功能介紹 | 在遠程 TSMaster 上獲取數據庫中的 CAN 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值指針 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | double d; if(0==rpc_tsmaster_cmd_get_can_signal(h, "0/CAN_FD_Powertrain/Engine/EngineData/EngSpeed", &d)){ // signal is retrieved } |
9.
rpc_tsmaster_cmd_set_lin_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_set_lin_signal(const size_t AHandle,const char* ASgnAddress,const double AValue) |
功能介紹 | 在遠程 TSMaster 上修改數據庫中的 LIN 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | if(0==rpc_tsmaster_cmd_set_lin_signal(h, "chnidx/net/node/msg/signal", 1234)){ // signal written } |
10.
rpc_tsmaster_cmd_get_lin_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_get_lin_signal(const size_t AHandle,const char* ASgnAddress,const pdouble AValue) |
功能介紹 | 在遠程 TSMaster 上獲取數據庫中的 LIN 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值指針 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | double d; if(0==rpc_tsmaster_cmd_get_lin_signal(h, "chnidx/net/node/msg/signal", &d)){ // signal is retrieved } |
11.
rpc_tsmaster_cmd_set_flexray_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_set_flexray_signal(const size_t AHandle,const char* ASgnAddress,const double AValue) |
功能介紹 | 在遠程 TSMaster 上修改數據庫中的 flexray 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | if(0==rpc_tsmaster_cmd_set_flexray_signal(h, "chnidx/net/node/msg/signal", 1234)){ // signal written } |
12.
rpc_tsmaster_cmd_get_flexray_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_get_flexray_signal(const size_tAHandle,const char* ASgnAddress,const pdouble AValue) |
功能介紹 | 在遠程 TSMaster 上獲取數據庫中的 flexray 信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASgnAddress:數據庫中信號的路徑 AValue: 信號值指針 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | double d; if(0==rpc_tsmaster_cmd_get_flexray_signal(h, "chnidx/net/node/msg/signal", &d)){ // signal is retrieved } |
13.
rpc_tsmaster_cmd_write_system_var
函數名稱 | UInt32 rpc_tsmaster_cmd_write_system_var(const size_tAHandle,const char* ACompleteName,const char* AValue) |
功能介紹 | 從遠程 TSMaster 按名稱寫入系統變量 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ACompleteName:系統變量名稱 AValue: 數據值 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_cmd_write_system_var(h, "v1", "1.2345") |
14.
rpc_tsmaster_cmd_read_system_var
函數名稱 | UInt32 rpc_tsmaster_cmd_read_system_var(const size_tAHandle,const char* ASysVarName,const pdouble AValue) |
功能介紹 | 從遠程 TSMaster 按名稱讀取系統變量 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ASysVarName:系統變量名稱 AValue: 數據值指針 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | double d; if (0 == rpc_tsmaster_cmd_read_system_var(h, "v1", &d)){ log("value = %f", d); } |
15.
rpc_tsmaster_cmd_write_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_write_signal(const size_t AHandle,constTLIBApplicationChannelType ABusType,const char* AAddr,const double AValue) |
功能介紹 | 從遠程 TSMaster 按名稱寫入信號值 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ABusType:總線類型 AAddr:數據庫中信號的路徑 AValue: 數據值 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | if(0==rpc_tsmaster_cmd_write_signal(h,APP_CAN, "0/Powertrain/Engine/EngSpeed", 1234)){ // value written } |
16.
rpc_tsmaster_cmd_read_signal
函數名稱 | UInt32 rpc_tsmaster_cmd_read_signal(const size_t AHandle,constTLIBApplicationChannelType ABusType,const char* AAddr,const pdouble AValue) |
功能介紹 | 從遠程 TSMaster 按名稱讀取信號 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 ABusType:總線類型 AAddr:數據庫中信號的路徑 AValue: 數據值指針 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | double d; if(0==rpc_tsmaster_cmd_read_signal(h,APP_CAN, "0/Powertrain/Engine/EngSpeed", &d)){ log("signal value = %f", d); } |
17.
rpc_tsmaster_delete_client
函數名稱 | UInt32 rpc_tsmaster_delete_client(const size_t AHandle) |
功能介紹 | 刪除 rpc client |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_delete_client(h) |
18.
rpc_tsmaster_cmd_stop_simulation
函數名稱 | UInt32 rpc_tsmaster_cmd_stop_simulation(const size_t AHandle) |
功能介紹 | 停止遠程 TSMaster 仿真 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | rpc_tsmaster_cmd_stop_simulation(h) |
19.
rpc_tsmaster_call_system_api
函數名稱 | UInt32 rpc_tsmaster_call_system_api(const size_t AHandle,constchar* AAPIName,const s32 AArgCount,const s32 AArgCapacity,const char** AArgs) |
功能介紹 | Client 調用 server 端使用系統函數 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 AAPIName:系統函數名稱,”app.create_system_var” AArgCount: 函數參數數量 AArgCapacity:參數字符串長度 AArgs:參數字符串數組 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | // 第一步:準備調用函數的輸入參數 #define STR_BUFFER_SIZE 1024 char args[4][STR_BUFFER_SIZE]; char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]}; sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1"); sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString); sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value"); sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment"); // 步驟 2:調用任意 API s32 ret; ret = com.rpc_tsmaster_call_system_api(h, "app.create_system_var", 4, STR_BUFFER_SIZE, &pArgs[0]); // 步驟 3:處理參數中的返回值(如果可用) s32 i; log("API call result = %d", ret); for (i=0; i<4; i++){ log("Argument %d: %s", i+1, pArgs[i]); } |
20.
rpc_tsmaster_call_library_api
函數名稱 | UInt32 rpc_tsmaster_call_library_api(const size_t AHandle,constchar* AAPIName,const s32 AArgCount,const s32 AArgCapacity,const char** AArgs) |
功能介紹 | Client 調用 server 端使用系統函數 |
調用位置 | 創建 TSMaster Rpc 客戶端之后 |
輸入參數 | AHandle : TSMaster Rpc 客戶端句柄 AAPIName:小程序庫函數名稱,”mylib.create_system_var” AArgCount: 函數參數數量 AArgCapacity:參數字符串長度 AArgs:參數字符串數組 |
返回值 | ==0: 函數執行成功 其他值:函數執行失敗 |
示例 | // 第一步:準備調用函數的輸入參數 #define STR_BUFFER_SIZE 1024 char args[4][STR_BUFFER_SIZE]; char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]}; sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1"); sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString); sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value"); sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment"); //步驟 2:調用任意 API s32 ret; ret = com.rpc_tsmaster_call_library_api(h, "mylib.create_system_var", 4, STR_BUFFER_SIZE, &pArgs[0]); // 步驟 3:處理參數中的返回值(如果可用) s32 i; log("API call result = %d", ret); for (i=0; i<4; i++){ log("Argument %d: %s", i+1, pArgs[i]); } |
-
編程
+關注
關注
88文章
3686瀏覽量
95045 -
RPC
+關注
關注
0文章
111瀏覽量
11846 -
網絡通信
+關注
關注
4文章
824瀏覽量
30843
發布評論請先 登錄
可編程控制器(PLC)實驗指導書三
根據實際應用編寫MPLAB-IDE入門指導 mini-PRO ICD2系列使用說明
TSMaster 自定義 LIN 調度表編程指導

重磅!翹首以盼的《TSMaster開發從入門到精通》正式出版!

新書推薦 | TSMaster開發從入門到精通

干貨分享 | TSMaster AUTOSAR E2E使用說明

評論