標(biāo)題: stc89c52rc串口hc-05向手機(jī)發(fā)送數(shù)據(jù),手機(jī)接收到這個� [打印本頁]

作者: asd9988775    時間: 2017-6-16 22:53
標(biāo)題: stc89c52rc串口hc-05向手機(jī)發(fā)送數(shù)據(jù),手機(jī)接收到這個�
stc89c52rc串口hc-05向手機(jī)發(fā)送數(shù)據(jù),手機(jī)接收到這個�

作者: cjjcjj1    時間: 2017-6-17 07:03
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: a0931727149    時間: 2017-6-17 12:16
這表示手機(jī)收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機(jī)送出的值並不是ASCII code

作者: asd9988775    時間: 2017-6-17 15:35
a0931727149 發(fā)表于 2017-6-17 12:16
這表示手機(jī)收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機(jī)送出的值並不是ASCII code

怎么看單片機(jī)發(fā)送的是不是ASCII code?手機(jī)我用ASCII解析過還是�
作者: asd9988775    時間: 2017-6-17 15:35
a0931727149 發(fā)表于 2017-6-17 12:16
這表示手機(jī)收到的值用ASCII無法解得出來,,,先檢查傳輸率是否相同,或是單片機(jī)送出的值並不是ASCII code

怎么看單片機(jī)發(fā)送的值是不是ASCII code。手機(jī)端我用ASCII解析過,還是�
作者: asd9988775    時間: 2017-6-17 15:36
手機(jī)我用ASCII解析過,還是�。怎么知道單片機(jī)發(fā)送的值是不是ASCII code
作者: asd9988775    時間: 2017-6-17 15:39
單片機(jī)發(fā)送的值怎么看是不是ASCII code ?手機(jī)端用ASCII 解析還是 �
作者: a0931727149    時間: 2017-6-17 17:19
那這個符號�ASCII 為何???? 是善意提醒如果單片機(jī)送出是 HEX 格式 手機(jī)也要是HEX 格式 ,如果單片機(jī)輸出是字符(ASCII) 格式 手機(jī)端也要是字符(ASCII)格式
作者: a0931727149    時間: 2017-6-17 17:57
因ASCII 內(nèi)無這個�字符.....
如果單片機(jī)的傳輸協(xié)定與手機(jī)的傳輸協(xié)定一致的話 。。。而手機(jī)收到的是�可見手機(jī)是解析字符模式.....如是解析HEX 模式應(yīng)當(dāng)顯示 00 - ff 的值 ....所以手機(jī)是解析字符模式......
ASCII 內(nèi)並無這個符號�訝?故程ˋˋ式中無法指定傳送這個�字符 ....因此猜測單片機(jī)式傳送HEX 值
作者: asd9988775    時間: 2017-6-17 18:15
a0931727149 發(fā)表于 2017-6-17 17:19
那這個符號�ASCII 為何???? 是善意提醒如果單片機(jī)送出是 HEX 格式 手機(jī)也要是HEX 格式 ,如果單片機(jī) ...

嗯,我試試
作者: asd9988775    時間: 2017-6-17 19:52
a0931727149 發(fā)表于 2017-6-17 17:57
因ASCII 內(nèi)無這個�字符.....
如果單片機(jī)的傳輸協(xié)定與手機(jī)的傳輸協(xié)定一致的話 。。。而手機(jī)收到的是 ...

好詳細(xì),謝謝,我看看
作者: asd9988775    時間: 2017-6-17 21:39
在手機(jī)端發(fā)送a,下位機(jī)接收到0xA1 0x96  0xb2
作者: asd9988775    時間: 2017-6-17 21:40
我實(shí)在是不知道哪出問題了。用hc-05藍(lán)牙模塊接收。藍(lán)牙模塊也沒有設(shè)置什么9600波特率,0效驗(yàn),8數(shù)據(jù)位,1停止位。
作者: asd9988775    時間: 2017-6-17 21:43
我用的單片機(jī)是stc89c52Rc
作者: a0931727149    時間: 2017-6-17 23:07
看樣子有像傳輸協(xié)定不一致......
可能需要分段測試....1.測試單片機(jī)有無如設(shè)計.......2.hc-05藍(lán)牙模塊接收的傳輸協(xié)定 .....
建議擬公開單片機(jī)是stc89c52Rc程式....請網(wǎng)友幫忙測試


作者: asd9988775    時間: 2017-6-18 10:39
a0931727149 發(fā)表于 2017-6-17 23:07
看樣子有像傳輸協(xié)定不一致......
可能需要分段測試....1.測試單片機(jī)有無如設(shè)計.......2.hc-05藍(lán)牙模塊接收 ...
  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;           //將單片機(jī)的P2.0端口定義為led
  12. sbit led2=P2^1;           //將單片機(jī)的P2.0端口定義為led
  13. void InitUART(void)
  14. {
  15. /*******************設(shè)定串口**********************/
  16. SCON=0x50;                        //設(shè)置為工作方式1
  17. TMOD=0x20;                        //設(shè)置計數(shù)器工作方式2
  18. PCON =0x80;                        //波特率加倍
  19. TH1=0xFA;                                //計數(shù)器初始值設(shè)置,注意波特率是9600的
  20. TL1=TH1;
  21. ES=1;                                                //打開接收中斷
  22. EA=1;                                                //打開總中斷
  23. TR1=1;                                        //打開計數(shù)器
  24. /******************設(shè)定中斷**********************/
  25. }
  26. void main()  //主函數(shù)
  27. {        
  28. InitUART();
  29. while(1){
  30. if(Flag==1)
  31. {
  32.         
  33.         ES=0;
  34.         delayms(50);
  35. //----------------------該段即對接收的數(shù)據(jù)進(jìn)行處理
  36.         if(SenData==97)//97為字符a的ascii
  37.         {
  38.         led=0;        //P2.0端口設(shè)置為低電平
  39.         delayms(10);//延時去抖動
  40.         send_str();//發(fā)送數(shù)據(jù)
  41.         led=1;        //P2.0端口設(shè)置為低電平        
  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接受中斷標(biāo)志
  57. {
  58. SenData = SBUF ;
  59. RI=0;//清除標(biāo)志.
  60. Flag =1;//標(biāo)志位置1表示有新數(shù)據(jù)進(jìn)來
  61. }
  62. }


  63. void send_str()//發(fā)送字串
  64. {
  65. unsigned char i=0;
  66. Flag=0;//數(shù)據(jù)處理完畢后將標(biāo)志位置0,表示沒有新數(shù)據(jù)要處理
  67. while(str1[i]!='\0')
  68. {
  69. SBUF =str1[i];
  70. while(!TI);//等待數(shù)據(jù)傳送
  71. TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
  72. i++;//下一個字符串
  73. }
  74. }

  75. void send_str2()//發(fā)送字串
  76. {
  77. unsigned char i=0;
  78. Flag=0;//數(shù)據(jù)處理完畢后將標(biāo)志位置0,表示沒有新數(shù)據(jù)要處理
  79. while(str2[i]!='\0')
  80. {
  81. SBUF =str2[i];
  82. while(!TI);//等待數(shù)據(jù)傳送
  83. TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
  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. }
復(fù)制代碼

就是這簡單的
這個STC89c52RC單片機(jī)的程序

作者: cjjcjj1    時間: 2017-6-18 12:32
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 鐵峰66666    時間: 2017-6-18 13:24
有可能接收后的是ASCII碼
作者: asd9988775    時間: 2017-6-18 15:38
  安卓用 mmOutStream.write(buffer);發(fā)送   buffer=byte[] 》》97
接收  BufferedReader br = new BufferedReader(new InputStreamReader(mmInStream));
                    char[] by = new char[128];
                    int lenght = br.read(by);

得到的數(shù)據(jù)char[]數(shù)組里是 0='�' 65533
剩下的都是'\u0000' 0

作者: asd9988775    時間: 2017-6-18 15:44
把接收到char數(shù)組.toString()后得到的是[C@后面的7位每次都不一樣
作者: asd9988775    時間: 2017-6-19 10:48
asd9988775 發(fā)表于 2017-6-17 15:39
單片機(jī)發(fā)送的值怎么看是不是ASCII code ?手機(jī)端用ASCII 解析還是 �

ASCII轉(zhuǎn)碼試了不行

作者: stringedge    時間: 2017-6-19 19:34
應(yīng)該是文字編碼方式的問題
作者: xjjwws    時間: 2017-6-20 16:46
必須轉(zhuǎn)碼,轉(zhuǎn)為Uncode發(fā)送,沒有轉(zhuǎn)碼導(dǎo)致……
作者: a0931727149    時間: 2017-6-20 17:52
本帖最后由 a0931727149 于 2017-7-3 20:15 編輯

while(str1!='\0')
{
SBUF =str1;
while(!TI);//等待數(shù)據(jù)傳送
TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
i++;//下一個字符串
}
}

void send_str2()//發(fā)送字串
{
unsigned char i=0;
Flag=0;//數(shù)據(jù)處理完畢后將標(biāo)志位置0,表示沒有新數(shù)據(jù)要處理
while(str2!='\0')
{
SBUF =str2;
while(!TI);//等待數(shù)據(jù)傳送
TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
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. 這樣單片機(jī)是stc89c52Rc應(yīng)該會正常了........

復(fù)制代碼

作者: a0931727149    時間: 2017-6-20 18:10
有BUG 的關(guān)鍵
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的程式應(yīng)該就可以用了

作者: asd9988775    時間: 2017-7-3 16:07
a0931727149 發(fā)表于 2017-6-20 17:52
while(str1!='\0')
{
SBUF =str1;

我發(fā)現(xiàn)我的晶振是12Mhz的,我拿51波特率初始值計算工具計算設(shè)置值:定時器方式-方式2,晶振頻率-12
,波特率-9600,smod-1。計算后是F9H。
我現(xiàn)在的串口設(shè)置是
        SCON=0x50;                        //設(shè)置為工作方式1
TMOD=0x20;                        //設(shè)置計數(shù)器工作方式2
PCON =0x80;                        //波特率加倍
TH1=0xF9;                                //計數(shù)器初始值設(shè)置,注意波特率是9600的
TL1=TH1;
ES=1;                                                //打開接收中斷
EA=1;                                                //打開總中斷
TR1=1;
模擬和真機(jī)上都不返回數(shù)據(jù)。模擬上返回時串口error亮了。
可是我把TH1=0xF9; 改成 0xFD返回
作者: a0931727149    時間: 2017-7-3 20:34
晶振用12Mhz會約7 %的誤差......最好改用11.0592Mhz的比較好
我用11.0592用AT89s51 配串列助手在PC   下RUN 可正常工作.....
建議你先用串列助手調(diào)適單片機(jī)的程式....等到單片機(jī)的程式完成後再來調(diào)適藍(lán)芽裝置.....最後再來調(diào)適手機(jī)端程式.....手機(jī)端程式可先下載手機(jī)的串列助手來調(diào)適 .....最後再測試你發(fā)展的程式.......






作者: asd9988775    時間: 2017-7-3 21:12
現(xiàn)在,程序是TH1 = 0xF9,手機(jī)發(fā)送a,應(yīng)該是返回給手機(jī)的數(shù)據(jù),卻在串口調(diào)試工具中顯示了。
數(shù)據(jù)正確應(yīng)該是 Error。在串口調(diào)試小助手上現(xiàn)實(shí)的是 舝ror Error 膨騩r 咈蝻r 舝ror E蝌矧 Error
不知道是什么情況。我用的是開發(fā)板,上面的晶振是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)
{
        /*******************設(shè)定串口**********************/
SCON = 0x50; //設(shè)置為工作方式1
TMOD = 0x20; //設(shè)置計數(shù)器工作方式2
PCON = 0x80; //波特率加倍
TH1 = 0xF9; //計數(shù)器初始值設(shè)置,注意波特率是9600的
TL1 = TH1;
SM0=0;//8位UART
SM1=1;
REN=1;//開始接收
ES = 1; //打開接收中斷
EA = 1; //打開總中斷
TR1 = 1; //打開計數(shù)器
        /******************設(shè)定中斷**********************/
}
void main()  //主函數(shù)
{       
        InitUART();
        while(1){
                if(Flag==1)
                {
                        ES=0;
                        delayms(100);
                //----------------------該段即對接收的數(shù)據(jù)進(jìn)行處理
                if(SenData=='a')
                        {
                                delayms(30);//延時去抖動
                                send_str();//發(fā)送數(shù)據(jù)
                        }
                        else
                        {
                                delayms(30);
                                send_str2();
                        }
                        i=0;
                        ES=1;
                        Flag=0;//數(shù)據(jù)處理完畢后將標(biāo)志位置0,表示沒有新數(shù)據(jù)要處理
                }else{
                        i=0;
                }
        }
}

void ser_int()interrupt 4//接收字符串
{  
        if(RI)//RI接受中斷標(biāo)志
        {
                RI=0;//清除標(biāo)志.
                SenData=SBUF;
                Flag =1;//標(biāo)志位置1表示有新數(shù)據(jù)進(jìn)來
        }else                                    //如果是發(fā)送中斷,將TI清0
       TI = 0;
}

/*************************************
                                                成功,返回
*************************************/
void send_str()//發(fā)送字串
{
        while(str1[i]!='\0'&&i<7)
        {
                delayms(10);
                SBUF=str1[i];
                while(TI!=1);//等待數(shù)據(jù)傳送
                TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
                i++;//下一個字符串        led=1;
                //delay(50000); //大約延時450ms
        }
}
/*************************************
                                                失敗,返回
*************************************/
void send_str2()//發(fā)送字串
{
        while(str2[i]!='\0' && i<5 )
                {
                        delayms(10);
                        SBUF=str2[i];
                        while(TI!=1);//等待數(shù)據(jù)傳送
                        TI=0;//清除數(shù)據(jù)傳輸標(biāo)志
                        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--);       
}
*************************************/





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1