HC-05Bluetoothモジュールが直面する問題と解決策および携帯電話との通信の実現

1.Bluetoothモジュールのデバッグ-ATコマンドを設定できないという問題を解決するため

USB toTTLモジュールとHC-05Bluetoothモジュール間の接続:

2つのモジュールはグランドを共有し、2つのモジュールはVCCを共有します(VCCは5V)。BluetoothモジュールのRXは変換モジュールのTXに接続され、BluetoothモジュールのTXは変換のRXに接続されます。モジュール。次の図に示すように、
ここに画像の説明を挿入
この時点で、変換モジュールをコンピューターに接続し、シリアルポートデバッグアシスタントを使用してBluetoothモジュールをデバッグします。

1)質問1:シリアルポートが見つかりません

まず、ATコマンドを設定する必要がありますが、シリアルポートに接続すると、次の問題が発生する可能性があります。シリアルポートが検索されないが、正しい接続を確認した後、正しく電源がオンになっている。ただし、シリアルポートが検索されていません。ドライバがインストールされていないことが原因である可能性があります。
ここに画像の説明を挿入

方法1:ドライバーをオンラインでダウンロードする

インターネットでドライバーを見つけてインストールし、再試行してください
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

方法2:ドライバーを自分で更新する

ここに画像の説明を挿入
ここに画像の説明を挿入
ドライバのインストールが完了した後に再起動する必要があります

  • 比較


ここに画像の説明を挿入
ドライバをインストールするにドライバをインストールした後
ここに画像の説明を挿入

2)質問2:シリアルポートを開けませんでした-PL2303HXAは2012年から製造中止になっています、サプライヤーに連絡してください

ドライバを正常にインストールした後、別の問題が発生しました。シリアルポートは識別できますが、開くことができず、正常に使用できません。
ここに画像の説明を挿入
それでも失敗します。中止の問題を解決する必要があります「PL2303HXAは2012年に廃止されました。サプライヤーにお問い合わせください。」

解決

参照リンク
解決策は次のとおりです。
リンク:https
://pan.baidu.com/s/1jw1nsLGd23CagQ_dbkqu0w抽出コード:vc0c
ここからドライバーをダウンロードして解凍し、
ここに画像の説明を挿入
ドライバーをインストールしてから
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
、右クリックしてドライバーを更新し、
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
をクリックします。次に
ここに画像の説明を挿入
ここに画像の説明を挿入
完了する

シリアルテスト

シリアルポートを開いてテストし
ここに画像の説明を挿入
ます。通常どおりペアリングできます。その後、Bluetoothモジュールのデバッグを続行します。
ここに画像の説明を挿入

3)Bluetoothモジュールのデバッグ

HC-05 Bluetoothシリアル通信モジュールには、コマンド応答動作モードと自動接続動作モードの2つの動作モードがあります。自動接続作業モードでは、モジュールはマスター、スレーブ、ループバックの3つの作業役割に分けることができます。

  • モジュールが自動接続モードの場合、事前に設定されたデータ送信に従って自動的に接続されます。
  • モジュールがコマンド応答モードの場合、ATコマンドを実行できます。ユーザーはさまざまなATコマンドをモジュールに送信して、モジュールの制御パラメーターを設定したり、モジュールの制御コマンドを発行したりできます。
    コマンド応答モードに入るには?

コマンド応答モードに入るには、次の2つの方法があります。

  • モジュールの電源がオンの場合、ペアリングされていないときはATモードであり、ボーレートはモジュール自体のボーレートです。デフォルト:9600、ATコマンドを送信するときにPIO11を一度ハイに設定する必要があります。
  • PIO11がハイレベルに設定された後、モジュールの電源を再度オンにします。この時点で、モジュールはATモードになり、ボーレートは38400に固定され、ATコマンドを直接送信できます。
    かつてのPIO11ハイとは何ですか?

Bluetoothモジュールには小さなボタンがあります。1回押すとPIO11が1回高く設定されます。つまり、ATコマンドを送信するたびに最初の方法を押す必要があります。2番目の方法は長押し中に電源を入れることであり、それを管理する必要はありません。ATコマンドを直接送信するだけです。 。

コマンド応答動作モードに入る2つの方法は、異なるボーレートを使用することに注意してください。2番目の方法を使用することをお勧めします。

コマンド応答モードに区別する方法は?

Bluetoothモジュールにライトがあります。ライトが速く点滅する場合は自動接続モードです。ライトがゆっくり点滅する場合はコマンド応答動作モードです。ライトが2回ゆっくり点滅する場合は通常の接続モードです。携帯電話で。
ここに画像の説明を挿入

4)ATコマンド

コマンド応答モードに入った後、シリアルポートデバッグアシスタントを使用してBluetoothデバッグを実行できます。

まず、ATコマンドでは大文字と小文字が区別されず、すべてキャリッジリターンとラインフィードで終了します。次に、一般的に使用されるATコマンドについて説明します
ここに画像の説明を挿入
。ATコマンドの場合、注意すべき点がいくつかあります。

  • AT + NAME?:デバイス名を取得します。多くの例を見てきましたので、このATコマンドが返されない可能性が高いです...しかし、他のコマンドは問題ありません。デバイス名を直接設定するだけです。
  • AT + UART?:シリアルポートパラメータを取得します。ボーレート、ストップビット、チェックビットの3つのシリアルポートパラメータがあります。その値は次のとおりです。

ここに画像の説明を挿入
デフォルト値は9600、0、0です。

Bluetoothパラメータ
ここに画像の説明を挿入
の設定設定結果を確認し、設定が成功し、
ここに画像の説明を挿入
特定のATコマンドセットの科学研究がデータマニュアルを確認し、必要に応じてプライベートメッセージまたはコメントを送信できます

2.携帯電話とBluetoothモジュール間の伝送-接続できないという問題を解決します

Bluetoothモジュールを変換モジュールに直接接続してからコンピュータに接続すると、Bluetoothモジュールは直接自動接続動作モードになります。

このとき、電話機はBluetoothシリアルポートデバッグアプリケーションを開き、それを使用してBluetoothモジュールに接続します。

通常の状況では、最初に携帯電話をペアリングしてから、Bluetoothシリアルポートデバッグアプリケーションに文字列を直接入力すると、コンピューターのシリアルポートで正常に受信できます。

しかし、テスト中、今回はペアリングできましたが、正常に接続できませんでした。
ここに画像の説明を挿入
ここに画像の説明を挿入

1)シナリオ1:携帯電話の問題

Bluetoothはペアリングできますが、接続できません

携帯電話をコンピューターや他の携帯電話に接続しようとすると、どれも不可能であることがわかりました
が、別のHuawei携帯電話を使用するとコンピューターと正常にペアリングできます。(Xiaomi電話のペアリングは失敗しましたが、Huawei電話は正常にペアリングされました)これ
ここに画像の説明を挿入
は私のXiaomi電話のBluetoothペアリングの問題であることがわかります。

その後、Huaweiの携帯電話をテストに使用したところ、Huaweiの携帯電話をBluetoothモジュールとペアリングできないことがわかりました。携帯電話とは関係がないという結論に達しました。Bluetoothモジュールには他のものが必要であるはずです。検索する設定。

2)仮定2:Bluetoothモジュールの構成の問題

情報を確認したところ、Bluetoothモジュールをスレーブとして設定して検索する必要があることが判明したので、試してみました。まず、ATコマンドセット(Punctual Atom提供)を確認して、ATコマンドを
ここに画像の説明を挿入
書き込みます。設定すると、okは設定が成功したことを示します。
ここに画像の説明を挿入
クエリは実際にスレーブモードに設定されています
ここに画像の説明を挿入
が、結果は失敗します。
ここに画像の説明を挿入
これは、私が設定したBluetoothモードが間違っていないことを示しています1、それは他の問題であるはずです

3)仮定3:配線の問題

この問題については、ATコマンドを正常に設定できるため、不可能だと思います。

4)仮定4:シリアルデバッグアシスタントの問題

常にBluetoothデバッグアシスタントを交換してください。名前はBluetoothシリアルポートと呼ばれ、正常に接続
ここに画像の説明を挿入
できます携帯電話とシリアルポートの間で情報を送信できます。
ここに画像の説明を挿入
最後に、問題が正常に解決された場合、問題はシリアルデバッグアシスタント。結論として、正常にペアリングできるが正常に接続できない場合は、Bluetoothの互換性の問題によりペアリングがより面倒になるため、携帯電話またはシリアルデバッグアシスタントを変更してください。

携帯電話のシリアルデバッグアシスタントのapkが必要な場合は、プライベートメッセージやコメントをすることができます

3.携帯電話Bluetoothによって制御されるSTM8MCU

前の2つの例は比較的単純で、この例にはプログラムの内容が含まれます。

実現機能:携帯電話はBluetooth経由でSTM8 MCUにメッセージを送信し、STM8はメッセージを受信した後も変更せずに携帯電話にメッセージを返します。もちろん、この例をマスターしている場合は、携帯電話が特定のメッセージを送信するように変更することもできます。その後、STM8マイクロコントローラーが対応するアクションを実行します。例:LEDの点灯など、モーターの始動など。
ここに画像の説明を挿入
原則は次のとおりです。携帯電話はBluetooth経由でHC-05に送信され、シリアルポートを介してSTM8と通信します。以前は、通常、携帯電話はUSBケーブルを介してコンピュータのシリアルポートを介してSTM8と通信します。シリアルポート。本質的に違いはありません。
現時点では、この記事の冒頭にある文をより深く理解している必要があります。率直に言って、これはBluetoothからシリアルへのデバイスにすぎません。シリアルポートのプログラミングと使用方法を知っているだけで済みます。 、いわゆる透過透過を実現できます。Bluetoothに関連するものはすべてカプセル化されており、触れる必要はありません。

単純なシリアルポート通信であることを知っているので、コードは簡単に実装できます。

モバイルアプリの制御インターフェースは次のように設計されています。
ここに画像の説明を挿入

参照コード

/****************************************************************/
//接收单字符函数UART1_ReceiveByte(),无形参data,有返回值,返回接收到的数据
//采用查询的方法实现
/****************************************************************/
u8 UART1_ReceiveByte(void)
{
 // printf("进入UART1_ReceiveByte函数...\r\n");
  
  u8 UART1_RX_BUF;                //定义接收数据暂存变量
  while (!(UART1_SR & 0x20));    //等待接收标志
  UART1_SR&=0xDF;                //清零接收标志位RXNE
  UART1_RX_BUF=UART1_DR;         //取回接收到的数据
 // printf("取回接收到的数据\r\n");
  
  return  UART1_RX_BUF;         //返回暂存变量中的数据给调用者
}


/****************************************************************/
//初始化函数UART1_Init(),无形参和返回值
/****************************************************************/
void UART1_Init(void)
{
  //1.设定通信数据位数,此处设定为8位数据位,无校验位
  UART1_CR1 = 0x00;
  //**************************************************
  //展开UART1_CR1赋值二进制数值为:0000 0000 
  //含义:R8=0;    接收数据位不存在第9位
  //      T8=0;    发送数据位不存在第9位
  //      UARTD=0; 使能UART功能
  //      M=0;     一个起始位,8个数据位,n个停止位
  //                n取决于UART1_CR3中的STOP[1:0]位
  //      WAKE=0;   UART被空闲总线唤醒
  //      PCEN=0: (UART模式)奇偶校验控制被禁止
  //      PS=0;    偶校验(校验功能未启用)
  //      PIEN=0;  校验中断被禁止
  //*************************************************
  //2.设定通信停止位位数,此处设定为1位停止位
  UART1_CR3 = 0x00;
  //**************************************************
  //展开UART1_CR3赋值二进制数值为:0000 0000 
  //含义:保留位=0;必须保持清零
  //      LINEN=0;LIN模式被禁止
  //      STOP=00;配置为“00”,1个停止位
  //      CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
  //*************************************************
  //3.配置通信波特率参数,此处配置为9600bps(16MHz频率下)
  UART1_BRR2 = 0x03;
  UART1_BRR1 = 0x68;
  //4.使能发送和接收功能
//  UART1_CR2 = 0x0C;
  UART1_CR2 = 0x2C;
  //**************************************************
  //展开UART1_CR2赋值二进制数值为:0010 1100 
  //含义:TIEN=0;发送中断被禁止
  //     TCIEN=0;发送中断完成被禁止
  //      RIEN=1;接收中断开启
  //      ILIEN=0;IDLE中断被禁止
  //      TEN=1;发送功能使能
  //      REN=1;接收功能使能
  //      RWU=0;(UART模式)正常工作模式
  //      PIEN=0;未发送断开字符
  //*************************************************
}


/****************************************************************/
//发送字符重定向函数putchar(),有形参ch,有返回值
/****************************************************************/
int putchar(int ch) 
{  
  UART3_SendByte((u8)ch);
 // UART1_SendByte((u8)ch);//将Printf内容发往串口
  return (ch); 
}

//接收中断服务函数
//**************************中断函数区域**************************
#pragma vector =  UART1_R_RXNE_vector         //0x14
__interrupt void UART1_RX_IRQHandler(void)
{ 
  
  if(UART1_SR&0x20){     //若UART1确实接收到了数据
     UART1_SR&=0xDF;       //清零接收标志位RXNE
  }
  cmd=UART1_DR;         //取回串口数据
  
 //  printf("进入中断服务函数...\r\n");
//   cmd = UART1_ReceiveString(1);
  
      switch(cmd)           //判断串口接收命令值
      {
        case 'a':
            Motor_TurnLeft();                   //左转
            break;
        case 'd':
            Motor_TurnRight();                  //右转
            break;
        case 'w':
            Motor_GoForward();                  //直走
            break;
        case 's':                               
            Motor_GetBack();                    //后退
            break;
        case 'p':                       
            Motor_BeParking();                  //停车
            break;
        case 'n':    //功能二:实现跟随模式              
            //printf("模式二:实现跟随模式   \r\n");
            LED1 = 1;  //熄灯
            Motor_BeParking();
            InfraredFollow_Module();
            break;
        case 'b':    //功能三:实现避障模式
            //printf("模式三:实现避障模式   \r\n");
            LED1 = 1;  //熄灯
            Motor_BeParking();
            InfraredAvoidance_Module();
            break
        default:
            printf("【ERROR】,没有此功能\r\n");
            break;
      }

}

割り込みベクタ番号に関するお問い合わせはこちらをご確認ください:IAR割り込みベクタテーブルと割り込みサービス関数の記述

考えられる問題

携帯電話でボタンをいくつか設定すると、パソコンのシリアルデバッグアシスタントで割り込み機能が2回呼び出されて実行が繰り返される場合があります
ここに画像の説明を挿入
が、シリアルデバッグアシスタントを変更したので問題ありません。 ..それは本当に頭痛の種です
ここに画像の説明を挿入

参照リンク:[共通モジュール] HC-05 Bluetoothシリアル通信モジュールは詳細な説明を使用します(例:携帯電話Bluetooth制御STM32シングルチップマイクロコンピューター)

おすすめ

転載: blog.csdn.net/weixin_44751294/article/details/111588963