/****************************************************************************** * libmodbus相關資料整理 * 說明: * 目測后續可能要折騰這個modbus,先找點資料看看情況,防止一問三不知。 * * 2017-3-14 深圳 南山平山村 曾劍鋒 *****************************************************************************/ 一、參考文檔: 1. Modbus通訊協議 http://baike.baidu.com/item/Modbus%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE/5972462 2. libmodbus(7) Manual Page http://libmodbus.org/docs/v3.0.6/ 3. 使用libmodbus實作Modbus協定 http://felix-lin.com/linux/%E4%BD%BF%E7%94%A8libmodbus%E5%AF%A6%E4%BD%9Cmodbus%E5%8D%94%E5%AE%9A/ 4. Libmodbus 編程說明 http://shaocheng.li/post/blog/2015-05-24 5. libmodbus的移植 http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/fulinus/article/details/37659661 6. modbus?關於modbus RTU的使用說明II http://www.xuan.idv.tw/wordpress/?p=2427 7. modbus?關於modbus RTU的使用說明 http://www.xuan.idv.tw/wordpress/?p=1705 8. linux下使用libmodbus庫實現modbusTCP與modbusRTU功能 http://www.ithao123.cn/content-10779860.html 二、Ubuntu安裝libmodbus: sudo apt-get install libmodbus5 libmodbus-dev 三、交叉編譯: 1. libmodbus.so與modbus_rtu_test.c應當放在同一文件夾下 2. arm-linux-gcc -o modbus_rtu_test modbus_rtu_test.c -L. -lmodbus 四、Ubuntu編譯、測試: 1. 測試代碼: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <modbus/modbus.h> int main(void) { modbus_t *mb; uint8_t bit_status[2] = {0}; mb = modbus_new_rtu("/dev/ttyUSB0",9600,'N',8,1);//open port modbus_set_slave(mb, 1); //set slave address modbus_set_debug(mb, true); modbus_connect(mb); struct timeval t; t.tv_sec=0; t.tv_usec=1000000; //set modbus time 1000ms modbus_set_response_timeout(mb,&t); modbus_read_bits(mb, 0, 2, bit_status); printf("%d %d\n", bit_status[0], bit_status[1]); modbus_close(mb); modbus_free(mb); return 0; } 2. 編譯: gcc main.c -lmodbus 3. 沒有連接設備輸出結果: Qt@zengjf:~/modbus$ ./a.out Opening /dev/ttyUSB0 at 9600 bauds (N, 8, 1) [01][01][00][00][00][02][BD][CB] Waiting for a confirmation... <01><01><00><00><00> ERROR CRC received 0 != CRC calculated 2190 0 0 4. 邏輯分析儀抓圖數據: