概述
涂鴉智能 (NYSE:TUYA) 是一家致力于讓生活更智能的領先技術公司,涂鴉提供能夠智連萬物的云平臺,打造互聯互通的開發標準,連接品牌、OEM 廠商、開發者、零售商和各行業的智能化需求,涂鴉的解決方案賦能并提升合作伙伴和客戶的產品價值,同時通過技術應用使消費者的生活更加便利,涂鴉智能的智慧商業 SaaS 為豐富的垂直行業提供智能解決方案。涂鴉智能領先業界的技術,符合嚴格的數據保護標準和安全性。 壓力傳感器是工業實踐中最為常用的一種傳感器,其廣泛應用于各種工業自控環境,涉及水利水電、鐵路交通、智能建筑、生產自控、航空航天、軍工、石化、油井、電力、船舶、機床、管道等眾多行業。 同時壓力傳感器可以應用于電子稱重系統或者久坐系統,實現了稱重顯示、超限報警、校準、適應各種工作環境、遠程實時監控等多種功能,可以廣泛應用于各種稱重場景。 本章主要是配置涂鴉模組進行數據通信。
資料下載
https://download.csdn.net/download/qq_24312945/84796130
涂鴉智能
想更多了解涂鴉智能化開發方案,獲取相關技術資料或開發物料,可點擊下方報名參加,同時有30元優惠券。。 https://t.tuya.com/AY1D3R9jGr
涂鴉調試文件下載
在涂鴉平臺下載資料。
涂鴉模塊(BT3L Bluetooth 模組)與串口模塊接線方式。 |涂鴉模塊BT3L Bluetooth 模組) |串口模塊| |--|--| |VCC| VCC| |RX |TX| |TX |RX| |GND| GND|
打開下載的涂鴉模組調試助手,進行串口調試。 在這可以查看到通訊協議(基礎協議)指令收發。
STM32CUBEMX配置讀取模塊信息
配置串口3讀取涂鴉模塊的數據。,由于涂鴉模塊使用的是9600的波特率,故配置為9600。 配置DMA進行數據接收。 開啟中斷。 stm32f103與涂鴉接線方式。 | | | |--|--| | | |
開發板 | 涂鴉模塊 |
---|---|
VCC | VCC |
PB10(TX) | RX |
PB11(RX) | TX |
GND | GND |
讀取代碼配置
/* USER CODE BEGIN PV */
#define BUFFERSIZE 255 //可以接收的最大字符個數
uint8_t ReceiveBuff[BUFFERSIZE]; //接收緩沖區
uint8_t recv_end_flag = 0,Rx_len;//接收完成中斷標志,接收到字符長度
/* USER CODE END PV */
開啟串口IDLE中斷。
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//使能串口3 IDLE中斷
HAL_UART_Receive_DMA(&huart3,ReceiveBuff,BUFFERSIZE);//開啟DMA接收
/* USER CODE END 2 */
定義接收函數。
/* USER CODE BEGIN PFP */
void uart3_data(void);
/* USER CODE END PFP */
串口DMA接收數據,然后通過串口1進行打印數據。
/* USER CODE BEGIN 4 */
void uart3_data(void)
{
if(recv_end_flag ==1)//接收完成標志
{
HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);
for(int i = 0; i < Rx_len ; i++) //清空接收緩存區
ReceiveBuff[i]=0;//置0
Rx_len=0;//接收數據長度清零
recv_end_flag=0;//接收標志位清零
//開啟下一次接收
HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
}
/* USER CODE END 4 */
include "stm32f1xx_it.c"文件中斷外部變量引用。
/* USER CODE BEGIN 0 */
#define BUFFERSIZE 255 //可接收的最大數據量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END 0 */
串口3中斷函數。
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
uint32_t temp;
if(USART3 == huart3.Instance)//判斷是否為串口3中斷
{
if(RESET != __HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))//如果為串口3
{
__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中斷標志
HAL_UART_DMAStop(&huart3);//停止DMA接收
temp = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//獲取DMA當前還有多少未填充
Rx_len = BUFFERSIZE - temp; //計算串口接收到的數據個數
recv_end_flag = 1;
}
}
/* USER CODE END USART3_IRQn 1 */
}
串口打印數據實例
匹配心跳檢測通信協議
以心跳檢測為例子,當涂鴉模塊發送心跳檢測給MCU時候,需要MCU上報信息給涂鴉模塊,同時心跳檢測數據第一次發送0x00,第二次發送0x01。
由于心跳檢測發送的數據是固定的,故需要定義2個數組用來存放。
/* USER CODE BEGIN PV */
uint8_t wifi_first =0;//第一次開啟 發送00 第二次發送01
const uint8_t Buff1[8]={0x55,0xAA,0x00,0x00,0x00,0x01,0x00,0x00};//心跳檢測,第1次 0x55 aa 00 00 00 01 00 03
const uint8_t Buff2[8]={0x55,0xAA,0x00,0x00,0x00,0x01,0x01,0x01};//心跳檢測,第2次 0x55 aa 00 00 00 01 01 04
/* USER CODE END PV */
在之前的uart3_data()函數中添加檢測代碼,通過判斷接收的數據來判斷模塊發送過來的指令。
void uart3_data(void)
{
if(recv_end_flag ==1)//接收完成標志
{
HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口發送接收到的數據
if(ReceiveBuff[0]==0x55&&ReceiveBuff[1]==0xAA)//判斷幀頭和版本
{
if(ReceiveBuff[3]==0x00)//判斷是否為心跳檢測
{
if(wifi_first==0)//第一次發送心跳數據
{
wifi_first=1;
HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
else
{
HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
}
}
for(int i = 0; i < Rx_len ; i++) //清空接收緩存區
ReceiveBuff[i]=0;//置0
Rx_len=0;//接收數據長度清零
recv_end_flag=0;//接收標志位清零
//開啟下一次接收
HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
}
查看串口接收到的數據,可以看到心跳數據已經正常接收。
匹配查詢MCU的版本號通信協議
同時可以看到,接收的數據中,夾著一個55 AA 00 E8 00 00 E7的數據。 通過查詢文檔,可以知道該指令是查詢MCU的版本號。 在涂鴉模塊調試助手中可以查看到該指令的通信協議。
由于MCU版本號為1.0.2和硬件版本號1.0.3,故需用2個數組進行存放該版本號,同時定義一個接收模塊發送的查詢MCU版本信息請求數組。
/* USER CODE BEGIN PV */
uint8_t mcu_version[3]={1,0,2};
uint8_t hardware_version[3]={1,0,3};
uint8_t Buff3[13]={0x55,0xAA,0x00,0xE8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//接收模塊發送的查詢MCU版本信息請求
/* USER CODE END PV */
在之前的uart3_data()函數中添加檢測代碼,通過判斷接收的數據來判斷模塊發送過來的指令。
void uart3_data(void)
{
if(recv_end_flag ==1)//接收完成標志
{
HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口發送接收到的數據
if(ReceiveBuff[0]==0x55&&ReceiveBuff[1]==0xAA)//判斷幀頭和版本
{
if(ReceiveBuff[3]==0x00)//判斷是否為心跳檢測
{
if(wifi_first==0)//第一次發送心跳數據
{
wifi_first=1;
HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
else
{
HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
}
else if(ReceiveBuff[3]==0xE8)//判斷是否為接收模塊發送的查詢MCU版本信息請求
{
for(int i=0;i<3;i++)
{
Buff3[6+i]=mcu_version[i];//將mcu版本放入數組中
Buff3[9+i]=hardware_version[i];//將硬件版本放入數組中
}
Buff3[12]=0;
for(int i=0;i<12;i++)//計算校驗和
{
Buff3[12]=Buff3[12]+Buff3[i];
}
HAL_UART_Transmit(&huart3,(uint8_t*)Buff3,13,0xFFFF); //接收模塊發送的查詢MCU版本信息請求,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff3,13,0xFFFF); //接收模塊發送的查詢MCU版本信息請求,向串口發送,方便查看數據
}
}
for(int i = 0; i < Rx_len ; i++) //清空接收緩存區
ReceiveBuff[i]=0;//置0
Rx_len=0;//接收數據長度清零
recv_end_flag=0;//接收標志位清零
//開啟下一次接收
HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
}
查看串口接收到的數據,可以看到查詢MCU版本信息請求已經發送完畢。
匹配查詢產品信息請求通信協議
同時可以看到,接收的數據中,夾著一個55 AA 00 01 00 00 00 的數據。 通過查詢文檔,可以知道該指令是查詢產品信息請求。 故需要定義pid和初始化發送的數組,后期再將pid和mcu版本號放入數組中。
char pid[]="qhaft0y9";
uint8_t mcu_version[3]={1,0,2};
uint8_t Buff4[20]={0x55,0xAA,0x00,0x01,0x00,0x0D,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x2E,0x00,0x2E,0x00,0x00};//接收模塊發送的查詢產品信息請求
/* USER CODE END PV */
由于有時候模塊會連著發幾條指令過來,故需要對指令進行切割,然后逐條返回。
/* USER CODE BEGIN 4 */
void uart3_data(void)
{
if(recv_end_flag ==1)//接收完成標志
{
HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口發送接收到的數據
uint8_t Rx_flag=0;//接收數據的指令數
uint8_t RX_BUFF_flag[BUFFERSIZE];
if(Rx_len>=4)
{
for(int i1=0;i1-2;i1++)//計算指令數量
{
if(ReceiveBuff[i1]==0x55&&ReceiveBuff[i1+1]==0xAA)
{
RX_BUFF_flag[Rx_flag]=i1;//記錄節點
Rx_flag++;//指令數+1
}
}
uint8_t Tx_flag=0;//發送數據的指令數
uint8_t RX_BUFF[BUFFERSIZE];
/*復制ReceiveBuff數組到RX_BUFF數組*/
//方法1
// for(int i1=0;i1<255;i1++)
// RX_BUFF[i1]=ReceiveBuff[i1];
//
//方法2
memcpy(RX_BUFF,ReceiveBuff,BUFFERSIZE);
while(Tx_flagif(RX_BUFF[0]==0x55&&RX_BUFF[1]==0xAA)//判斷幀頭和版本
{
// HAL_UART_Transmit(&huart1,&RX_BUFF[3],1,0xFFFF);//向串口發送接收到的數據
if(RX_BUFF[3]==0x00)//判斷是否為心跳檢測
{
if(wifi_first==0)//第一次發送心跳數據
{
wifi_first=1;
HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
else
{
HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF); //心跳檢測,向串口發送,方便查看數據
}
}
else if(RX_BUFF[3]==0x01)//接收模塊發送的查詢產品信息請求
{
for(int i=0;i<8;i++)//放入pid
{
Buff4[i+6]=pid[i];
}
//mcu版本mcu_version->1.0.2
Buff4[14]=mcu_version[0]+0x30;
Buff4[16]=mcu_version[1]+0x30;
Buff4[18]=mcu_version[2]+0x30;
Buff4[19]=0;//校驗和清理
for(int i=0;i<19;i++)//計算校驗和
{
Buff4[19]=Buff4[19]+Buff4[i];
}
HAL_UART_Transmit(&huart3,(uint8_t*)Buff4,20,0xFFFF); //心跳檢測,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff4,20,0xFFFF); //心跳檢測,向涂鴉模塊發送
}
else if(RX_BUFF[3]==0xE8)//判斷是否為接收模塊發送的查詢MCU版本信息請求
{
for(int i=0;i<3;i++)
{
Buff3[6+i]=mcu_version[i];//將mcu版本放入數組中
Buff3[9+i]=hardware_version[i];//將硬件版本放入數組中
}
Buff3[12]=0;
for(int i=0;i<12;i++)//計算校驗和
{
Buff3[12]=Buff3[12]+Buff3[i];
}
HAL_UART_Transmit(&huart3,(uint8_t*)Buff3,13,0xFFFF); //接收模塊發送的查詢MCU版本信息請求,向涂鴉模塊發送
HAL_UART_Transmit(&huart1,(uint8_t*)Buff3,13,0xFFFF); //接收模塊發送的查詢MCU版本信息請求,向串口發送,方便查看數據
}
}
memset(RX_BUFF, 0,BUFFERSIZE); //清空數組
if(Tx_flag-1)
{
//方法1
// for(int i1=0;i1<(Rx_len-RX_BUFF_flag[Tx_flag+1]);i1++)
// RX_BUFF[i1]=ReceiveBuff[i1+RX_BUFF_flag[Tx_flag+1]];
//方法2
memcpy(RX_BUFF,ReceiveBuff+RX_BUFF_flag[Tx_flag+1],(Rx_len-RX_BUFF_flag[Tx_flag+1]));
}
Tx_flag++;
}
}
for(int i = 0; i < Rx_len ; i++) //清空接收緩存區
ReceiveBuff[i]=0;//置0
Rx_len=0;//接收數據長度清零
recv_end_flag=0;//接收標志位清零
//開啟下一次接收
HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
}
/* USER CODE END 4 */
手機連接涂鴉
在寫完涂鴉模塊的通訊協議(基礎協議)之后,打開手機中的涂鴉智能,點擊添加設備,然后APP會自動掃描出設備。 或者在右邊的設備中尋找到對應的設備進行添加。 點擊進入后就可以進行設備添加。 選擇需要添加的設備。 添加成功后界面如下所示。 添加成功后,就可以進入該傳感器的實際界面。
審核編輯:湯梓紅
-
壓力傳感器
+關注
關注
35文章
2243瀏覽量
163539 -
涂鴉智能
+關注
關注
7文章
217瀏覽量
19516
發布評論請先 登錄
相關推薦
評論