想要读取串口数据,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操作的全部过程,怎么样,很简单吧?