找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

我想用單片機(jī)通過(guò)串口實(shí)現(xiàn)輸入一組數(shù)據(jù),然后在12864上的一行顯示出來(lái)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
顯示函數(shù)我寫(xiě)好了,請(qǐng)問(wèn)就是怎么把串口收到的數(shù)據(jù)儲(chǔ)存起來(lái),然后怎么調(diào)用?


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define  uchar  unsigned char
  4. #define  uint  unsigned int
  5. #define Data_SIZE 10                      //   9位數(shù)據(jù)+  /r/n  -  /n =10位
  6. unsigned char i,receiveData;

  7. void UsartConfiguration();

  8. //=========================================================================================

  9. char RevBuf[Data_SIZE];     
  10. char temp[Data_SIZE];     
  11. unsigned char flished_flag=0;
  12. int data_count=0;  
  13. int temp_length;  
  14. int data_flished_count = 0;  //
  15. char data_flished;         //
  16. void UsartConfiguration()
  17. {
  18.          SCON=0X50;
  19.          TMOD=0X20;
  20.          TL1=0XFA;
  21.          TH1=0XFA;
  22.          TR1=1;
  23.          EA=1;
  24.          ES=1;
  25. }
  26. void UART_one_Interrupt_Receive(void) interrupt 4
  27. {  
  28.     uchar temp;
  29.            uchar receive;
  30.   if(RI==1)
  31.     {
  32.         RI=0;
  33.         temp=SBUF;
  34.         if(temp!='\n') //判斷是否收到結(jié)束符
  35.         {
  36.             RevBuf[data_count]=temp;// 否,存進(jìn)revbuf
  37.             data_count++;
  38.         }
  39.         else
  40.         {
  41.             temp_length=data_count;//是,記錄數(shù)據(jù)長(zhǎng)度
  42.             data_count=0;
  43.         }
  44.      
  45.     }

  46. }     
  47. void main(void)
  48. {
  49.      UsartConfiguration();  //串口初始化
  50.    while(1)
  51.     {
  52.           if(Data_SIZE == temp_length)   //判斷數(shù)據(jù)是否符合要求
  53.           {
  54.             for(i=0;i<Data_SIZE;i++)
  55.              {
  56.                 temp[i]=RevBuf[i];             // 將temp【】做為緩沖區(qū)
  57.              }
  58.             flished_flag=1;          //數(shù)據(jù)接受成功標(biāo)注
  59.           }
  60.       if(1==flished_flag)  // 數(shù)據(jù)接受完整成功
  61.         {
  62.                       //
  63.                                 }
  64.                                     }
  65.   while(1);
  66. }
復(fù)制代碼
這是把接受的存到temp【】里了吧,大佬們看看有錯(cuò)誤嗎?
如果沒(méi)錯(cuò)誤怎么取出里面的數(shù)據(jù)啊,我要做顯示用


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

使用道具 舉報(bào)

沙發(fā)
ID:342911 發(fā)表于 2020-5-19 22:52 | 只看該作者
if(串口收到數(shù)據(jù)了)
{
    調(diào)用"屏幕顯示字符串函數(shù)"(傳參"串口收到的數(shù)據(jù)");
}

類似這樣?

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:452950 發(fā)表于 2020-5-20 08:53 | 只看該作者
一位一位接收,放進(jìn)數(shù)組里面,顯示就從數(shù)組里面讀
回復(fù)

使用道具 舉報(bào)

地板
ID:592807 發(fā)表于 2020-5-20 09:03 | 只看該作者
無(wú)論用那種單片機(jī),道理差不多的。都要先申請(qǐng)一個(gè)全局變量的數(shù)組,將串口接收的數(shù)據(jù)放到該數(shù)組中。接受完數(shù)組后,串口會(huì)有特定的寄存器標(biāo)志接收完成,檢測(cè)到接收完成就將數(shù)組的數(shù)據(jù)顯示,然后清空數(shù)組和寄存器的標(biāo)志位。等待下一次接收。
回復(fù)

使用道具 舉報(bào)

5#
ID:755110 發(fā)表于 2020-5-20 09:10 | 只看該作者
muzhi 發(fā)表于 2020-5-19 22:52
if(串口收到數(shù)據(jù)了)
{
    調(diào)用"屏幕顯示字符串函數(shù)"(傳參"串口收到的數(shù)據(jù)");

您好,能稍微講一下傳參嗎,我現(xiàn)在應(yīng)該是可以把接收到的數(shù)據(jù)緩存到一個(gè)數(shù)組,但是我用的12864是不帶字庫(kù)的,所以得知道數(shù)組里面的數(shù)的大小,然后在yi==temp%1000000000/100000000
                               
                                        qianwan=temp%100000000/10000000
                                       
                                        baiwan=temp%10000000/1000000
                                       
                                        shiwan=temp%1000000/100000                               
           wan=temp%100000/10000;                                           

                 qian=temp%10000/1000;

                 bai=temp%1000/100;               

                 shi=temp%100/10;

                 ge=temp%10;這樣取出值的大小最后根據(jù)每個(gè)值得大小來(lái)顯示自定義字符字庫(kù)里的字符,這個(gè)思路對(duì)嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:755110 發(fā)表于 2020-5-20 09:12 | 只看該作者
xxpp2011 發(fā)表于 2020-5-20 08:53
一位一位接收,放進(jìn)數(shù)組里面,顯示就從數(shù)組里面讀

您好,我的12864是不帶字庫(kù)的,所以我定義了一個(gè)字符字庫(kù)【】,里面是從1-9的字模,這樣從數(shù)組里面讀是不是得取位然后再顯示?
回復(fù)

使用道具 舉報(bào)

7#
ID:440553 發(fā)表于 2020-5-20 10:40 | 只看該作者
用個(gè)數(shù)組,把接收到的數(shù)據(jù)存起來(lái)。然后把這個(gè)數(shù)組的內(nèi)容顯示在12864上
回復(fù)

使用道具 舉報(bào)

8#
ID:592807 發(fā)表于 2020-5-20 11:45 | 只看該作者
chengyuyu 發(fā)表于 2020-5-20 09:10
您好,能稍微講一下傳參嗎,我現(xiàn)在應(yīng)該是可以把接收到的數(shù)據(jù)緩存到一個(gè)數(shù)組,但是我用的12864是不帶字庫(kù) ...

串口接收的數(shù)據(jù)是ASCII碼,你接收到的也只能是ASCII碼。ASCII是uint8_t(char)類型的所以最大只有0xff 也就是說(shuō)你從串口接收到的數(shù)字是255,不存在大于256的數(shù)字。
而且你發(fā)送1000.串口傳輸給單片機(jī)或者單片機(jī)傳給串口的就是  0x31  0X30  0X30這三個(gè)數(shù)字,
0X31在ASCII里面就是1   0X30就是0.
如圖所示如果發(fā)送或者接收的數(shù)字大于126,那么串口會(huì)默認(rèn)將這個(gè)大于126的數(shù)字和下一個(gè)數(shù)字組合,湊成一個(gè)漢字,也就是為什么漢字占兩個(gè)字節(jié),而數(shù)字符號(hào)占一個(gè)字節(jié)的原因。

51hei截圖20200520113747.png (44.57 KB, 下載次數(shù): 70)

51hei截圖20200520113747.png
回復(fù)

使用道具 舉報(bào)

9#
ID:755110 發(fā)表于 2020-5-20 15:03 | 只看該作者
黃youhui 發(fā)表于 2020-5-20 11:45
串口接收的數(shù)據(jù)是ASCII碼,你接收到的也只能是ASCII碼。ASCII是uint8_t(char)類型的所以最大只有0xff  ...

您好,謝謝您的解答,我還是有一點(diǎn)不明白,希望您能賜教,就是那個(gè)我該怎么知道temp【】數(shù)組里面的數(shù)是多少,師傅跟我說(shuō)用for循環(huán)就能取出來(lái),您能給我解釋一下嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:755110 發(fā)表于 2020-5-20 15:04 | 只看該作者
xxpp2011 發(fā)表于 2020-5-20 08:53
一位一位接收,放進(jìn)數(shù)組里面,顯示就從數(shù)組里面讀

您好,我發(fā)了一下我的代碼,您看看還要怎么做才能取出temp【】里面的數(shù)?
回復(fù)

使用道具 舉報(bào)

11#
ID:648281 發(fā)表于 2020-5-20 23:26 | 只看該作者
你好!
如果串口傳什么漢字就顯示什么的話,需要帶有字庫(kù)的液晶;
如果不含有字庫(kù)的液晶,只能先制作字庫(kù),顯示漢字?jǐn)?shù)受限。
回復(fù)

使用道具 舉報(bào)

12#
ID:352449 發(fā)表于 2020-5-20 23:46 | 只看該作者
無(wú)論用那種單片機(jī),道理差不多的。都要先申請(qǐng)一個(gè)全局變量的數(shù)組,將串口接收的數(shù)據(jù)放到該數(shù)組中。接受完數(shù)組后,串口會(huì)有特定的寄存器標(biāo)志接收完成,檢測(cè)到接收完成就將數(shù)組的數(shù)據(jù)顯示,然后清空數(shù)組和寄存器的標(biāo)志位。等待下一次接收。
回復(fù)

使用道具 舉報(bào)

13#
ID:755110 發(fā)表于 2020-5-21 08:40 | 只看該作者
763900682 發(fā)表于 2020-5-20 23:46
無(wú)論用那種單片機(jī),道理差不多的。都要先申請(qǐng)一個(gè)全局變量的數(shù)組,將串口接收的數(shù)據(jù)放到該數(shù)組中。接受完數(shù) ...

void UsartConfiguration()
{
         SCON=0X50;//&sup1;¤×÷·&frac12;&Ecirc;&frac12;1
         TMOD=0X20;
         TL1=0XFA;
         TH1=0XFA;
         TR1=1;
         EA=1;
         ES=1;
}
void main(void)
{
while(1)       
  {               
        UsartConfiguration();
         if(rcv_date_ok_flag==1)
              {
                      rcv_date_ok_flag=0;
                      for(i=0;i<rcv_len;i++)
                      shu_disp_1(2,i,rcv_buf);
              }
  }
}                               
void UART_one_Interrupt_Receive(void) interrupt 4
{         
        unsigned char i;   
uchar temp =SBUF;

if(temp==0x02)
{
        rcv_date_ok_flag=0;
        rcv_len=0;
}
else if(temp==0x03)
{
        rcv_date_ok_flag=1;
}
else
{
        rcv_buf[rcv_len++]=temp;
}
}
您能給看看哪不對(duì)嗎
回復(fù)

使用道具 舉報(bào)

14#
ID:592807 發(fā)表于 2020-5-21 08:56 | 只看該作者
chengyuyu 發(fā)表于 2020-5-20 15:03
您好,謝謝您的解答,我還是有一點(diǎn)不明白,希望您能賜教,就是那個(gè)我該怎么知道temp【】數(shù)組里面的數(shù)是多 ...

1 如果你的串口通訊正常的并且temp數(shù)組足夠大的話,那么你接受道所有的數(shù)劇都會(huì)在temp數(shù)組里面。2 讀取數(shù)據(jù)問(wèn)題著個(gè)全是可以不用解釋,數(shù)據(jù)就在數(shù)組里面,你復(fù)制出來(lái)也行,直接調(diào)用也行
3 著個(gè)應(yīng)該才是你要問(wèn)的問(wèn)題,比如串口發(fā)送:“1 2 3  a b c 你好嗎”怎么在顯示屏顯示,做法如下
定義結(jié)構(gòu)體:
typedef struct
{
u8 sign_name;//數(shù)字和字符的ASCII碼
u8 sign_data[16];//顯示數(shù)據(jù)局,字庫(kù)
}sign_number;

typedef struct
{
u8 font[2];//漢字的ASCII碼,
u8 chinese1[16];//漢字上半部分字庫(kù)
u8 chinese2[16];//下半部分字庫(kù)
}chinese;

1 的ASCII碼是0X31,用for循環(huán)檢索到temp里面有0x31就往顯示屏輸送1的顯示數(shù)據(jù)


你要自己建造一個(gè)字庫(kù),:
回復(fù)

使用道具 舉報(bào)

15#
ID:755110 發(fā)表于 2020-5-21 15:15 | 只看該作者
黃youhui 發(fā)表于 2020-5-21 08:56
1 如果你的串口通訊正常的并且temp數(shù)組足夠大的話,那么你接受道所有的數(shù)劇都會(huì)在temp數(shù)組里面。2 讀取數(shù) ...



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表