找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6349|回复: 26
打印 上一主题 下一主题
收起左侧

stc89c52rc串口hc-05向手机发送数据,手机接收到这个�

[复制链接]
跳转到指定楼层
楼主
ID:208322 发表于 2017-6-16 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stc89c52rc串口hc-05向手机发送数据,手机接收到这个�
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-6-17 07:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:140371 发表于 2017-6-17 12:16 | 只看该作者
這表示手機收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機送出的值並不是ASCII code

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:208322 发表于 2017-6-17 15:35 | 只看该作者
a0931727149 发表于 2017-6-17 12:16
這表示手機收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機送出的值並不是ASCII code

怎么看单片机发送的是不是ASCII code?手机我用ASCII解析过还是�
回复

使用道具 举报

5#
ID:208322 发表于 2017-6-17 15:35 | 只看该作者
a0931727149 发表于 2017-6-17 12:16
這表示手機收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機送出的值並不是ASCII code

怎么看单片机发送的值是不是ASCII code。手机端我用ASCII解析过,还是�

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:208322 发表于 2017-6-17 15:36 | 只看该作者
手机我用ASCII解析过,还是�。怎么知道单片机发送的值是不是ASCII code
回复

使用道具 举报

7#
ID:208322 发表于 2017-6-17 15:39 | 只看该作者
单片机发送的值怎么看是不是ASCII code ?手机端用ASCII 解析还是 �
回复

使用道具 举报

8#
ID:140371 发表于 2017-6-17 17:19 | 只看该作者
那這個符號�ASCII 為何???? 是善意提醒如果單片機送出是 HEX 格式 手機也要是HEX 格式 ,如果單片機輸出是字符(ASCII) 格式 手機端也要是字符(ASCII)格式

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:140371 发表于 2017-6-17 17:57 | 只看该作者
因ASCII 內無這個�字符.....
如果單片機的傳輸協定與手機的傳輸協定一致的話 。。。而手機收到的是�可見手機是解析字符模式.....如是解析HEX 模式應當顯示 00 - ff 的值 ....所以手機是解析字符模式......
ASCII 內並無這個符號�訝?故程ˋˋ式中無法指定傳送這個�字符 ....因此猜測單片機式傳送HEX 值

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:208322 发表于 2017-6-17 18:15 | 只看该作者
a0931727149 发表于 2017-6-17 17:19
那這個符號�ASCII 為何???? 是善意提醒如果單片機送出是 HEX 格式 手機也要是HEX 格式 ,如果單片機 ...

嗯,我试试
回复

使用道具 举报

11#
ID:208322 发表于 2017-6-17 19:52 | 只看该作者
a0931727149 发表于 2017-6-17 17:57
因ASCII 內無這個�字符.....
如果單片機的傳輸協定與手機的傳輸協定一致的話 。。。而手機收到的是 ...

好详细,谢谢,我看看
回复

使用道具 举报

12#
ID:208322 发表于 2017-6-17 21:39 | 只看该作者
在手机端发送a,下位机接收到0xA1 0x96  0xb2
回复

使用道具 举报

13#
ID:208322 发表于 2017-6-17 21:40 | 只看该作者
我实在是不知道哪出问题了。用hc-05蓝牙模块接收。蓝牙模块也没有设置什么9600波特率,0效验,8数据位,1停止位。
回复

使用道具 举报

14#
ID:208322 发表于 2017-6-17 21:43 | 只看该作者
我用的单片机是stc89c52Rc
回复

使用道具 举报

15#
ID:140371 发表于 2017-6-17 23:07 | 只看该作者
看樣子有像傳輸協定不一致......
可能需要分段測試....1.測試单片机有無如設計.......2.hc-05蓝牙模块接收的傳輸協定 .....
建議擬公開单片机是stc89c52Rc程式....請網友幫忙測試

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

16#
ID:208322 发表于 2017-6-18 10:39 | 只看该作者
a0931727149 发表于 2017-6-17 23:07
看樣子有像傳輸協定不一致......
可能需要分段測試....1.測試单片机有無如設計.......2.hc-05蓝牙模块接收 ...
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. unsigned char SenData,Flag=0;

  4. char code str1[]="Success";
  5. char code str2[]="Error";

  6. void send_str();
  7. void InitUART(void);
  8. void send_str2();
  9. void delayms(unsigned char ms);
  10. void send_char(unsigned char txd);

  11. sbit led=P2^0;           //将单片机的P2.0端口定义为led
  12. sbit led2=P2^1;           //将单片机的P2.0端口定义为led
  13. void InitUART(void)
  14. {
  15. /*******************设定串口**********************/
  16. SCON=0x50;                        //设置为工作方式1
  17. TMOD=0x20;                        //设置计数器工作方式2
  18. PCON =0x80;                        //波特率加倍
  19. TH1=0xFA;                                //计数器初始值设置,注意波特率是9600的
  20. TL1=TH1;
  21. ES=1;                                                //打开接收中断
  22. EA=1;                                                //打开总中断
  23. TR1=1;                                        //打开计数器
  24. /******************设定中断**********************/
  25. }
  26. void main()  //主函数
  27. {        
  28. InitUART();
  29. while(1){
  30. if(Flag==1)
  31. {
  32.         
  33.         ES=0;
  34.         delayms(50);
  35. //----------------------该段即对接收的数据进行处理
  36.         if(SenData==97)//97为字符a的ascii
  37.         {
  38.         led=0;        //P2.0端口设置为低电平
  39.         delayms(10);//延时去抖动
  40.         send_str();//发送数据
  41.         led=1;        //P2.0端口设置为低电平        
  42.         }
  43.         else
  44.         {
  45.                 led2 = 0;
  46.         delayms(10);
  47.         send_str2();
  48.                 led2 = 1;
  49.         }

  50.         ES=1;
  51. }
  52. }
  53. }

  54. void ser_int()interrupt 4//接收字符串
  55. {  
  56. if(RI==1)//RI接受中断标志
  57. {
  58. SenData = SBUF ;
  59. RI=0;//清除标志.
  60. Flag =1;//标志位置1表示有新数据进来
  61. }
  62. }


  63. void send_str()//发送字串
  64. {
  65. unsigned char i=0;
  66. Flag=0;//数据处理完毕后将标志位置0,表示没有新数据要处理
  67. while(str1[i]!='\0')
  68. {
  69. SBUF =str1[i];
  70. while(!TI);//等待数据传送
  71. TI=0;//清除数据传输标志
  72. i++;//下一个字符串
  73. }
  74. }

  75. void send_str2()//发送字串
  76. {
  77. unsigned char i=0;
  78. Flag=0;//数据处理完毕后将标志位置0,表示没有新数据要处理
  79. while(str2[i]!='\0')
  80. {
  81. SBUF =str2[i];
  82. while(!TI);//等待数据传送
  83. TI=0;//清除数据传输标志
  84. i++;//下一个字符串
  85. }
  86. }



  87. void delayms( unsigned char ms)//延时子程序
  88. {
  89. unsigned char i;
  90. while(ms--)
  91. {
  92. for(i=0;i<120;i++);
  93. }
  94. }
复制代码

就是这简单的
这个STC89c52RC单片机的程序
回复

使用道具 举报

17#
ID:82765 发表于 2017-6-18 12:32 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

18#
ID:143113 发表于 2017-6-18 13:24 | 只看该作者
有可能接收后的是ASCII码
回复

使用道具 举报

19#
ID:208322 发表于 2017-6-18 15:38 | 只看该作者
  安卓用 mmOutStream.write(buffer);发送   buffer=byte[] 》》97
接收  BufferedReader br = new BufferedReader(new InputStreamReader(mmInStream));
                    char[] by = new char[128];
                    int lenght = br.read(by);

得到的数据char[]数组里是 0='�' 65533
剩下的都是'\u0000' 0
回复

使用道具 举报

20#
ID:208322 发表于 2017-6-18 15:44 | 只看该作者
把接收到char数组.toString()后得到的是[C@后面的7位每次都不一样
回复

使用道具 举报

21#
ID:208322 发表于 2017-6-19 10:48 | 只看该作者
asd9988775 发表于 2017-6-17 15:39
单片机发送的值怎么看是不是ASCII code ?手机端用ASCII 解析还是 �

ASCII转码试了不行
回复

使用道具 举报

22#
ID:212699 发表于 2017-6-19 19:34 | 只看该作者
应该是文字编码方式的问题
回复

使用道具 举报

23#
ID:110734 发表于 2017-6-20 16:46 | 只看该作者
必须转码,转为Uncode发送,没有转码导致……
回复

使用道具 举报

24#
ID:140371 发表于 2017-6-20 17:52 | 只看该作者
本帖最后由 a0931727149 于 2017-7-3 20:15 编辑

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++;//下一个字符串
}


這一段有 bug
  1. 1.while(str1!='\0')
  2. 可改成 while(str1[i][i] !='\0')
  3. 2.SBUF =str1; // 這是將str1的地址傳送出
  4. 可改成 SBUF =str1[i];
  5. 對於 str2  也是相同
  6. 1.while(str2 !='\0')  
  7. 可改成 while(str2[i] !='\0' && i<5 )
  8. 2.SBUF =str2; // 這是將str1的地址傳送出
  9. 可改成 SBUF =str2[i][i];
  10. 這樣单片机是stc89c52Rc應該會正常了........

复制代码
回复

使用道具 举报

25#
ID:140371 发表于 2017-6-20 18:10 | 只看该作者
有BUG 的關鍵
while(str1!='\0')
SBUF =str1;
while(str2!='\0')
SBUF =str2;

改成
while(str1[i] !='\0'  &&  i<7)
SBUF =str1[i];
while(str2[i] !='\0' && i<<5 )
SBUF =str2[i] ;
89c52的程式應該就可以用了
回复

使用道具 举报

26#
ID:208322 发表于 2017-7-3 16:07 | 只看该作者
a0931727149 发表于 2017-6-20 17:52
while(str1!='\0')
{
SBUF =str1;

我发现我的晶振是12Mhz的,我拿51波特率初始值计算工具计算设置值:定时器方式-方式2,晶振频率-12
,波特率-9600,smod-1。计算后是F9H。
我现在的串口设置是
        SCON=0x50;                        //设置为工作方式1
TMOD=0x20;                        //设置计数器工作方式2
PCON =0x80;                        //波特率加倍
TH1=0xF9;                                //计数器初始值设置,注意波特率是9600的
TL1=TH1;
ES=1;                                                //打开接收中断
EA=1;                                                //打开总中断
TR1=1;
模拟和真机上都不返回数据。模拟上返回时串口error亮了。
可是我把TH1=0xF9; 改成 0xFD返回
回复

使用道具 举报

27#
ID:140371 发表于 2017-7-3 20:34 | 只看该作者
晶振用12Mhz會約7 %的誤差......最好改用11.0592Mhz的比較好
我用11.0592用AT89s51 配串列助手在PC   下RUN 可正常工作.....
建議你先用串列助手調適單片機的程式....等到單片機的程式完成後再來調適藍芽裝置.....最後再來調適手機端程式.....手機端程式可先下載手機的串列助手來調適 .....最後再測試你發展的程式.......





回复

使用道具 举报

28#
ID:208322 发表于 2017-7-3 21:12 | 只看该作者
现在,程序是TH1 = 0xF9,手机发送a,应该是返回给手机的数据,却在串口调试工具中显示了。
数据正确应该是 Error。在串口调试小助手上现实的是 舝ror Error 膨騩r 咈蝻r 舝ror E蝌矧 Error
不知道是什么情况。我用的是开发板,上面的晶振是12MHZ。波特率是9600
#include "reg52.h"


unsigned char SenData,Flag=0;

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

unsigned char i=0;

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


void InitUART(void)
{
        /*******************设定串口**********************/
SCON = 0x50; //设置为工作方式1
TMOD = 0x20; //设置计数器工作方式2
PCON = 0x80; //波特率加倍
TH1 = 0xF9; //计数器初始值设置,注意波特率是9600的
TL1 = TH1;
SM0=0;//8位UART
SM1=1;
REN=1;//开始接收
ES = 1; //打开接收中断
EA = 1; //打开总中断
TR1 = 1; //打开计数器
        /******************设定中断**********************/
}
void main()  //主函数
{       
        InitUART();
        while(1){
                if(Flag==1)
                {
                        ES=0;
                        delayms(100);
                //----------------------该段即对接收的数据进行处理
                if(SenData=='a')
                        {
                                delayms(30);//延时去抖动
                                send_str();//发送数据
                        }
                        else
                        {
                                delayms(30);
                                send_str2();
                        }
                        i=0;
                        ES=1;
                        Flag=0;//数据处理完毕后将标志位置0,表示没有新数据要处理
                }else{
                        i=0;
                }
        }
}

void ser_int()interrupt 4//接收字符串
{  
        if(RI)//RI接受中断标志
        {
                RI=0;//清除标志.
                SenData=SBUF;
                Flag =1;//标志位置1表示有新数据进来
        }else                                    //如果是发送中断,将TI清0
       TI = 0;
}

/*************************************
                                                成功,返回
*************************************/
void send_str()//发送字串
{
        while(str1[i]!='\0'&&i<7)
        {
                delayms(10);
                SBUF=str1[i];
                while(TI!=1);//等待数据传送
                TI=0;//清除数据传输标志
                i++;//下一个字符串        led=1;
                //delay(50000); //大约延时450ms
        }
}
/*************************************
                                                失败,返回
*************************************/
void send_str2()//发送字串
{
        while(str2[i]!='\0' && i<5 )
                {
                        delayms(10);
                        SBUF=str2[i];
                        while(TI!=1);//等待数据传送
                        TI=0;//清除数据传输标志
                        i++;//下一个字符串
                }
}


/*************************************
                                                        延时
*************************************/
void delayms( unsigned char ms)//延时子程序
{
        unsigned char i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
/*************************************
                                                        延时
                                        50000,大约延时450ms

void delay(unsigned int i)
{
        while(i--);       
}
*************************************/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表