先看這篇文章,寫得很詳細:
QT應用篇 四、window編譯LibModbus庫并用QT編寫一個Modbus主機 手把手教學
編譯好的LibModbus庫可以在上面文章里下載,也可以在我的鏈接里下載:
為了在Qt Creator中創建新項目并嵌入上述C++代碼,請執行以下步驟:
打開Qt Creator。
新建項目:
在菜單欄中選擇 File > New File or Project…。
在彈出窗口中,選擇 Non-Qt Project。
選擇 Plain C++ Application 然后點擊“選擇…”。
輸入項目名稱和位置,然后點擊“下一步”。
選擇編譯器套件,比如GCC或MSVC,然后點擊“下一步”。
確認項目摘要信息,點擊“完成”創建項目。
大家看完上面的那篇文章后,正確的目錄如下:
.Pro工程的信息如下:
這三處信息如上圖所示。
main.cpp完整代碼如下:
#include <iostream>
#include <libmodbus/config.h>
#include <unistd.h>
#include<libmodbus/modbus.h>// 配置參數
const int TIMER = 1; // 讀取間隔時間(秒)
const int SERVER_ADDRESS = 1;
const int START_ADDRESS = 101;
const int START_ADDRESS_2 = 1;
const int QUANTITY = 100;
const int QUANTITY_2 = 4;
//const char *COM_PORT = "/dev/ttyS0"; // 示例的Linux串口設備文件
const char *COM_PORT = "COM8";
const int BAUD_RATE = 9600;void modbus_master_rtu() {// 創建Modbus RTU連接modbus_t *ctx = modbus_new_rtu(COM_PORT, BAUD_RATE, 'N', 8, 1);if (ctx == NULL) {std::cerr << "Unable to create the libmodbus context" << std::endl;return;}// 設置從站地址modbus_set_slave(ctx, SERVER_ADDRESS);// 建立連接if (modbus_connect(ctx) == -1) {std::cerr << "Connection failed: " << modbus_strerror(errno) << std::endl;modbus_free(ctx);return;}uint16_t tab_reg[QUANTITY];uint16_t tab_reg_2[QUANTITY_2];// 無限循環讀取數據while (true) {// 讀取第一組保持寄存器int rc = modbus_read_registers(ctx, START_ADDRESS, QUANTITY, tab_reg);// 讀取第二組保持寄存器int rc2 = modbus_read_registers(ctx, START_ADDRESS_2, QUANTITY_2, tab_reg_2);// 處理讀取結果if (rc == QUANTITY) {for (int i = 0; i < rc; i++) {std::cout << tab_reg[i];if (i < rc - 1) {std::cout << ", ";}}std::cout << std::endl;} else {std::cerr << "Error reading registers: " << modbus_strerror(errno) << std::endl;}if (rc2 == QUANTITY_2) {for (int i = 0; i < rc2; i++) {std::cout << tab_reg_2[i];if (i < rc2 - 1) {std::cout << ", ";}}std::cout << std::endl;} else {std::cerr << "Error reading registers: " << modbus_strerror(errno) << std::endl;}// 暫停執行,等待下一輪讀取sleep(TIMER);}modbus_close(ctx);modbus_free(ctx);
}int main() {modbus_master_rtu();return 0;
}
上面的代碼中的串口COM_PORT ,地址要根據自己的modbus協議要求進行修改。
1.當串口線未連接電腦時,串口連接失敗,運行結果如下:
2.當串口線連接電腦時,串口數據每秒輸出到緩存,運行結果如下: