嵌入式开发板RS485协议串口编程——角度传感器数据读取

嵌入式开发板RS485协议串口编程——倾角传感器数据读取

之前分享过一篇嵌入式操作系统开发板中的串口编程——光敏电阻数据读取,是基于TTL协议的串口编程,本节主要讲述基于RS485协议的串口编程,掌握了这两种嵌入式开发板的串口编程方法,就基本掌握了嵌入式开发板中对于大多数传感器的数据读取。

RS485通信协议

RS485通信协议是一种串行通信协议,相比于RS232通信协议通信距离短、速率低的缺点,RS485传输距离更长,传输速率最高可达10Mbit/s。RS485通信协议采用的是半双工工作方式,只能有一点处于发送状态,因此,在程序中或者电路设计中要有一个切换发送状态与接收状态的标志位。关于在程序中的标志位待会在程序中我会介绍,电路中的标志位如下:

D28674C9-FFBF-4cc7-96D4-C0EA3B177EA4

与RS232不同的还有,RS485的工作方式是差分工作方式,所谓差分工作方式,是指在一堆双绞线中,一条定义为A,一条定义为B。通常情况下,发送驱动器A、B之间的正电平在+2+6V,是一个逻辑状态,负电平在-2-6V,是另一个逻辑状态(和RS232是相反的),另有一个引脚信号接地。
请添加图片描述

倾角传感器RS485通信协议

我使用是维特智能的一款倾角传感器——SINDT-RS485。具体的描述可以参考它的使用说明书,我这里就不赘述了。

请添加图片描述

它的工作电压和线色的定义如下所示:

E83D5DD3-309D-4b28-83D6-14623584F5DC

通过上面的已知条件就可以得到和嵌入式开发板上RS485串口的连接方式:

DE9CC0EE-AAC1-4387-8D5A-948CBDF7CD2B

我们的目的是读取倾角传感器实时测得的X、Y、Z轴的角度信息。通过阅读使用说明书可以得到,我们需要先给倾角传感器发送角度信号指令,倾角传感器才会给我们发送它实时检测的数据。角度信号指令如下:

29EE84C5-4785-4bf7-A7BF-FFB8961825F7

其中MODADDR为倾角传感器地址0x50。倾角传感器上传回来的数据格式如下:

9DE93F8F-D1A4-4a24-9CAF-F2A12B43749F

有了以上的信息,我们就可以开始着手编程实现啦!!

嵌入式开发板RS485串口编程

首先就是打开RS485串口的设备节点:

int open_port(char *com)
{
	int fd;
	fd = open(com, O_RDWR|O_NOCTTY);
    if (-1 == fd){
		return(-1);
    }
	if(fcntl(fd, F_SETFL, 0)<0) /* 设置串口为阻塞状态*/
	{
		printf("fcntl failed!\n");
		return -1;
	}
	return fd;
}

之后要初始化串口,设置波特率、数据位、停止位、奇偶校验位等。初始化程序我之前已经贴在嵌入式操作系统开发板串口编程——光敏电阻数据读取里了,这里我就赘述了。

然后就是向倾角传感器发送角度信号指令,我把指令放在一个字符数组里:

static char byteSend[8];
byteSend[0] = 0x50;
byteSend[1] = 0x03;
byteSend[2] = 0x00;//寄存器高位
byteSend[3] = 0x3d;//寄存器低位 //角度寄存器
byteSend[4] = 0x00;//寄存器个数高位
byteSend[5] = 0x03;//寄存器个数低位
byteSend[6] = 0x99;//CRCH
byteSend[7] = 0x86;//CRC

在主程序里把指令发送出去,并设置标志位,发送之后读取角度信息:

int main(int argc, char **argv)
{
	int fd;
	int iRet;
	fd = open_port(argv[1]);
	serial_uart_init(fd);
	char context;
	int i = 0;
	int j = 0;
	int flag = 0;
	char r_buf[10];
	char readtext;
	while (1)
	{
		while(flag == 0){
			if(i > 7){
				flag = 1;
				i = 0;
				break;
			}
			context = byteSend[i];
			iRet = write(fd, &context, sizeof(context));
			i++;
		}
		usleep(50000);
		bzero(r_buf, 10);
		while(flag == 1){
			//读传感器发送过来的数据,并解析处理
			if(j > 9){
				flag = 0;
				j = 0;
				break;
			}
			iRet = read(fd, &readtext, sizeof(readtext));
			r_buf[j] = readtext;
			//printf("read:%02x\n", r_buf[j]);
			j++;
		}
		usleep(50000);
		if(r_buf[0] == 0x50 && r_buf[1] == 0x03){
			printf("AngleX:%7.3f, AngleY:%7.3f, AngleZ:%7.3f\n", ((float)((r_buf[3]<<8) | r_buf[4])/32768.0*180),((float)((r_buf[5]<<8) | r_buf[6])/32768.0*180),((float)((r_buf[7]<<8) | r_buf[8])/32768.0*180));		
		}
	}
	return 0;
}

到这里程序就已经完成了。

在Ubuntu中用交叉编译工具编译程序:

请添加图片描述

将倾角传感器按照前面介绍的连接方式连接到开发板上,就可以运行程序了,结果如下:

请添加图片描述

到这里就成功实现了读取倾角传感器的角度信息啦,还可以读取加速度,磁场等等信息。

在嵌入式开发过程中,光掌握串口编程还是不够的。下一节我将介绍嵌入式开发板中CAN通信编程实例,用CAN通信来驱动伺服电机。掌握了串口编程和CAN通信编程,你就可以完成一些具体的嵌入式开发的项目啦。

完整代码我会贴在公众号中,需要完整代码的关注公众号回复RS485串口编程获取。有什么问题也可以在下方留言,我看到之后会回复你。

我是河边小乌龟爬,学习嵌入式软件开发路上的一名小学生,欢迎大家相互交流哇。公众号:河边小乌龟爬。

请添加图片描述

(群名称:嵌入式软件开发交流群;群 号:1004953094)

猜你喜欢

转载自blog.csdn.net/zhm1949/article/details/124640979