任务:
编程实现采集传感器数据和控制硬件设备(传感器和硬件通过slave模拟)
传感器:2个,光线传感器、加速度传感器(x\y\z)
硬件设备:2个,led灯、蜂鸣器
要求:
- 多任务编程:多线程、多进程
- 循环1s采集一次数据,并将数据打印至终端
- 同时从终端输入指令控制硬件设备
0 1 :led灯打开
0 0:led灯关闭
1 1:蜂鸣器开
1 0 : 蜂鸣器关
1.设置两个slave
ID=1, 功能码:01线圈
ID=1,功能码:03保持寄存器
2.连接
连接成功图示:
#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char const *argv[])
{
modbus_t *ctx;
uint16_t buf[64] = {};
//1.以TCP方式创建Modbus实例,并初始化 ip地址和端口号502
ctx = modbus_new_tcp(argv[1], atoi(argv[2]));
if (ctx == NULL)
{
perror("modbus create err");
return -1;
}
//2.设置从机ID
int set_id = modbus_set_slave(ctx, 1);
if (set_id != 0)
{
perror("set id err");
return -1;
}
//3.和从机(slave)建立连接
int con = modbus_connect(ctx);
if (con != 0)
{
perror("connect err");
return -1;
}
pid_t pid = fork();
if (pid < 0)
{
perror("fork err");
return -1;
}
else if (pid == 0)
{
while (1)
{
//4.寄存器操作 modbus实例 起始地址 寄存器个数 存储值
modbus_read_registers(ctx, 0, 4, buf);
for (int i = 0; i < 4; i++)
{
if (i == 0)
{
printf("光线传感器数值");
printf("%d", buf[i]);
putchar(10);
}
else if (i == 1)
{
printf("加速度传感器 x :%d \n", buf[i]);
}
else if (i == 2)
{
printf("加速度传感器 y :%d \n", buf[i]);
}
else
{
printf("加速度传感器 z :%d \n", buf[i]);
}
}
putchar(10);
sleep(5);
}
exit(0);
}
else
{
int a, b;
while (1)
{
scanf("%d %d", &a, &b);
if (a == 0 && b == 1)
{
printf("LED灯打开\n");
}
else if (a == 0 && b == 0)
{
printf("LED灯关闭\n");
}
else if (a == 1 && b == 1)
{
printf("蜂鸣器开\n");
}
else if (a == 1 && b == 0)
{
printf("蜂鸣器关\n");
}
modbus_write_bit(ctx, a, b);
}
//5.关闭套接字
modbus_close(ctx);
//6.释放实例
modbus_free(ctx);
}
//wait(NULL);
return 0;
}
运行结果(./a.out windows的ip地址 端口号:502)