1. 程式人生 > >嵌入式串列埠程式設計流程框架----藍芽

嵌入式串列埠程式設計流程框架----藍芽

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)還有一點發送和接收速度上存在的差異,程式應該設定適當的延時。