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操作的全部過程,怎麼樣,很簡單吧?