找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7406|回復(fù): 28
收起左側(cè)

51單片機(jī)串口怎么接收數(shù)字(不是字符)?

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 25 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:570093 發(fā)表于 2021-5-27 23:40 | 顯示全部樓層 |閱讀模式
我使用一個(gè)上位機(jī)通過串口發(fā)送數(shù)據(jù)給單片機(jī),但是只能發(fā)送單個(gè)字符才能控制單片機(jī)。怎么發(fā)送字符串讓單片機(jī)接收后,把這個(gè)字符串轉(zhuǎn)為數(shù)字?網(wǎng)上找參考程序搞了一個(gè)晚上也弄不出來。void Uart_Isr() interrupt 4
{
                                                                    
        uchar receive_data;

        EA = 0;
          if(RI == 1)
        {
                    RI = 0;
                    receive_data = SBUF;
                if(receive_data=='0')
                {
                        LED=0;        
                }
                else if(receive_data=='1')
                {
                        LED=1;               
                }
                else
                {

                               //處理我發(fā)送的字符串?dāng)?shù)據(jù)
                   }         
        TI=0;   
        EA = 1;                                                                     
}

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-5-28 06:15 | 顯示全部樓層
串口一次只能傳輸1個(gè)字節(jié),傳輸字符串就是連續(xù)傳輸若干字節(jié)。傳輸?shù)氖菙?shù)字或字符與串口功能本身無關(guān),是由通信協(xié)議確定的。一個(gè)最簡單的自定義通信協(xié)議通常由若干字節(jié)組成一幀數(shù)據(jù)。串口中斷函數(shù)只負(fù)責(zé)把收到的一幀數(shù)據(jù)按序保存在緩沖數(shù)組中,只發(fā)送接收完成標(biāo)志,不對數(shù)據(jù)進(jìn)行處理。在主函數(shù)中判斷接收完成后對收到的數(shù)據(jù)進(jìn)行解析處理,執(zhí)行相關(guān)任務(wù)。

  1. void UARTInterrupt() interrupt 4
  2. {
  3.         static unsigned char num=0;        //靜態(tài)變量
  4.         RI=0;                                        //接收中斷請求標(biāo)志位清0
  5.         rec_buf[num]=SBUF;                //保存SBUF接收到的數(shù)據(jù)
  6.         if(rec_buf[0]==0xaa)        //驗(yàn)證數(shù)據(jù)頭,否則被下一個(gè)數(shù)據(jù)覆蓋
  7.         {
  8.                 num++;
  9.                 if(num>=x)                        //x=字符串長度
  10.                 {
  11.                         flag=1;                        //接收完成標(biāo)志置1
  12.                         num=0;
  13.                 }
  14.         }
  15. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:744327 發(fā)表于 2021-5-28 08:29 | 顯示全部樓層
串行通信一次只能傳輸1個(gè)字節(jié),若傳輸多個(gè)字節(jié)或傳輸字符串,需要連續(xù)傳輸若干字節(jié)。
回復(fù)

使用道具 舉報(bào)

ID:97350 發(fā)表于 2021-5-28 08:57 | 顯示全部樓層
#include<reg52.h>

//------------------串口通信的數(shù)據(jù)包協(xié)議-----------------//
/*
    此程序的串口字符串通信使用到下面的一個(gè)自定義協(xié)議,每次通信都是發(fā)送或接收一個(gè)數(shù)據(jù)包,數(shù)據(jù)包格式解釋如下(長度恒為15):
    例如:A01_fmq_01Off___#
    A--------數(shù)據(jù)包的開始標(biāo)記(可以為A到Z,意味著數(shù)據(jù)包可以有26種)
    01-----設(shè)備代號
    fmq_01Off___--------指令(長度恒為10),指令的前4個(gè)人字符是指令頭部,指令的后6個(gè)字符是指令尾部
    #---------數(shù)據(jù)包的結(jié)束標(biāo)記

    例如:A02_SenT010250#
    A--------數(shù)據(jù)包的開始標(biāo)記(可以為A到Z,意味著數(shù)據(jù)包可以有26種)
    02-----設(shè)備代號
    SenT010250--------指令(長度恒為10),指令的前4個(gè)人字符是指令頭部,指令的后6個(gè)字符是指令尾部
    #---------數(shù)據(jù)包的結(jié)束標(biāo)記
*/
char RecvString_buf[16];            //定義數(shù)據(jù)包長度為15個(gè)字符
#define deviceID_1Bit '0'                //用于串口通信時(shí),定義本地設(shè)備ID的第1位
#define deviceID_2Bit '2'                //用于串口通信時(shí),定義本地設(shè)備ID的第2位
#define datapackage_headflag 'A'        //用于串口通信時(shí),定義數(shù)據(jù)包頭部的驗(yàn)證標(biāo)記

char DataPackage_DS18B20[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','S','e','n','T','X','X','X','X','X','X','#'};    //這個(gè)是曾經(jīng)用來控制溫度傳感模塊(DS18B20)的數(shù)據(jù)包
char HeartBeat[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','B','e','a','t','X','X','X','X','X','X','#'};            //我隨便定義了一個(gè)數(shù)據(jù)包用來做"心跳包",比如單片機(jī)系統(tǒng)向電腦每2秒發(fā)送一次該數(shù)據(jù)包,如果電腦沒有按時(shí)接收到,就認(rèn)為單片機(jī)死掉了
//----------------------------------------------//
/*******************************
            串口通信
    MCU:89C52RC        11.0592MHz

//11.0592MHz 0xd0 1200bps
//12MHz 0xcc 1200bps
//11.0592MHz 0xfa 9600bps
//0xf4 11.0592MHz  0xf3 12MHz 4800bps
//均在SMOD=1的情況下(波特率倍增模式)
*******************************/
//串口發(fā)送函數(shù)
void PutString(unsigned char *TXStr)
{
    ES=0;
     while(*TXStr!=0)
    {
        SBUF=*TXStr;
        while(TI==0);
        TI=0;
        TXStr++;
    }
    ES=1;
}
//串口接收函數(shù)
bit ReceiveString()
{
    char * RecStr=RecvString_buf;
    char num=0;
    unsigned char count=0;
    loop:
    *RecStr=SBUF;
    count=0;
    RI=0;
    if(num<14)  //數(shù)據(jù)包長度為15個(gè)字符,嘗試連續(xù)接收15個(gè)字符
    {
        num++;
        RecStr++;
        while(!RI)
        {
            count++;
            if(count>130)return 0;    //接收數(shù)據(jù)等待延遲,等待時(shí)間太久會(huì)導(dǎo)致CPU運(yùn)算閑置,太短會(huì)出現(xiàn)"數(shù)據(jù)包被分割",默認(rèn)count=130
        }
        goto loop;
    }
    return 1;
}
//定時(shí)器1用作波特率發(fā)生器
void Init_USART()
{
    SCON=0x50;  //串口方式1,使能接收
    TMOD|=0x20;  //定時(shí)器1工作方式2(8位自動(dòng)重裝初值)
    TMOD&=~0x10;
    TH1=0xfa;   //9600bps
    TL1=0xfa;
    PCON|=0x80;  //SMOD=1
    TR1=1;
    TI=0;
    RI=0;
    //PS=1;   //提高串口中斷優(yōu)先級
    ES=1;  //開啟串口中斷使能
}
//比較指令頭部
bit CompareCMD_head(char CMD_head[])
{
    unsigned char CharNum;
    for(CharNum=0;CharNum<4;CharNum++)  //指令長度為10個(gè)字符
    {
        if(!(RecvString_buf[CharNum+4]==CMD_head[CharNum]))
        {
            return 0;  //指令頭部匹配失敗
        }
    }
    return 1;        //指令頭部匹配成功
}
//比較指令尾部(start:從哪里開始比較,quality:比較多少個(gè)字符,CMD_tail[]:要比較的字符串)
bit CompareCMD_tail(unsigned char start,unsigned char quality,char CMD_tail[])
{
    unsigned char CharNum;
    for(CharNum=0;CharNum<quality;CharNum++)
    {
        if(!(RecvString_buf[start+CharNum]==CMD_tail[CharNum]))
        {
            return 0;
        }
    }
    return 1;
}
bit Deal_UART_RecData()   //處理串口接收數(shù)據(jù)包函數(shù)(成功處理數(shù)據(jù)包則返回1,否則返回0)
{
    //PutString(RecvString_buf);
    if(RecvString_buf[0]==datapackage_headflag&&buf_string[14]=='#')  //進(jìn)行數(shù)據(jù)包頭尾標(biāo)記驗(yàn)證
    {
        switch(RecvString_buf[1])        //識別發(fā)送者設(shè)備ID的第1位數(shù)字
        {
            case '0':
                switch(RecvString_buf[2])        //識別發(fā)送者設(shè)備ID的第2位數(shù)字
                {
                    case '3':
                        if(CompareCMD_head("Ligt"))    //判斷指令頭部是否為"Ligt"
                        {
                            //下面是指令尾部分析
                            switch(RecvString_buf[8])
                            {
                                case '0':
                                    switch(RecvString_buf[9])
                                    {
                                        case '0':

                                            return 0;
                                        case '1':
                                            if(CompareCMD_tail(10,3,"Off"))   //判斷整個(gè)數(shù)據(jù)包是否為:A03_Ligt01Off_#
                                            {
                                                //如果是則執(zhí)行以下代碼
                                                return 1;
                                            }
                                            if(CompareCMD_tail(10,3,"On_"))    //判斷整個(gè)數(shù)據(jù)包是否為:A03_Ligt01On__#
                                            {
                                                //如果是則執(zhí)行以下代碼
                                                return 1;
                                            }
                                            return 0;
                                        default:
                                            return 0;
                                    }
                                default:
                                    return 0;
                            }
                        }
                        return 0;

                    default:
                        return 0;
                }
            default:
                return 0;
        }
    }
    return 0;
}
/************************
        中斷函數(shù)
************************/
//串口中斷服務(wù)函數(shù)-----------
void USART() interrupt 4   //標(biāo)志位TI和RI需要手動(dòng)復(fù)位,TI和RI置位共用一個(gè)中斷入口
{
    if(ReceiveString())
    {
        //數(shù)據(jù)包長度正確則執(zhí)行以下代碼
        Deal_UART_RecData();
    }
    else
    {
        //數(shù)據(jù)包長度錯(cuò)誤則執(zhí)行以下代碼
        //LED1=~LED1;
    }
    RI=0;  //接收并處理一次數(shù)據(jù)后把接收中斷標(biāo)志清除一下,拒絕響應(yīng)在中斷接收忙的時(shí)候發(fā)來的請求
}
/***************************
        主函數(shù)
***************************/
void main()
{
    EA=1;
    Init_USART();    //初始化串口中斷通信,當(dāng)串口接受完數(shù)據(jù)包后,如果檢測到數(shù)據(jù)包包含有效指令,則自動(dòng)執(zhí)行對應(yīng)的代碼,執(zhí)行完自動(dòng)返回到主函數(shù),為了盡可能不影響主函數(shù)的時(shí)序,串口中斷函數(shù)的執(zhí)行代碼不要過復(fù)雜
    while(1)
    {
    //下面可以放要經(jīng)常運(yùn)行的用戶代碼,使用PutString()函數(shù)來發(fā)送數(shù)據(jù)包,如PutString(HeartBeat);    注:空格的ASCLL碼是:0x20,回車是:0x0D


    }
}
回復(fù)

使用道具 舉報(bào)

ID:277550 發(fā)表于 2021-5-28 09:02 | 顯示全部樓層
先理解數(shù)據(jù)類型,和存儲(chǔ)方法

像int是2個(gè)byte、所以串口通訊要傳輸2個(gè)字節(jié),接收端收到后、再組合起來
回復(fù)

使用道具 舉報(bào)

ID:570093 發(fā)表于 2021-5-28 09:12 | 顯示全部樓層
wulin 發(fā)表于 2021-5-28 06:15
串口一次只能傳輸1個(gè)字節(jié),傳輸字符串就是連續(xù)傳輸若干字節(jié)。傳輸?shù)氖菙?shù)字或字符與串口功能本身無關(guān),是由 ...

那就是串口接收字符串后怎么轉(zhuǎn)為數(shù)字?比如發(fā)送“123”,接收到字符串怎么轉(zhuǎn)為整型數(shù)字123?
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-5-28 15:27 | 顯示全部樓層
96317 發(fā)表于 2021-5-28 09:12
那就是串口接收字符串后怎么轉(zhuǎn)為數(shù)字?比如發(fā)送“123”,接收到字符串怎么轉(zhuǎn)為整型數(shù)字123?

0~9數(shù)字轉(zhuǎn)字符ASCII碼+48(0x30),同理0~9字符轉(zhuǎn)數(shù)字-48(0x30)。
無標(biāo)題.jpg

回復(fù)

使用道具 舉報(bào)

ID:570093 發(fā)表于 2021-5-28 16:01 | 顯示全部樓層
wulin 發(fā)表于 2021-5-28 15:27
0~9數(shù)字轉(zhuǎn)字符ASCII碼+48(0x30),同理0~9字符轉(zhuǎn)數(shù)字-48(0x30)。

這個(gè)我知道,但是發(fā)送一串字符串的時(shí)候就得知道字符串長度,在keil中使用strlen()會(huì)報(bào)錯(cuò)說缺少函數(shù)原型
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-5-28 16:43 | 顯示全部樓層
96317 發(fā)表于 2021-5-28 16:01
這個(gè)我知道,但是發(fā)送一串字符串的時(shí)候就得知道字符串長度,在keil中使用strlen()會(huì)報(bào)錯(cuò)說缺少函數(shù)原型

對于固定字節(jié)長度的字符串,這個(gè)問題很好處理。對于不固定字節(jié)長度的字符串,接收完成時(shí)就已知字節(jié)長度。如果程序無法知道什么時(shí)候接收完成就要開一個(gè)定時(shí)器中斷,每接收一個(gè)字節(jié)定時(shí)器復(fù)位,在達(dá)到設(shè)定時(shí)間沒有收到新的數(shù)據(jù)定時(shí)器中斷發(fā)生,就以此判斷為一幀數(shù)據(jù)接收完成。接收的字節(jié)長度當(dāng)然就知道了。
回復(fù)

使用道具 舉報(bào)

ID:570093 發(fā)表于 2021-6-13 15:54 | 顯示全部樓層
參考了一個(gè)藍(lán)牙發(fā)送的程序,經(jīng)過測試可以用,比如串口發(fā)送“12”可以將其轉(zhuǎn)成整型數(shù)據(jù)12,發(fā)送字符串“12345”可以轉(zhuǎn)成整型數(shù)字12345。但是發(fā)現(xiàn)該程序跳出while()循環(huán)后想要使用發(fā)送過來的數(shù)據(jù)有點(diǎn)麻煩。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include <stdio.h>

  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define ulong  unsigned long

  7. uchar uart_receive_buffer[30];  //從串口接收的數(shù)據(jù)
  8. uint uart_receive_number=0;    //指示串口接收個(gè)數(shù)
  9. uchar receive_length;                   //串口發(fā)送字符串長度
  10. ulong str_to_int=0,int_bit=1;  //字符串轉(zhuǎn)整型數(shù)值、int-bit用來做10的n次方
  11. sbit led=P2^0;

  12. void Delay_1ms(uint i)//1ms延時(shí)
  13. {
  14.   uchar x,j;
  15.   
  16.   for(j=0;j<i;j++)
  17.     for(x=0;x<=148;x++);
  18. }

  19. void Com_Int(void) interrupt 4
  20. {
  21.   EA = 0;
  22.   if(RI == 1)
  23.   {  //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
  24.     RI = 0;
  25.     uart_receive_buffer[uart_receive_number] = SBUF;  //這里減去48是因?yàn)閺碾娔X中發(fā)送過來的數(shù)據(jù)是ASCII碼。
  26.     uart_receive_number++;
  27.   }
  28.   EA = 1;
  29. }

  30. void Com_Init(void) {
  31.   TMOD = 0x20;
  32.   PCON = 0x80;          //波特率加倍
  33.   SCON = 0x50;                                                                  
  34.   TH1=0XF3;                                //計(jì)數(shù)器初始值設(shè)置,注意串口軟件波特率是4800的
  35.   TL1 = 0XF3;
  36.   TR1 = 1;  //啟動(dòng)定時(shí)器1
  37.   ES = 1;  //開串口中斷
  38.   EA = 1;  //開總中斷
  39. }

  40. void PostChar(uchar character)  
  41. {     
  42.             SBUF=character;   //發(fā)送單個(gè)字符
  43.             while(!TI);           // 等待發(fā)送數(shù)據(jù)完成發(fā)送完成TI會(huì)置1
  44.                 TI=0;                     //發(fā)送完成標(biāo)志
  45. }



  46. void Main()
  47. {
  48.   uchar uart_receive_number_old=0;
  49.   uchar i=0,j;
  50.   Com_Init();
  51.   
  52.   while(1)
  53.   {
  54.                                                                                                                 
  55.     if(uart_receive_number_old!=uart_receive_number)
  56.         {
  57.       uart_receive_number_old=uart_receive_number;
  58.     }
  59.    
  60.     //如果單片機(jī)接收來自HC-xx模塊不少于1字節(jié)的串口數(shù)據(jù),一定要加延時(shí)后再判斷是否
  61.     //還有串口數(shù)據(jù)在發(fā)送,這樣才能完整的接收一幀串口數(shù)據(jù)
  62.     Delay_1ms(20);
  63.    
  64.     //一段時(shí)間之后仍然相等,表示上位機(jī)發(fā)來的一串?dāng)?shù)據(jù)結(jié)束
  65.     if(uart_receive_number_old==uart_receive_number)
  66.         {
  67.       if(uart_receive_number)                 
  68.                 break;      
  69.     }
  70.   }
  71.   
  72. if(uart_receive_number)
  73. {
  74.         //led=~led;         //測試
  75.         receive_length=uart_receive_number;

  76.        
  77.         /*if(receive_length==6)         //////測試串口接收位數(shù),串口軟件如果發(fā)送字符串1234,則接收位數(shù)為4
  78.                 led=~led;                                         */

  79.         uart_receive_number=0;
  80.     //串口有數(shù)據(jù)時(shí),該做些什么就做什么吧
  81.         for(i=0;i<receive_length;i++)
  82.         {       
  83.                 PostChar(uart_receive_buffer[i]);//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  84.                 //Delay_1ms(10);                        //延時(shí),作用為提高發(fā)送準(zhǔn)確度,可適當(dāng)調(diào)節(jié)延時(shí)時(shí)間
  85.                
  86.                 int_bit=1;
  87.                 for(j=receive_length-i-1;j>=1;j--)
  88.                         int_bit*=10;       
  89.                 str_to_int += (uart_receive_buffer[i]-'0')*int_bit;       
  90.                
  91.                                        
  92.         }
  93.        
  94.         //if(str_to_int==1000000)                //串口軟件發(fā)送的字符串要跟這里整形數(shù)據(jù)一樣才行,不然發(fā)送一次后悔一直發(fā)送且顯示不正常,暫時(shí)找不出原因
  95.         //        led=~led;
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:937124 發(fā)表于 2021-6-13 17:38 | 顯示全部樓層
傳輸數(shù)字,可以吧數(shù)字拆分成字節(jié),然后按順序傳輸;收到后再恢復(fù)就可以了;
回復(fù)

使用道具 舉報(bào)

ID:937124 發(fā)表于 2021-6-13 17:40 | 顯示全部樓層
一般數(shù)字,會(huì)是16位,32位,或更多位;只要拆封成8位一組,八位八位的傳過去就可以了;因?yàn)?1,收發(fā)寄存器是8位的;
回復(fù)

使用道具 舉報(bào)

ID:261837 發(fā)表于 2021-6-14 13:33 來自觸屏版 | 顯示全部樓層
加幀頭幀尾
回復(fù)

使用道具 舉報(bào)

ID:883031 發(fā)表于 2021-6-15 09:30 | 顯示全部樓層
接收到字符是ASCII碼,數(shù)字的話減掉30就是對應(yīng)的數(shù)字。如:1的ASCII碼是31,減掉30就可以了。注意這里是16進(jìn)制。
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-6-15 11:11 | 顯示全部樓層
96317 發(fā)表于 2021-6-13 15:54
參考了一個(gè)藍(lán)牙發(fā)送的程序,經(jīng)過測試可以用,比如串口發(fā)送“12”可以將其轉(zhuǎn)成整型數(shù)據(jù)12,發(fā)送字符串“1234 ...

有些常識還是要知道啊,比如51的int最大65535,不會(huì)等于你的1百萬的。還有不控制程序,它會(huì)跑飛的,所以都會(huì)讓它進(jìn)死循環(huán),但你讓它跳出了。
回復(fù)

使用道具 舉報(bào)

ID:81196 發(fā)表于 2021-6-15 13:37 | 顯示全部樓層
對于單片機(jī),不管你是傳輸數(shù)字還是字符,其傳輸過程中都是16進(jìn)制表示的.只是在你接收時(shí)解析或發(fā)送時(shí)轉(zhuǎn)義表示成你的內(nèi)容對應(yīng)的十六進(jìn)制數(shù)據(jù)即可
回復(fù)

使用道具 舉報(bào)

ID:811711 發(fā)表于 2021-6-16 11:00 | 顯示全部樓層
首先要建議你多看看計(jì)算機(jī)組成原理,想不出來答案是因?yàn)槿鄙賹τ?jì)算機(jī)最本質(zhì)的理解。
回復(fù)

使用道具 舉報(bào)

ID:811711 發(fā)表于 2021-6-16 11:01 | 顯示全部樓層
其次,你可以自己定義一個(gè)數(shù)據(jù)長度,標(biāo)志位,或者還有別的思路可以解決這個(gè)問題但是還是建議多從計(jì)算機(jī)思維出發(fā),計(jì)算機(jī)啥也不是只會(huì)遵守規(guī)則。
回復(fù)

使用道具 舉報(bào)

ID:811711 發(fā)表于 2021-6-16 11:03 | 顯示全部樓層
數(shù)字和字符都是同一種東西啊,只是你翻譯他的方式不一樣
回復(fù)

使用道具 舉報(bào)

ID:880574 發(fā)表于 2021-11-14 12:01 | 顯示全部樓層
lzl12399 發(fā)表于 2021-5-28 08:57
#include

//------------------串口通信的數(shù)據(jù)包協(xié)議-----------------//

這個(gè)里面的buf_string沒有定義啊
回復(fù)

使用道具 舉報(bào)

ID:941439 發(fā)表于 2021-11-18 20:49 | 顯示全部樓層
我建議你可以把要傳輸?shù)淖址當(dāng)?shù)據(jù)先轉(zhuǎn)換成int型數(shù)據(jù),然后串口發(fā)送出去應(yīng)該就可以了
回復(fù)

使用道具 舉報(bào)

ID:897866 發(fā)表于 2021-11-27 18:43 | 顯示全部樓層
可以參考0~9數(shù)字轉(zhuǎn)字符ASCII碼+48(0x30),同理0~9字符轉(zhuǎn)數(shù)字-48(0x30)。
回復(fù)

使用道具 舉報(bào)

ID:1011216 發(fā)表于 2022-4-9 23:48 來自觸屏版 | 顯示全部樓層
我來說說我的思路,上位機(jī)把整型數(shù)據(jù)當(dāng)做兩個(gè)字節(jié)發(fā)送給單片機(jī),這個(gè)其實(shí)很好實(shí)現(xiàn),在單片機(jī)端用左移八位命令把兩個(gè)字節(jié)分開,然后合并成原整數(shù),通過實(shí)踐,低字節(jié)的數(shù)據(jù)是沒問題的,高字節(jié)怎么都不對。單片機(jī)做數(shù)據(jù)接收太不穩(wěn)定了,不知有啥辦法可以解決這個(gè)數(shù)據(jù)穩(wěn)定的問題
回復(fù)

使用道具 舉報(bào)

ID:625730 發(fā)表于 2022-4-10 11:29 | 顯示全部樓層
xinwenhyan 發(fā)表于 2022-4-9 23:48
我來說說我的思路,上位機(jī)把整型數(shù)據(jù)當(dāng)做兩個(gè)字節(jié)發(fā)送給單片機(jī),這個(gè)其實(shí)很好實(shí)現(xiàn),在單片機(jī)端用左移八位命 ...

上位機(jī)發(fā)的都是8位的字符,比如你發(fā)12,就是發(fā)1和2的字符,單片機(jī)接收了以后,要轉(zhuǎn)換成數(shù)字1和2,然后1乘以10,再加2,得到12,要對照ascii碼表進(jìn)行轉(zhuǎn)換。
回復(fù)

使用道具 舉報(bào)

ID:1017168 發(fā)表于 2022-4-10 11:47 | 顯示全部樓層
在數(shù)據(jù)的末尾減去"\0",將對應(yīng)的字符ascii碼轉(zhuǎn)換成數(shù)字
回復(fù)

使用道具 舉報(bào)

ID:480627 發(fā)表于 2022-4-11 15:35 | 顯示全部樓層
基礎(chǔ)知識不足的弊端啊。。。。什么是二進(jìn)制,什么是十六進(jìn)制,怎么用,平時(shí)單片機(jī)或電腦又是怎么處理數(shù)據(jù)的。。。
回復(fù)

使用道具 舉報(bào)

ID:1009420 發(fā)表于 2022-4-11 16:32 | 顯示全部樓層
16位,32位,或更多位;只要拆封成8位一組,八位八位的傳過去就可以了
回復(fù)

使用道具 舉報(bào)

ID:982617 發(fā)表于 2022-4-13 17:38 | 顯示全部樓層
先把數(shù)據(jù)類型都統(tǒng)一了吧
回復(fù)

使用道具 舉報(bào)

ID:593706 發(fā)表于 2022-4-14 08:43 | 顯示全部樓層
用字節(jié)發(fā)送數(shù)組就可以
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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