码迷,mamicode.com
首页 > 数据库 > 详细

Modbus RTU程序开发解读

时间:2014-06-05 00:39:59      阅读:879      评论:0      收藏:0      [点我收藏+]

标签:linux   串口通信   调试   debug   

Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息。

从官网下载libModbus,观察modbus.h可知关键的结构体为:

typedef struct {
    int nb_bits;
    int nb_input_bits;
    int nb_input_registers;
    int nb_registers;
    uint8_t *tab_bits;
    uint8_t *tab_input_bits;
    uint16_t *tab_input_registers;
    uint16_t *tab_registers;
} modbus_mapping_t;

而在modbus-rtu.h中几个主要的配置函数都使用了该结构体。

RTU操作的一般步骤为:

1、用指定的串口新建一个连接,Windows系统下默认的串口为COM1,Linux系统下默认的串口是/dev/ttyS0;

2、设置频率,比特位,校验位,等价位;

3、设置超时时间;

4、读或者写操作,注意要先设置Slave:modbus_set_slave(m_modbus, 0);

5、关闭连接,取消设备绑定。

主要的操作函数有:

EXPORT int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); //读取串口数据
EXPORT int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest); //读取输入端串口数据
EXPORT int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); //指定位置写操作
EXPORT int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data); //写多个端口

一个简单的例子:

int main(int argc, char * argv[])
{

modbus_t * m_modbus;
int i, addr, act;
int ret = 0;
m_modbus = modbus_new_rtu("/dev/ttyS0", 9600, ‘N‘, 8, 1); //波特率9600,比特位8,校验位1,无等价位
modbus_set_debug(m_modbus, 0); //设置为1将可以看到调试信息
struct timeval response_timeout;
response_timeout.tv_sec = 1;
response_timeout.tv_usec = 0;
modbus_set_response_timeout(m_modbus,&response_timeout); //设置等待延时时间
if(m_modbus && modbus_connect(m_modbus) == -1) {
printf("\nSorry,fail to connect ttyS0,please check your device‘s state.\n");
}
else {
printf("Connected to dev!\n");
connected = 1;
}

if(m_modbus == NULL) 
{
printf("No connection,check your device!\n");
return;
}
/* //注释中的代码作用是读取串口的4个端口数据
uint8_t dest[4]; //setup memory for data
uint16_t * dest16 = (uint16_t *) dest;
memset(dest, 0, 4);
*/
modbus_set_slave(m_modbus, 0);
/* //本段注释代码给指定端口赋值
ret = modbus_read_bits(m_modbus, 0, 4, dest);
printf("%d\n", ret);
for(i = 0; i < 4 ; i++)
{
printf("\n%d:%4d",i,dest[i]);
}
for(i = 0; i < 4 ; i++)
{
ret = modbus_write_bit(m_modbus, i , 1);
if(ret)
{
printf("成功写入数据!返回值:%d\n",ret);
}
else
{
printf("写入数据失败,返回值:%d",ret);
}
sleep(2);
}
*/
//断开连接
if(m_modbus) {
modbus_close(m_modbus);
modbus_free(m_modbus);
m_modbus = NULL;
}
printf("Disconnect succeed!\n");
return 0;
}

本资料来源于个人总结,如有转载,请注明出处,谢谢!

Modbus RTU程序开发解读,布布扣,bubuko.com

Modbus RTU程序开发解读

标签:linux   串口通信   调试   debug   

原文地址:http://blog.csdn.net/zhu530548851/article/details/27199143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!