嵌入式串口编程流程框架----蓝牙

1. 蓝牙串口编程思路:(应用场景:嵌入式开发板上接入蓝牙模块,通过手机app与开发板通信基于蓝牙传输)蓝牙模块接入电脑与手机通信-----Ubuntu与手机通信-----开发板与手机通信(最终目的,前两者只是测试模块和程序调式作用,C语言编写的程序首先Gcc在Ubuntu上测试,后arm-linux-gcc 下载到开发板实现最终手机操控开发板)。

2 本次编程中那些必须做、那些只需了解、那些只需调用:(1)只需调用:蓝牙通过串口与开发板连接通信,不想考虑驱动问题。(2)串口接入必定需要了解串口驱动的安装,不同操作系统可能对于不同版本的驱动,有时候商家提供的驱动可能存在“不是正版的现象”,建议关掉操作系统中“设备驱动程序”自动更新功能(因为插入新硬件系统自动给你安装,也许方便,但也可能存在无法支撑非正版)。(3)使用蓝牙进行通信的核心程序需要自己编写,类似于对文件进行读写,有特定的框架:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
	//1.打开设备
	int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
	if(fd < 0)
	{
		perror("open fail");
		return -1;
	}

	//2.配置串口设备属性
	struct termios old;
	int ret = tcgetattr(fd, &old); //获取串口属性
	if(ret < 0) perror("get attr fial");
	//struct termios newtio = old;

	//激活
	old.c_cflag  |=  CLOCAL | CREAD;
	//设置波特率
	cfsetispeed(&old, B9600);
	cfsetospeed(&old, B9600);

	//设置数据位(8位)
	old.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
	old.c_cflag |= CS8;
	//设置停止位(1位)
	old.c_cflag &= ~CSTOPB; /* 将停止位设置为一个比特 */
	//设置校验位(无)
	old.c_cflag &= ~PARENB;
	
	old.c_cc[VTIME] = 0;
	old.c_cc[VMIN] = 0;

	//把属性写回串口
	ret = tcsetattr(fd, TCSANOW,&old);
	if(ret < 0)perror("set attr fail");


	ret = write(fd, "AT\r\n", 4);
	if(ret < 0) perror("write fail");
	//3.读写数据
	char recvbuffer[128]= {0};
	int i;
	while(1)
	{
		sleep(1);
        ret = read(fd, recvbuffer, 128);
		if(ret > 0)
		{
			printf("ret  = %d\n", ret);
			for(i=0; i<ret; i++)
			{
				printf("%02x ", recvbuffer[i]);
			}
			printf("\n");
		}

	}
	//4.关闭设备
	close(fd);
	return 0;
}

3 串口编程中的细节问题:(1)蓝牙模块传输过来的数据是十六进制(切莫以字符串的形式发送,或许可以从app上可以解决该问题)发过来的形式一段数据,而在开发板一端却是一个字节一个字节接收,所以接收时做好数据校验。(2)还有一点发送和接收速度上存在的差异,程序应该设置适当的延时。

猜你喜欢

转载自blog.csdn.net/wghkemo123/article/details/82117501