欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9071|回復: 7
收起左側

PC機發送ABCD給單片機串口1接收到數據后由串口2轉發給PC機得到的是ABC。是不是數據...

[復制鏈接]
ID:142973 發表于 2016-11-13 15:44 | 顯示全部樓層 |閱讀模式
本帖最后由 幻聽你的溫柔 于 2016-11-13 15:51 編輯

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

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

unsigned char receive_number[]={0};//接收串口發送來的數據的數組
unsigned char  rec1_count=0;//串口1接收計數器
unsigned int  rec1_flag=0; //串口1接收標志位

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

void Timer0_Rountine(void) interrupt 1 //定時器0 工作方式2
{
   
   rec1_flag=1; ////當定時器0溢出中斷時讓rec1_flag=1。
   
}
    //主函數
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)//判斷發送指針的值是否小于全局計數器
                 {        //如果是
                     
                    Uart2_SendChar(receive_number[p_send]);//開始發送數據
                    p_send=p_send+1;   
              
                 }
   
     p_send=0; rec1_count=0;
                 ES=1;
                                   //如果不是
                                    //停止發送數據
             }                       //開串口1中斷

     
  }

}
回復

使用道具 舉報

ID:142973 發表于 2016-11-13 15:50 | 顯示全部樓層
單片機通過串口一接收數據,通過定時器中斷來判斷是否接收數據完畢,,接收任意字節的數據,,,,求大神
回復

使用道具 舉報

ID:140371 發表于 2016-11-13 18:46 來自觸屏版 | 顯示全部樓層
幻聽你的溫柔 發表于 2016-11-13 15:50
單片機通過串口一接收數據,通過定時器中斷來判斷是否接收數據完畢,,接收任意字節的數據,,,,求大神

接收數據完成。與定時器有什関係。一般而言是在傳輸數組中有判斷數組已結束的協定。
回復

使用道具 舉報

ID:142973 發表于 2016-11-13 20:11 | 顯示全部樓層
a0931727149 發表于 2016-11-13 18:46
接收數據完成。與定時器有什関係。一般而言是在傳輸數組中有判斷數組已結束的協定。

但是我接收的是任意數據,,不確定的數據額
回復

使用道具 舉報

ID:140371 發表于 2016-11-14 08:09 | 顯示全部樓層
,,接收任意字節的數據(不確定的數據額)是否到達這一串數據的最後ㄧ個數據... 跟定時器無關 ,,例如串列使用 Time 1 來控制傳輸率  ...傳輸一個數據時 .與其他計時器皆無關...
一串數據(多個數據)的傳輸是否是到達最後一個數據...要靠傳輸協定(傳輸規則)來判斷....
又題意:串口1接收到數據后由串口2轉發.....好像沒有必要知道傳輸到最後的一個數據.....改成串口1接收到數據驅動串口2 發送....如何?
回復

使用道具 舉報

ID:142973 發表于 2016-11-14 10:27 | 顯示全部樓層
a0931727149 發表于 2016-11-14 08:09
,,接收任意字節的數據(不確定的數據額)是否到達這一串數據的最後ㄧ個數據... 跟定時器無關 ,,例如串列使 ...

感覺這不是我想要的
,,,,謝謝
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
ID:140371 發表于 2016-11-14 12:13 | 顯示全部樓層
看過你的程式......這樣解讀不知對嗎? ... 當串口1未再設定時間內繼續接收到數據,則將接收到的數據由串口2傳送出去
您在程式中 宣告這個數組
unsigned char receive_number[]={0};//接收串口發送來的數據的數組
我覺得該給個長度...
修改試試看
回復

使用道具 舉報

ID:111634 發表于 2016-11-14 18:19 | 顯示全部樓層
本帖最后由 zl2168 于 2016-11-14 18:21 編輯

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


虛擬串行通信說明   


添加虛擬串口   


下載“串口調試助手”   


電路設計   


程序設計   


Keil調試   


Proteus仿真   


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


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




回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表