歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 給Android設備增加串口功能

給Android設備增加串口功能

日期:2017/3/1 10:27:02   编辑:Linux編程

環境:

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