1. 程式人生 > >Linux C開發之用modbus實現串列埠通訊

Linux C開發之用modbus實現串列埠通訊

    想要讀取串列埠資料,modbus是一個很好用的第三方庫。該庫適用於windows和Linux,支援RTP、RTU等協議,基於Linux的開發較難一些,是我前段時間主要的研究方向。http://www.modbus.org/是modbus的主頁,有興趣的朋友可以檢視一下它的特性。

    廢話不多說,速度開始。首先,你需要安裝modbus的第三方庫,sudo apt-get install libmodbus-dev,然後你就可以在Linux C程式碼裡面寫上#include <modbus.h>了。

    第二步:連線串列埠並做一些引數配置。

m_modbus = modbus_new_rtu("/dev/ttyS0"/*serialPort*/,9600/*baud*/,78,8/*dataBits  */,1/*stopBits*/);//ttys0是Linux第一個串列埠,有的時候預設串列埠是ttys1,最好是列舉一下。在windows下,預設串列埠裝置名為“COM1”
modbus_set_debug(m_modbus, 0);

    第三步:設定等待時間,超過時間沒連線上則報錯。

struct timeval response_timeout;
response_timeout.tv_sec = 1;
response_timeout.tv_usec = 0;
modbus_set_response_timeout(m_modbus,&response_timeout);

    第四步:從串列埠讀取資料,一般是開關量資料,只有0、1兩態。

int i;
if(m_modbus == NULL) 
{
printf("No connection,check your device!\n");
return;
}


uint8_t dest[1024]; //setup memory for data
uint16_t * dest16 = (uint16_t *) dest;
memset(dest, 0, 1024);
int ret = -1; //return value from read functions
int is16Bit = 0;


modbus_set_slave(m_modbus, slave);

ret = modbus_read_input_bits(m_modbus, 0/*startAddress*/, 24/*noOfItems*/, dest);//24值得是讀取埠數量

    第五步:關閉modbus連線。

if(m_modbus) {
modbus_close(m_modbus);
modbus_free(m_modbus);
m_modbus = NULL;
}

    這就是modbus操作的全部過程,怎麼樣,很簡單吧?