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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3122|回復: 22
打印 上一主題 下一主題
收起左側

利用串口接收ASCLL碼作為單片機定時器定時值

[復制鏈接]
跳轉到指定樓層
樓主
ID:322939 發表于 2023-6-13 14:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在串口助手上發送ascll碼,單片機接收后將ascll碼值賦給定時值(如控制字符是大寫A,ASCLL值是65,定時值就是65分鐘或小時),但接收到的數據由于進制不同,需轉換成整數類型,是否要制作通訊協議?有那位大佬指點下?謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123289 發表于 2023-6-13 16:07 | 只看該作者
串口接收到了任何數,都認為二進制BIN碼,其它一蓋不論。
例如:串口現在收到一個字節是:01000001B,你可以將它解釋為任意一個意思,比如:12345,65,ABCD……,天馬行空,你可以任意相像!這取決于接收程序對【01000001B】是如何定義(解釋)的。而不取決于發送方的定義!
所以:你只要在接收程序中,定義好所收到的每一個字節,及其組合,是什么意思就可以了。
例如:收到【00110001B】(31H),你可以認為是49,也可以認為是1,或其它什么的,都可以!
如果你用ASCII碼系統對它做解釋,就是字符“1”;
如果你用二進制數來解釋,它就是49;
當然你也可以認為它是一個亮燈信號。于是你就點亮P1.3接口上的燈。
回復

使用道具 舉報

板凳
ID:789121 發表于 2023-6-13 16:14 | 只看該作者
不是做通信使用,何不直接十六進制理解
回復

使用道具 舉報

地板
ID:94031 發表于 2023-6-13 16:17 | 只看該作者
通信雙方肯定要有協議,否則無法理解對方意思,只能靠猜。
回復

使用道具 舉報

5#
ID:1080935 發表于 2023-6-13 16:36 | 只看該作者
可以使用標準協議,也可以自定義協議,雙方約定好即可,在程序中處理。
回復

使用道具 舉報

6#
ID:879348 發表于 2023-6-13 16:44 | 只看該作者
協議是肯定要的,串口本身就是不可靠的,人體碰一下線就有可能感應出字符
回復

使用道具 舉報

7#
ID:322939 發表于 2023-6-13 16:50 | 只看該作者
yzwzfyz 發表于 2023-6-13 16:07
串口接收到了任何數,都認為二進制BIN碼,其它一蓋不論。
例如:串口現在收到一個字節是:01000001B,你可 ...

ascll碼有128或256個字符,如果接收每個字符都進行判別計算轉換,豈不是很麻煩?
回復

使用道具 舉報

8#
ID:322939 發表于 2023-6-13 16:53 | 只看該作者
建立通訊協議這么多字符需要識別估計也頭大,有沒有簡便的方法?
回復

使用道具 舉報

9#
ID:744809 發表于 2023-6-13 17:07 | 只看該作者
LAW1100 發表于 2023-6-13 16:53
建立通訊協議這么多字符需要識別估計也頭大,有沒有簡便的方法?

比如串口發 Time:265 你可以接收到以后放入數組,如unsigned char ReceiveBuf[15];
定義一個int 類型變量,int time;接收完一幀數據后,調用下面那行代碼,
time = atoi(ReceiveBuf);
這樣time這個變量的值就變成265了
回復

使用道具 舉報

10#
ID:322939 發表于 2023-6-13 17:19 | 只看該作者
123156fsadf 發表于 2023-6-13 17:07
比如串口發 Time:265 你可以接收到以后放入數組,如unsigned char ReceiveBuf[15];
定義一個int 類型變 ...

多謝!我嘗試下。
回復

使用道具 舉報

11#
ID:883242 發表于 2023-6-13 18:45 | 只看該作者
A的ASCII碼是65,你接受以后不需要任何轉換。
回復

使用道具 舉報

12#
ID:123289 發表于 2023-6-14 16:04 | 只看該作者
標準ASCII碼就是個表格,不是256個,而是128個,從0000000-1111111。
你只要做一個,下次再用時,查表就可以了。
回復

使用道具 舉報

13#
ID:883242 發表于 2023-6-14 17:07 | 只看該作者
yzwzfyz 發表于 2023-6-14 16:04
標準ASCII碼就是個表格,不是256個,而是128個,從0000000-1111111。
你只要做一個,下次再用時,查表就可 ...

查什么表???

樓主接收到‘A’,就是65,延遲65秒,需要什么樣的表?你給編一個。
回復

使用道具 舉報

14#
ID:322939 發表于 2023-6-14 19:00 | 只看該作者
Hephaestus 發表于 2023-6-13 18:45
A的ASCII碼是65,你接受以后不需要任何轉換。

試過了,賦給定時值沒反應,計時一直走時下去
回復

使用道具 舉報

15#
ID:322939 發表于 2023-6-14 19:14 | 只看該作者
Hephaestus 發表于 2023-6-14 17:07
查什么表???

樓主接收到‘A’,就是65,延遲65秒,需要什么樣的表?你給編一個。

我試過在串口助手發“a",接收后賦給定時值,計時卻一直走下去,沒作用。
unsigned  char   Recv_dat;
unsigned  char   Time_dat;
bit flag=0;
void T0_ver(void)  interrupt 1//設置1ms
{
  t++;
      if(t>=1000)//1秒
        {
                t=0;
                min++;
               
        }
        if(min>59)
        {
                min=0;
                hour++;
               
        }
        if(hour>=Time_dat)
        {
                hour=0;
               LED5=1;
              TR0=0;
    }
}
/***********串口初始化*************/
void UartInit()
{
  SCON = 0x50;                //8???,?????
        AUXR &= 0xBF;                //?????12T??
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //???????
        TL1 = 0x40;                //???????
        TH1 = 0xFF;                //???????
        ET1 = 0;                //?????%d??
        TR1 = 1;                //???1????
        ES=1;
        EA=1;
}
/************串口中斷*****************/
void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
    if (RI)
    {
        RI = 0;
         flag=1;
       Recv_dat = SBUF;
     
    }
}
void SendByte(char dat)//發送
{   
    SBUF = dat;
          while(!TI);
          TI=0;
}
void main(void)

   Timer_Init();
          UartInit();
while(1)
{

   if(flag==1)
   {
        flag=0;
   Time_dat=Recv_dat;
SendByte(Recv_dat);
}
回復

使用道具 舉報

16#
ID:883242 發表于 2023-6-14 19:29 | 只看該作者
LAW1100 發表于 2023-6-14 19:14
我試過在串口助手發“a",接收后賦給定時值,計時卻一直走下去,沒作用。
unsigned  char   Recv_dat;
...

1)串口助手接收到返回的'a'了么?

2)在T0中斷里面加個IO口翻轉,用示波器看下時間是不是1ms。
回復

使用道具 舉報

17#
ID:94031 發表于 2023-6-14 19:31 | 只看該作者
單片機接收后將值賦給定時器,直接發8位2進制數簡單,方便,雙方都不用轉換,為什么要發ASCII碼呢。
回復

使用道具 舉報

18#
ID:322939 發表于 2023-6-14 20:50 | 只看該作者
Hephaestus 發表于 2023-6-14 19:29
1)串口助手接收到返回的'a'了么?

2)在T0中斷里面加個IO口翻轉,用示波器看下時間是不是1ms。

串口助手可以接收數據,通信沒問題
回復

使用道具 舉報

19#
ID:322939 發表于 2023-6-14 20:54 | 只看該作者
Hephaestus 發表于 2023-6-14 19:29
1)串口助手接收到返回的'a'了么?

2)在T0中斷里面加個IO口翻轉,用示波器看下時間是不是1ms。

定時器設置沒問題,接收到ascll作為定時值,時間到了就停止計時歸零
回復

使用道具 舉報

20#
ID:322939 發表于 2023-6-14 20:59 | 只看該作者
xuyaqi 發表于 2023-6-14 19:31
單片機接收后將值賦給定時器,直接發8位2進制數簡單,方便,雙方都不用轉換,為什么要發ASCII碼呢。

如果以后遇到項目要求是發送ascll碼這種條件那就不會了,客人不懂其它進制,只懂標準編碼表
回復

使用道具 舉報

21#
ID:401564 發表于 2023-6-18 18:13 | 只看該作者
控制不應該是電腦串口發送個類似"SET"的ASCLL碼,然后,單片機識別到"SET"就進行設置這樣的操作嗎?
你發個A,定時器就是65,這好像一點關聯都沒有呀
單片機與串口通訊是要有協議的,串口很容易有干擾的我這有一段是單片機和串口屏之間的通訊協議,協議是我自己定的
以 # 為開始,以3個 0xff為結束
只有符合這個格式的,才判定為有效的命令
在串口中斷中接收,在主函數中查找
數據的聲明和定時器設定你自己搞定,這里的代碼給你一個思路
void Uart1_Isr() interrupt 4                                                                //串口1中斷函數
{
        static u8 RX_Count = 0x00, end_str = 0x00;                                //RX_Count接收數據數量,end_str結束符數量
        u8 temp;//
        if(TI)                                                                                                          //如果是發送中斷觸發,就處理發送中斷
        {                          
                TI = CLR;                                                                                           //發送中斷
                busy1 = CLR;                          
        }
        if(RI)
        {
                RI = CLR;                                                                                        //清除中斷接收標示位
                temp = SBUF;                                                                                //讀取接收到的數據
                Suart_re0.Uart_Re[RX_Count] = temp;                                        //接收到的數據保存到緩沖池中
                if(temp == 0xff)end_str++;                                                         //檢測結束符,接收到0xff就加1
                else if (end_str > 0)end_str--;                                                //否則減1
                if(Suart_re0.Uart_Re[RX_Count] == '#')RX_Count = 0;        //檢測開始接收到"#",所有命令要以'#'開頭,重新開始接收                                                                                                     
                RX_Count++;                                                                                        //
                if(RX_Count >= 30)RX_Count = 0;                                                //防止數組溢出
                if(end_str >= 3)                                                                        //檢測接收到3個0xff結束符
                {                       
                                end_str = 0;
                                RX_Count = 0;       
                                Suart_re1 = Suart_re0;                                                //接收到的數據轉移
                                memset(&Suart_re0, 0, sizeof(Suart_re0));        //原有串口接收數據清除       
                }                                                                                                                           
        }                                                       
}


查找命令會用到strstr函數

        char *p;
        p = strstr(Suart_re1.Uart_Re,"#MODE_CH");//進入充電模式
        if(NULL != p)
        {
        指針返回值不是空的,就說明有這個        #MODE_CH
        }
回復

使用道具 舉報

22#
ID:1034262 發表于 2023-6-18 20:39 | 只看該作者
非常簡單:收到ASCII的65,放在data0、data1,則 (data0-'0')*10+data1-'0'。
回復

使用道具 舉報

23#
ID:883242 發表于 2023-6-20 11:04 | 只看該作者
coody_sz 發表于 2023-6-18 20:39
非常簡單:收到ASCII的65,放在data0、data1,則 (data0-'0')*10+data1-'0'。

不用轉,他收到的是65,不是你以為的字符串“65”。

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: avhd101在线成人播放 | 视频一区二区三区在线观看 | 久草新在线 | 日韩精品在线播放 | 一级做a毛片 | 日韩视频在线免费观看 | 亚洲高清在线观看 | 国产一区久久久 | 精品国产一区二区三区免费 | 亚洲人成在线观看 | 国产成人精品高清久久 | 日韩电影免费在线观看中文字幕 | 免费国产一区二区 | 9久久精品 | 欧美一区二区三区日韩 | 91精品久久久久久久久中文字幕 | 日韩在线一区二区 | 国产伊人精品 | 国产精品成人一区 | 国产成人精品一区二区三区网站观看 | 成人午夜免费福利视频 | 欧美13videosex性极品 | 在线日韩 | 亚洲欧美一区二区在线观看 | 欧美激情视频一区二区三区免费 | 福利视频网站 | 在线观看中文字幕视频 | 中文字幕视频在线看5 | 一区二区三区免费 | 黄视频网站在线 | 欧美久久久网站 | 黄色片大全在线观看 | 精品九九| 天天躁日日躁xxxxaaaa | 久久精品一区二区三区四区 | 中国一级大毛片 | 不卡在线视频 | 国产免费视频在线 | 日本午夜精品 | 中文字幕第一页在线 | 国偷自产av一区二区三区 |