嵌入式串列埠程式設計流程框架----藍芽
阿新 • • 發佈:2018-12-03
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)還有一點發送和接收速度上存在的差異,程式應該設定適當的延時。