我用过解析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指令模式
在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据
1,安卓部分尝试每次发送1字节数据,建议直接填byte数组,先不要从edittext中获取
2,单片机部分,由于汇承蓝牙模块是串口透明传输,建议先将这个模块的连接指示灯搞清楚,长亮为已建立连接,秒闪为AT指令模式
在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据
#2
不要纠结编码问题,发送:byte[0] = 0x55,,接收到的SBUF 也是 0x55 就好,也就是,发时候值是多少,收到的值就是多少。
#3
我发送的 byte[] buffers ={0x55};
在51上打断点,,接受的是 0x45, 0x72, 0xef,0x72。
在51上打断点,,接受的是 0x45, 0x72, 0xef,0x72。
#4
我发送 在安卓上发送0 , 在单片机上接受的是 0xc5, 0xf2, 0xef。
#1
调试步骤:
1,安卓部分尝试每次发送1字节数据,建议直接填byte数组,先不要从edittext中获取
2,单片机部分,由于汇承蓝牙模块是串口透明传输,建议先将这个模块的连接指示灯搞清楚,长亮为已建立连接,秒闪为AT指令模式
在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据
1,安卓部分尝试每次发送1字节数据,建议直接填byte数组,先不要从edittext中获取
2,单片机部分,由于汇承蓝牙模块是串口透明传输,建议先将这个模块的连接指示灯搞清楚,长亮为已建立连接,秒闪为AT指令模式
在确定蓝牙模块连接正常之后,单步调试串口中断,读中断打断点,查看数据
#2
不要纠结编码问题,发送:byte[0] = 0x55,,接收到的SBUF 也是 0x55 就好,也就是,发时候值是多少,收到的值就是多少。
#3
我发送的 byte[] buffers ={0x55};
在51上打断点,,接受的是 0x45, 0x72, 0xef,0x72。
在51上打断点,,接受的是 0x45, 0x72, 0xef,0x72。
#4
我发送 在安卓上发送0 , 在单片机上接受的是 0xc5, 0xf2, 0xef。