歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

給Android設備增加串口功能

環境:

主機:WIN7

開發環境:MDK4.23

功能:

打開Android手機或者平台的藍牙,通過藍牙連接藍牙轉串口板,通過藍牙轉串口板的串口與需要調試的串口設備相連

說明:

1.PCB為我同學hunter繪制,他同時是stm32的高手,感謝他提供的支持.

2.制作了一個藍牙轉串口的板子,Android設備連接上這個板子,就相當於增加了一個串口.

3.單片機選用的是STM32F101C8,藍牙模塊選用的是HC05.HC05本身就是一個藍牙轉串口模塊,再增加一個單片機的作用是可以通過單片機來配置波特率等參數.

4.藍牙轉串口板可以用MINI USB來供電,或者用3.7V锂電池來供電,板子上帶有充電管理芯片,由於沒锂電池,充電這塊還沒有測試.

5.上位機程序(Android上的串口助手)暫時沒有時間寫,可以在安卓市場上搜索"藍牙串口"下一個串口助手.

實物圖:

電路圖:

第1部分:

圖片較大,部分沒有顯示.可以在新窗口打開圖片來看到全部內容

第2部分:

下位機程序:

public.h

  1. #ifndef _PUBLIC_H_   
  2. #define _PUBLIC_H_   
  3.   
  4. //公共頭文件   
  5. #include "main.h"   
  6. #include "string.h"   
  7. #include "stdlib.h"   
  8. #include "stm32f10x_tim.h"   
  9.   
  10. //宏定義   
  11. #define U8 unsigned char   
  12. #define U16 unsigned short   
  13. #define U32 unsigned long   
  14.   
  15. //藍牙轉串口的緩存長度   
  16. #define LEN_BT_STACK    10   
  17.   
  18. //藍牙波特率設置命令   
  19. #define BT_BAUD_4800    "AT+UART=4800,0,0"   
  20. #define BT_BAUD_9600    "AT+UART=9600,0,0"   
  21. #define BT_BAUD_19200   "AT+UART=19200,0,0"   
  22. #define BT_BAUD_38400   "AT+UART=38400,0,0"   
  23. #define BT_BAUD_57600   "AT+UART=57600,0,0"   
  24. #define BT_BAUD_115200  "AT+UART=115200,0,0"   
  25. #define DEFAULT_BAUD    9600   
  26.   
  27. //定義flash頁大小   
  28. #if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || (STM32F10X_CL) || defined (STM32F10X_XL)   
  29.   #define FLASH_PAGE_SIZE    ((uint16_t)0x800)   
  30.   #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages12to13 | FLASH_WRProt_Pages14to15)     
  31. #else   
  32.   #define FLASH_PAGE_SIZE    ((uint16_t)0x400)   
  33.   //需要關閉寫保護的頁面   
  34.   #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages60to63)     
  35. #endif   
  36.   
  37. //定義操作的flash的始末地址63K-64K           
  38. #define BANK1_WRITE_START_ADDR  ((uint32_t)0x0800FC00)   
  39. #define BANK1_WRITE_END_ADDR    ((uint32_t)0x08010000)   
  40.   
  41. //數據結構   
  42.   
  43. //通過藍牙發過來的串口2的數據堆棧   
  44. //數據結構為循環隊列,讀寫緩沖   
  45. #define LEN_BUF 512   
  46. struct _FIFO_Stack  
  47. {  
  48.     unsigned char buf[LEN_BUF];  
  49.     short ptr_r;  
  50.     short ptr_w;  
  51. };  
  52.   
  53. //數據流式符合字符串頭檢索   
  54. #define LEN_MATCH_STRING_HEADER 9   
  55. struct _match_string_header  
  56. {  
  57.     char match[LEN_MATCH_STRING_HEADER];  
  58.     int state;  
  59. };  
  60.   
  61. //數據流式符合字符串尾檢索,並提取數據結構   
  62. #define LEN_MATCH_STRING_TAIL 3   
  63. struct _match_string_tail  
  64. {  
  65.     char match[LEN_MATCH_STRING_TAIL];  
  66.     int state;              //當前狀態/下標   
  67.     int value;              //最後取得的值   
  68.     int max_len;            //數據最大長度   
  69.     char capture_string[10];  
  70.     int capture_index;      //當前捕獲數據下標   
  71.     struct _match_string_header match_string_header;    //用來比較尾是否正確   
  72.     int flag;               //捕獲數據狀態或是捕獲字符尾狀態   
  73. };  
  74.   
  75. //修改flash   
  76. struct _edit_flash  
  77. {  
  78.     unsigned short buf[512];  
  79.     int flag;       //判斷flash是否被修改過   
  80.     int baud;       //需要寫入/讀出的波特率   
  81. };  
  82.   
  83. //公共變量   
  84. //聲明串口結構體   
  85. extern USART_InitTypeDef USART_InitStructure;  
  86.   
  87. //聲明FIFO堆棧給UART2使用   
  88. extern struct _FIFO_Stack fifo_uart2;  
  89.   
  90. //聲明FIFO堆棧給UART1使用   
  91. extern struct _FIFO_Stack fifo_uart1;  
  92.   
  93. //聲明修改flash結構體   
  94. extern struct _edit_flash edit_flash;  
  95.   
  96. //公共函數   
  97. //按照藍牙轉串口的格式發送指令   
  98. void send_bt_cmd(char *str);  
  99.   
  100. //循環緩沖方法   
  101. //初始化   
  102. void init_fifo_stack(struct _FIFO_Stack *stack);  
  103. //讀取全部   
  104. //成功返回字節數,失敗返回-1   
  105. short read_all_fifo_stack(struct _FIFO_Stack *stack,unsigned char *buf);  
  106. //寫入1個字節   
  107. //失敗返回-1,成功返回1   
  108. int write_byte_fifo_stack(struct _FIFO_Stack *stack,unsigned char byte);  
  109.   
  110. //數據流式符合字符串頭檢索方法   
  111. //初始化   
  112. //成功返回1,失敗返回0   
  113. int init_match_string_header(struct _match_string_header *m_str,char *buf);  
  114. //返回-1失敗,返回0正在運行,返回1成功   
  115. int match_string_header_state(struct _match_string_header *m_str,char ch);  
  116.   
  117. //數據流式符合字符串尾檢索,並提取數據結構方法   
  118. //初始化   
  119. //成功返回1,失敗返回0   
  120. int init_match_string_tail(struct _match_string_tail *m_str,char *buf,int max_len);  
  121. //返回-1失敗,返回0正在運行,成功返回得到的數據   
  122. int match_string_tail_state(struct _match_string_tail *m_str,char ch);  
  123.   
  124. //flash操作   
  125. //打開需要操作頁面的寫保護   
  126. void open_write_lock();  
  127. //向flash中寫入數據,1024字節,512個半字   
  128. //成功返回寫入的字節數,失敗返回-1   
  129. int write_flash(unsigned short *buf);  
  130. //讀取flash,讀取1024字節,512半字   
  131. //成功返回讀取的字節數,失敗返回-1   
  132. int read_flash(unsigned short *buf);  
  133.   
  134. //讀取flash,獲得flag和baud   
  135. //成功返回波特率,失敗返回-1   
  136. int read_baud(struct _edit_flash *edit);  
  137. //寫入波特率到flash   
  138. //成功返回1,失敗返回0   
  139. int write_baud(struct _edit_flash *edit,int baud);  
  140.   
  141. #endif  
Copyright © Linux教程網 All Rights Reserved