久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4501|回復: 6
收起左側

如何將字符串數據發送到單片機再返回PC?

[復制鏈接]
ID:300673 發表于 2018-4-2 10:45 | 顯示全部樓層 |閱讀模式
本帖最后由 Michael1999 于 2018-4-2 10:46 編輯

單片機萌新,剛學習串口通信,現在實現了將單個字符數據發送到單片機再返回PC,但是換成字符串數據實現不了。
我大致的思路是,變量定義為字符數組,一個個字符發送,以 '\0' 為終點,與代碼中發送字符串數組 str[] 類似。
但是現象,就是在死循環了。

以下是我的代碼:

#include <reg52.h>

typedef unsigned char uchar;
uchar str[]={"Receive: "};

void UartInit()                           //初始化

{
SCON=0x50;                            //SM1=1,方式1;REN=1,使允許接收;
TMOD=0x20;                            //定時器1,方式2;

PCON=0x80;                             //波特率倍增;
TH1=0xf3;                                //波特率為4800;
TL1=0xf3;
ES=1;                                       //打開串口中斷
EA=1;                                       //打開總中斷
TR1=1;                                     //啟動定時器
}

void main()                                  //主函數
{
UartInit();                                   //初始化
while(1);
}

void Uart() interrupt 4                   //中斷函數
{
uchar receiveData[100],i,j;           //定義字符數組receiveData[]用于存放接收的字符串

while(str!='\0')                         //在返回數據前加“Receive: ”
{
   SBUF=str;                             //從字符數組中取字符
  i++;                                         //自加,發送下一位的字符
  while(!TI);                                 //是否發送成功
  TI=0;                                        //若發送完畢,TI清零,等待下一次發送中斷
}
i=0;                                           //i清零,到下一組數據時進行加“Receive: ”

while(receiveData[j]!='\0')           //將字符數組中的數據逐個字符接收再發送

{
receiveData[j]=SBUF;                  //接收字符
RI=0;                                        //接收完畢,RI清零,等待下一次接收
SBUF=receiveData[j];                 //發送字符
j++;                                         //自加,接收下一位的字符
while(!TI)                                 //是否發送成功
TI=0;                                      //若發送完畢,TI清零,等待下一次發送中斷
}
j=0;                                         //j清零,等待下一組數據進行接收與發送

}

而把 receiveData 定義為uchar型變量,然后把紅色部分代碼替換成以下代碼,能實現字符數據的通信:

receiveData=SBUF;
RI=0;
SBUF=receiveData;
while(!TI);
TI=0;


附件里是兩種實現的情況,字符數據是成功的,然而字符串數據失敗了。
求過路大神出手相助!

錄屏.rar

1.38 MB, 下載次數: 10

回復

使用道具 舉報

ID:324374 發表于 2018-9-19 20:35 | 顯示全部樓層
現在我也面臨著這個問題,不知道樓主解決了沒有?要是解決了能否告訴我要如何改動?
回復

使用道具 舉報

ID:70048 發表于 2018-9-19 21:56 | 顯示全部樓層
字符傳輸 是不是應該是16進制的 你在串口接收到是什么
回復

使用道具 舉報

ID:70048 發表于 2018-9-19 21:57 | 顯示全部樓層
串口通信 之間是不是應該是16進制通信 你在串口助手接收到的是亂碼 還是16進制數
回復

使用道具 舉報

ID:387733 發表于 2018-9-20 08:45 | 顯示全部樓層
字符串變量要設置成全局變量,或者是靜態變量。你現在是局部臨時變量,每次進入中斷才有效,存入的字符中斷返回時不再保留。修改后字符成功的原因就是 receiveData 只在中斷中使用一次,不需要保留。
回復

使用道具 舉報

ID:398663 發表于 2018-9-20 11:11 | 顯示全部樓層
問題在于進行 receiveData[j]!='/0' 這個判斷的時候這個數組沒有存入任何東西,所以直接跳出;又由于RI清零的操作在這個循環里面,所以程序不斷進入中斷,不斷發送receive后又跳出。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄网站涩免费蜜桃网站 | 欧美一区二区三区视频 | 懂色av色香蕉一区二区蜜桃 | 日本视频免费 | 一区二区三区中文字幕 | 中文一区二区 | 欧美国产中文 | 在线免费视频一区 | www在线| 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 成人高清在线视频 | 欧美精品一区在线 | 亚洲精品国产第一综合99久久 | 成人午夜在线观看 | 久久av一区二区三区 | 久草免费电影 | 午夜成人在线视频 | 日本午夜一区 | 欧美成视频 | 色伊人网 | 国产亚洲精品久久久久久牛牛 | 午夜激情影院 | 日韩视频在线免费观看 | 欧美精品网站 | 亚洲vs天堂 | 久草视频2 | 91视频网址 | 欧美精品久久久久 | 国产精品免费大片 | 国产精品一区二区三区在线 | 亚洲一区二区在线播放 | 国产精品久久久一区二区三区 | 毛片站 | 久草中文在线 | 亚洲精品综合 | 国产福利小视频 | 欧美美女被c | 91偷拍精品一区二区三区 | 精品一区二区三区四区 | 狠狠操电影 | 中文字幕亚洲区一区二 |