久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
新手疑惑 關于C51單片機串口通訊的問題,挺急的在線等
[打印本頁]
作者:
2432606985
時間:
2018-7-31 23:08
標題:
新手疑惑 關于C51單片機串口通訊的問題,挺急的在線等
各位好,本人由于剛剛接觸51單片機,在學習串口通訊中遇到了困難,
{~}]@@8K`T7{0QJAWV]A8{8.png
(47.94 KB, 下載次數: 56)
下載附件
2018-7-31 23:07 上傳
問題是:
由串口助手輸入字符串后,再返回到串口助手上的字符串卻有丟失,丟失的特點為,間隔丟失。
自己的理解:
函數中有比較函數 strstr(),輸入ready后,可以繼續運行(led會滅)
所以rec數組所存的是輸入串口助手中的字符串,但顯示出來卻是“ray”,
應該是send_str()函數有問題,但找不出原因。
請求老手指點!不勝感激!!
由于是新手,如果能夠解釋得清楚一些就更好了!
下面是我的源碼:
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED=P2^0;
u8 rec_ct=0; //記錄接收數據的位數
u8 rec_flag=0; //接收完成標志
u8 rec[10]; //定義一個數組
void delay3s(void) //延時3s,誤差 0us
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=96;b>0;b--)
for(a=60;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay500ms(void) //延時0.5s,誤差 0us
{
unsigned char a,b,c;
for(c=205;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
void UsartInit() //串口初始化
{
SCON=0x50; //串口設置
TMOD=0X20; //T1計數器設置
PCON=0x80; //倍增打開
TH1=0xf3;
TL1=0xf3; //波特率設為4800;
EA=1; //IE設置
ES=1;
TR1=1; //開始計數
}
void send_str() //發送接收到的字符串
{
u8 i;
for(i=0;i<10;i++)
{
SBUF=rec[i];
while(!TI);
TI=0;
i++;
}
}
void Ustar() interrupt 4
{
if(RI==1)
{
RI=0;
rec[rec_ct]=SBUF; //接收串口數據
rec_ct++;
if(rec_ct==10) rec_ct=0; //防止溢出
rec_flag = 1;
}
}
void main()
{
u8 ct;
UsartInit();
start:
ct = 0;
while(1)
{
LED=0; //這個燈作為指示燈
delay3s(); //等待3S
if(rec_flag == 1) //串口接收到數據
{
rec_flag = 0;
send_str(); //發送接收到的字符串
if(strstr(rec, "ready")) //有沒有ready
{
P2 = 0xff; //接收到正確的回復就滅
delay500ms();
break;
}
}
ct ++;
if(ct>=3) goto start; //超過三次重新開始
}
while(1);
}
復制代碼
作者:
多德
時間:
2018-7-31 23:08
你的send_str函數里面已經在for循環里將i++了,然后你TI = 0;后依然i++。檢查一下。
void send_str(void) //發送接收到的字符串
{
u8 i;
for(i=0; i<10; i++)
{
TI = 0;
SBUF=rec[i];
while(!TI);
TI = 0;
}
}
作者:
guangshi_wq
時間:
2018-8-1 01:21
把發送也要寫到中斷里,不能這樣寫
作者:
guangshi_wq
時間:
2018-8-1 01:22
象這樣寫.
void intSIO() interrupt 4 using 2
{
if(TI){
TI=OFF;
if(bSD){
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
時間:
2018-8-1 07:38
那請問將發送寫入中斷后,如何觸發TI=1的條件呢?如果不能觸發TI=1就不能將數據寫入SBUF,而數據沒有寫入SBUF,就無法觸發TI=1的條件,這是個死循環啊。。。。。。 我的理解是這樣的
作者:
fht@51hei
時間:
2018-8-1 09:39
void intSIO() interrupt 4 using 2
{
if(TI)
{
TI=OFF;
if(bSD)
{
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
時間:
2018-8-2 08:21
謝謝各位前輩給我的建議和熱心的解答!但是我的問題是為什么會出現這樣的情況以及解決方法,最佳答案只能給解決了這兩個問題的人哈。大家對我編程的建議我都應用在后續程序中了,使得邏輯更加清晰了,非常感謝!
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美一级片
|
成人日韩
|
中文字幕在线视频精品
|
国产精品一二区
|
国产1区
|
亚洲一区二区视频在线播放
|
不卡一区二区三区四区
|
国产精品久久久久久一区二区三区
|
国产精品中文
|
国产成人99av超碰超爽
|
91九色porny首页最多播放
|
黄色片在线观看网址
|
亚洲视频免费在线
|
亚洲 欧美 日韩在线
|
波多野结衣电影一区
|
一区二区三区在线观看视频
|
日韩一区二区精品
|
国产免费一区二区三区免费视频
|
蜜臀av日日欢夜夜爽一区
|
久久久91精品国产一区二区三区
|
日韩在线大片
|
亚洲成人a v
|
国产精品久久久久久久久久免费看
|
亚洲国产欧美一区二区三区久久
|
国产视频一二三区
|
天天人人精品
|
欧美国产精品一区二区三区
|
日本精品一区二区
|
国产成人精品999在线观看
|
亚洲精品在线91
|
国产精品中文字幕在线观看
|
国产成人精品一区二区三
|
99久久久久国产精品免费
|
天天人人精品
|
免费日韩av
|
亚洲一区二区黄
|
好姑娘影视在线观看高清
|
国产综合久久
|
国产精品中文在线
|
国产乱码精品一区二区三区中文
|
天堂一区二区三区
|