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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8947|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

PC機發(fā)送ABCD給單片機串口1接收到數(shù)據(jù)后由串口2轉(zhuǎn)發(fā)給PC機得到的是ABC。是不是數(shù)據(jù)...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:142973 發(fā)表于 2016-11-13 15:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 幻聽你的溫柔 于 2016-11-13 15:51 編輯

PC機發(fā)送ABCD給單片機串口1接收到數(shù)據(jù)后由串口2轉(zhuǎn)發(fā)給PC機得到的是ABC。是不是數(shù)據(jù)丟失啦,,處理接收的速度比處理數(shù)據(jù)的速度要快才不會出現(xiàn)丟失數(shù)據(jù)的情況(這樣要怎么該程序呢)單片機通過串口一接收數(shù)據(jù),通過定時器中斷來判斷是否接收數(shù)據(jù)完畢,,接收任意字節(jié)的數(shù)據(jù)
/************************************************

* 芯    片     : STC12C5A60S2
* 時    鐘  :11.0592MHz
* 開發(fā)環(huán)境  :Keil uVision V4.00a
* 備    注  :
  */
//文件包含
#include "stc12c5a60s2.h"

unsigned char receive_number[]={0};//接收串口發(fā)送來的數(shù)據(jù)的數(shù)組
unsigned char  rec1_count=0;//串口1接收計數(shù)器
unsigned int  rec1_flag=0; //串口1接收標(biāo)志位

//全局變量
unsigned int p_send=0;
unsigned char ser_receive;  //串口1接收到的數(shù)據(jù)
unsigned char flag1,flag2,temp1,temp2,temp3,k,h,i=0;
//函數(shù)聲明
void Uart2_Init(void);        //串口初始化
void Timer0_Init();      //定時器0初始化
void Uart2_SendChar(unsigned char Udat);
void Uart2_SendString(unsigned char *PBuf,unsigned char a);
void UART_1SendOneByte(unsigned char c);
void UART_1Sendstr(unsigned char *s,unsigned char b);
void Display_Menu(void);

void delayms(unsigned int n)  ///1毫秒
{
   unsigned int i;
  while(n--)
  {
      for ( i=0;i<113;i++ );
  }
}

//定時器0初始化
void Timer0_Init()  //0微秒@11.0592MHz//定時器0 工作方式2
{
AUXR |= 0x80;  //定時器時鐘1T模式
TMOD &= 0xF0;  //設(shè)置定時器模式
TMOD |= 0x02;  //設(shè)置定時器模 TMOD=0x01;
TL0 = 0x00;  //設(shè)置定時初值
TH0 = 0x00;  //設(shè)置定時重載值
TF0 = 0;  //清除TF0標(biāo)志
TR0 = 0;  //定時器0開始計時
ET0=1;
    EA=1;
}
///
/***********************************************
函數(shù)名稱:Uart2_Init
功    能:串口2初始化函數(shù)
入口參數(shù):無
返 回 值:無
備    注:STC12C5A60S2單片機串口2
          只能選擇獨立的波特率發(fā)生器,
    不能使用定時器1做為波特率發(fā)生器
************************************************/
void UartInit(void)  [url=]//115200bps@11.0592MHz[/url]
{
PCON &= 0x7F;  //波特率不倍速
SCON = 0x50;  //8位數(shù)據(jù),可變波特率
AUXR |= 0x40;  //定時器1時鐘為Fosc,即1T
AUXR &= 0xFE;  //串口1選擇定時器1為波特率發(fā)生器
TMOD &= 0x0F;  //清除定時器1模式位
TMOD |= 0x20;  //設(shè)定定時器1為8位自動重裝方式
//TL1 = 0x00;  //設(shè)定定時初值
    //TH1 = 0x00;  //設(shè)定定時器重裝值
TL1 = 0xFD;  //設(shè)定定時初值
TH1 = 0xFD;  //設(shè)定定時器重裝值
ET1 = 0;  //禁止定時器1中斷
TR1 = 1;  //啟動定時器1
REN=1; //允許串口接收
ES=1;  //開串口 中斷
    EA=1;
//// S2BUF
AUXR &= 0xF7;  //波特率不倍速
S2CON = 0x50;  //8位數(shù)據(jù),可變波特率
AUXR |= 0x04;  //獨立波特率發(fā)生器時鐘為Fosc,即1T
BRT = 0xFD;  //設(shè)定獨立波特率發(fā)生器重裝值
AUXR |= 0x10;  //啟動獨立波特率發(fā)生器
IE2=0x01;    //允許串口2中斷
}
//////////////
/****************串行口1發(fā)送****************/
void UART_1SendOneByte(unsigned char c)
{  
    SBUF = c;
    while(!TI);    //若TI=0,在此等待
    TI = 0;  
}
void UART_1Sendstr(unsigned char *s,unsigned char b)
{
  while(b)   // \0表示字符串結(jié)束標(biāo)志,通過檢測字符串末尾
{
  UART_1SendOneByte(*s); //發(fā)送一個字符
  s++;//移動到下一個字符
  b--;
}
}
/////////////
/***********************************************
*函數(shù)名稱:Uart2_SendChar
*功    能:串口2發(fā)送單個字符函數(shù)
*入口參數(shù):Udat:欲發(fā)送的數(shù)據(jù)
*返 回 值:無
*備    注:無
************************************************/
void Uart2_SendChar(unsigned char Udat)
{  ES=0;
S2BUF=Udat;    //將數(shù)據(jù)放入發(fā)送緩沖區(qū)
while(!(S2CON&0x02)); //等待發(fā)送完成
    S2CON=S2CON & 0xfd;     //清零S2TI  
ES=1;
}
/***********************************************
*函數(shù)名稱:Uart2_SendString
*功    能:串口發(fā)送字符串函數(shù)
*入口參數(shù):*PBuf:指向字符串的指針            
*返 回 值:無
*備    注:串口發(fā)送時需禁止全局中斷,防止出錯
************************************************/
void Uart2_SendString(unsigned char *PBuf,unsigned char a)
{
    ES=0;      //關(guān)閉中斷,防止對發(fā)送緩沖區(qū)影響
    while(a)      //未到字符串末尾
    {
      Uart2_SendChar(*PBuf);
    PBuf++;
  a--;
    }
    ES=1;
}
/////////
/************串行口1中斷處理函數(shù)*************/
void UART_1Interrupt(void) interrupt 4
{   
    if(RI==1)
        {
                RI = 0;
                //定時器從0開始計數(shù)
                // TF1=0;
                //開定時器,定時器開始計數(shù)
       TR0=1;
       TH0= 0x00;
                TL0= 0x00;
                if(SBUF!=0xff)//接收數(shù)據(jù)
                {   
      receive_number[rec1_count++]=SBUF;
     
                }
   
        }
}
/*******************串行口2中斷處理函數(shù)*****************************/
void Uart2_ISR(void) interrupt 8
{
   
if(S2CON&0x01)        //發(fā)送和接收共用一個中斷向量,需在程序中判斷
{
  S2CON=S2CON & 0xfe;         //串口接收中斷標(biāo)記需軟件清零
}
}

void Timer0_Rountine(void) interrupt 1 //定時器0 工作方式2
{
   
   rec1_flag=1; ////當(dāng)定時器0溢出中斷時讓rec1_flag=1。
   
}
    //主函數(shù)
void main(void)
{
   
  unsigned char j;
  UartInit();     //串口2初始化
Timer0_Init();      //定時器0初始化
delayms(20);
  while(1)
{

     if(rec1_flag==1 )      //如果是1
            {     
     ES=0;
                 rec1_flag=0;      
                TR0=0;      
      
                 while(p_send<=rec1_count)//判斷發(fā)送指針的值是否小于全局計數(shù)器
                 {        //如果是
                     
                    Uart2_SendChar(receive_number[p_send]);//開始發(fā)送數(shù)據(jù)
                    p_send=p_send+1;   
              
                 }
   
     p_send=0; rec1_count=0;
                 ES=1;
                                   //如果不是
                                    //停止發(fā)送數(shù)據(jù)
             }                       //開串口1中斷

     
  }

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:142973 發(fā)表于 2016-11-13 15:50 | 只看該作者
單片機通過串口一接收數(shù)據(jù),通過定時器中斷來判斷是否接收數(shù)據(jù)完畢,,接收任意字節(jié)的數(shù)據(jù),,,,求大神
回復(fù)

使用道具 舉報

板凳
ID:140371 發(fā)表于 2016-11-13 18:46 來自手機 | 只看該作者
幻聽你的溫柔 發(fā)表于 2016-11-13 15:50
單片機通過串口一接收數(shù)據(jù),通過定時器中斷來判斷是否接收數(shù)據(jù)完畢,,接收任意字節(jié)的數(shù)據(jù),,,,求大神

接收數(shù)據(jù)完成。與定時器有什関係。一般而言是在傳輸數(shù)組中有判斷數(shù)組已結(jié)束的協(xié)定。
回復(fù)

使用道具 舉報

地板
ID:142973 發(fā)表于 2016-11-13 20:11 | 只看該作者
a0931727149 發(fā)表于 2016-11-13 18:46
接收數(shù)據(jù)完成。與定時器有什関係。一般而言是在傳輸數(shù)組中有判斷數(shù)組已結(jié)束的協(xié)定。

但是我接收的是任意數(shù)據(jù),,不確定的數(shù)據(jù)額
回復(fù)

使用道具 舉報

5#
ID:140371 發(fā)表于 2016-11-14 08:09 | 只看該作者
,,接收任意字節(jié)的數(shù)據(jù)(不確定的數(shù)據(jù)額)是否到達這一串?dāng)?shù)據(jù)的最後ㄧ個數(shù)據(jù)... 跟定時器無關(guān) ,,例如串列使用 Time 1 來控制傳輸率  ...傳輸一個數(shù)據(jù)時 .與其他計時器皆無關(guān)...
一串?dāng)?shù)據(jù)(多個數(shù)據(jù))的傳輸是否是到達最後一個數(shù)據(jù)...要靠傳輸協(xié)定(傳輸規(guī)則)來判斷....
又題意:串口1接收到數(shù)據(jù)后由串口2轉(zhuǎn)發(fā).....好像沒有必要知道傳輸?shù)阶钺岬囊粋數(shù)據(jù).....改成串口1接收到數(shù)據(jù)驅(qū)動串口2 發(fā)送....如何?
回復(fù)

使用道具 舉報

6#
ID:142973 發(fā)表于 2016-11-14 10:27 | 只看該作者
a0931727149 發(fā)表于 2016-11-14 08:09
,,接收任意字節(jié)的數(shù)據(jù)(不確定的數(shù)據(jù)額)是否到達這一串?dāng)?shù)據(jù)的最後ㄧ個數(shù)據(jù)... 跟定時器無關(guān) ,,例如串列使 ...

感覺這不是我想要的
,,,,謝謝
回復(fù)

使用道具 舉報

7#
ID:140371 發(fā)表于 2016-11-14 12:13 | 只看該作者
看過你的程式......這樣解讀不知對嗎? ... 當(dāng)串口1未再設(shè)定時間內(nèi)繼續(xù)接收到數(shù)據(jù),則將接收到的數(shù)據(jù)由串口2傳送出去
您在程式中 宣告這個數(shù)組
unsigned char receive_number[]={0};//接收串口發(fā)送來的數(shù)據(jù)的數(shù)組
我覺得該給個長度...
修改試試看
回復(fù)

使用道具 舉報

8#
ID:111634 發(fā)表于 2016-11-14 18:19 | 只看該作者
本帖最后由 zl2168 于 2016-11-14 18:21 編輯

實驗16  單片機與PC機虛擬串行通信


虛擬串行通信說明   


添加虛擬串口   


下載“串口調(diào)試助手”   


電路設(shè)計   


程序設(shè)計   


Keil調(diào)試   


Proteus仿真   


Proteus仿真一下,確認(rèn)有效。
實驗16 與PC機虛擬串行通信.rar (151.41 KB, 下載次數(shù): 19)


以上摘自張志良編著《80C51單片機實用教程》ISBN978-7-04-044532-9,高教社出版。     書中電路和程序設(shè)計有詳細說明,程序語句條條有注解。




回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美国产电影 | 操久久| 欧美一级在线视频 | 精品国产一区二区国模嫣然 | 久久看精品| 一区二区成人 | 亚洲乱码一区二区三区在线观看 | 久草视频2 | 国产高清免费 | 九色在线| 亚洲成人国产精品 | 91精品国产91久久久久久密臀 | 国产精品中文在线 | 久久国产精品久久国产精品 | 欧产日产国产精品视频 | 99成人 | 日韩不卡视频在线观看 | 中文字幕日韩一区 | 亚洲国产欧美在线 | 欧美日韩在线一区二区 | 亚洲一区二区中文字幕 | 日韩第一页 | 久久久91精品国产一区二区精品 | 99久久久无码国产精品 | 极品的亚洲 | 亚洲国产第一页 | 三级免费毛片 | 国产精品99精品久久免费 | 天天插天天操 | 中文在线www| 国产高清不卡 | 久久久久亚洲精品 | 久久婷婷香蕉热狠狠综合 | 欧美精品一区免费 | 二区三区视频 | 亚洲精品视频在线看 | 青青草视频网 | 久久国产精品免费一区二区三区 | 国产清纯白嫩初高生视频在线观看 | a在线视频 | 成人免费小视频 |