android与蓝牙模块HC-05和单片机stc89c52rc通信问题

时间:2021-10-28 22:19:55
单片机上的程序,我贴了出来,接收串口得到的数据,判断是什么,我用keil仿真得到的是0xA1 0x96  0xb2这些数据。可其实我发送的只有 a。
我用过解析ascii转字符串得到的是特殊字符,UTF-8,UTF-16LE,UTF-16BE,GBK,unicode,都是特殊字符。现在用.toHexString,得到的是B2。
请求大神帮我看看,哪里的问题。
#include "reg52.h"
#include "intrins.h"

unsigned char SenData,Flag=0;

char code str1[]="Success";
char code str2[]="Error";

void send_str();
void InitUART(void);
void send_str2();
void delayms(unsigned char ms);
void send_char(unsigned char txd);

sbit led=P2^0;           //将单片机的P2.0端口定义为led
sbit led2=P2^1;           //将单片机的P2.0端口定义为led
void InitUART(void)
{
/*******************设定串口**********************/
SCON=0x50;                        //设置为工作方式1
TMOD=0x20;                        //设置计数器工作方式2
PCON =0x80;                        //波特率加倍
TH1=0xFA;                                //计数器初始值设置,注意波特率是9600的
TL1=TH1;
ES=1;                                                //打开接收中断
EA=1;                                                //打开总中断
TR1=1;                                        //打开计数器
/******************设定中断**********************/
}
void main()  //主函数
{        
InitUART();
while(1){ 
if(Flag==1)
{
        
        ES=0;
        delayms(50);
//----------------------该段即对接收的数据进行处理
        if(SenData==97)//97为字符a的ascii  ------------网上有人说接受的是ascii
        {
        led=0;        //P2.0端口设置为低电平
        delayms(10);//延时去抖动
        send_str();//发送数据
        led=1;        //P2.0端口设置为低电平        
        }
        else
        {
                led2 = 0;
        delayms(10);
        send_str2();
                led2 = 1;
        }

        ES=1;
}
}
}

void ser_int()interrupt 4//接收字符串
{  
if(RI==1)//RI接受中断标志

SenData = SBUF ;
RI=0;//清除标志. 
Flag =1;//标志位置1表示有新数据进来
}
}


void send_str()//发送字串
{
unsigned char i=0;
Flag=0;//数据处理完毕后将标志位置0,表示没有新数据要处理
while(str1!='\0')
{
SBUF =str1;
while(!TI);//等待数据传送
TI=0;//清除数据传输标志
i++;//下一个字符串
}
}

void send_str2()//发送字串
{
unsigned char i=0;
Flag=0;//数据处理完毕后将标志位置0,表示没有新数据要处理
while(str2!='\0')
{
SBUF =str2;
while(!TI);//等待数据传送
TI=0;//清除数据传输标志
i++;//下一个字符串
}
}



void delayms( unsigned char ms)//延时子程序
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
上面是烧录缉拿stc89c52rc芯片里的程序
/////////////////////////////////////////////////////////////
下面是我在安卓使用蓝牙的接收与发送
/*************************************************/         

 发送
    String executStr = edit_name.getText().toString();
                            executStr += "\r\n";
                            mChatService.write(executStr.getBytes());
  public void write(byte[] buffer) {
            if (mmSocket == null) {
                Log.d("----------------------", "没有连接");
                return;
            }
            try {
              /*  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(mmOutStream));
                bw.write(buffer);*/
                mmOutStream.write(buffer);
                if (mmSocket != null) {
                    mmOutStream.flush();
                }
                // Share the sent message back to the UI Activity
                mHandler.obtainMessage(Constants.MESSAGE_WRITE, -1, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "Exception during write", e);
            }
        }
/*************************************************/ 
接收
 byte[] buffer = new byte[1024];
            StringBuilder sb = new StringBuilder();
            int bytes;
            String b = "", str= "";
            Log.d(TAG, "" + mState);
            if (mmSocket == null) {
                Log.d("----------------------", "没有连接");
                return;
            }
            // Keep listening to the InputStream while connected
            while (mState == STATE_CONNECTED) {
                try {
                    BufferedInputStream reader = new BufferedInputStream(mmInStream);
                    bytes = reader.read(buffer);
                    String tempStr = new String(buffer);//temp write to log
                    tempStr.replace("\r\n", "***");
                    /*mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, 0, new String(buffer))
                            .sendToTarget();*/
                    // sb.append(new String(buffer, 0, bytes));
                    for (int i = 0; i < bytes; i++) {
                        b = Integer.toHexString(buffer[i] & 0x000000FF).toUpperCase();
                        str = Integer.toHexString((buffer[i] & 0x000000ff) | 0xffffff00)
                                .substring(6).toUpperCase();
                        if (b.length() < 2)
                            sb.append("0");
                        sb.append(b);
                    }
                    Log.d("message",str);

                  /*
                    if (sb.indexOf("Success") >= 0 || sb.indexOf("Error") >= 0) {*/   -----------------------因为返回的只有成功和异常。所有在这里判断
                    mHandler.obtainMessage(Constants.MESSAGE_READ, bytes - 1, -1, sb.toString())
                            .sendToTarget();
                    //sb.delete(0, sb.length());

4 个解决方案

#1


调试步骤:
1,安卓部分尝试每次发送1字节数据,建议直接填byte数组,先不要从edittext中获取
2,单片机部分,由于汇承蓝牙模块是串口透明传输,建议先将这个模块的连接指示灯搞清楚,长亮为已建立连接,秒闪为AT指令模式
     在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据

#2


不要纠结编码问题,发送:byte[0] = 0x55,,接收到的SBUF 也是 0x55 就好,也就是,发时候值是多少,收到的值就是多少。

#3


我发送的 byte[]  buffers ={0x55};
在51上打断点,,接受的是 0x45,  0x72,  0xef,0x72。

#4


我发送 在安卓上发送0 , 在单片机上接受的是 0xc5, 0xf2, 0xef。

#1


调试步骤:
1,安卓部分尝试每次发送1字节数据,建议直接填byte数组,先不要从edittext中获取
2,单片机部分,由于汇承蓝牙模块是串口透明传输,建议先将这个模块的连接指示灯搞清楚,长亮为已建立连接,秒闪为AT指令模式
     在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据

#2


不要纠结编码问题,发送:byte[0] = 0x55,,接收到的SBUF 也是 0x55 就好,也就是,发时候值是多少,收到的值就是多少。

#3


我发送的 byte[]  buffers ={0x55};
在51上打断点,,接受的是 0x45,  0x72,  0xef,0x72。

#4


我发送 在安卓上发送0 , 在单片机上接受的是 0xc5, 0xf2, 0xef。