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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

串口計算器程序,電腦向單片機發送順序計算式1*2+3=不知道為什么在串口接收過來亂碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:435640 發表于 2023-6-20 18:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
150黑幣
不知道程序那些地方有問題,不考慮算式優先級,發送順式計算結果返回給串口,但是不知道為什么發送的是亂碼
單片機源程序如下:
#include<reg52.h>
#include<stdio.h>

unsigned char rec_data[32];
unsigned char op,flag, num[2],n=0;
unsigned int i,j,ansi=0,nm;
void delay_ms(int a)
{
        int b,d;
        for(b=a;b>0;b--)
        for(d=0;d<114;d--);
        
}
void chuankou_chushihua()//串口初始化程序
{
   TMOD|=0X20; //設置計數器1為工作方式 2
   SCON=0X50; //設置串行口為工作方式 1
   PCON=0X80; //波特率加倍
   TH1=0XFA; //計數器初始值設置9600baud
   TL1=0XFA;
   ES=1; //打開接收中斷
   EA=1; //打開總中斷
   TR1=1; //打開計數器
}

void uart() interrupt 4 //串口通信中斷函數
{
        
        RI = 0;                        //清除接收中斷標志位
        rec_data[nm]=SBUF;        //存儲接收到的數據
        nm++;        
        flag=1;//設立標識位
        }
void send_data( unsigned char jieguo)
{
        SBUF=jieguo;
        
        while(!TI);
                TI=0;
}
void panduan_jisuan()
{
        if('0'<=rec_data[0]&&rec_data[0]<='9')
    {// 將第一個數字存入num[0]
    num[0] = rec_data[0] - '0';

    // 掃描整個字符數組,從第二個字符開始逐一處理
    for (i = 1; i < nm; i++)
    {
        // 如果是運算符,則將其存儲到op中,并將下一個數字存入num[1]
        if (rec_data[ i] == '+' || rec_data[ i] == '-' || rec_data[ i] == '*' ||rec_data[ i] == '/')
        {
            op = rec_data[ i];
            num[1] = rec_data[i + 1] - '0';
                        
            // 將指針移位至下一個數字
        }
        // 如果是等號,則運算結果即為第一個數字
        else if (rec_data[ i] == '=')
        {
            ansi = num[0];
        }
        // 如果是數字,則根據之前的運算符進行運算
        else if('0'<=rec_data[0]&&rec_data[0]<='9')
        {
            switch (op)
            {
                case '+':
                    num[0] = num[0] + (rec_data[ i] - '0');
                    break;
                case '-':
                    num[0] = num[0] - (rec_data[ i] - '0');
                    break;
                case '*':
                    num[0] = num[0] * (rec_data[ i] - '0');
                    break;
                case '/':
                    num[0] = num[0] / (rec_data[ i] - '0');
                    break;
            }
                         ansi=num[0];
        }
    }
        }
               
}
void send_int_to_serial_port(int c)
        {
    char buffer[16];

    // 使用 sprintf() 函數將整型變量轉換為字符串
    sprintf(buffer, "%d", c);

    // 將字符串逐個發送到串口
    for (i = 0; buffer[ i] != '\0'; i++)
                {
        send_data(buffer[ i]);
    }
        }
void main()
{         

        chuankou_chushihua( );        

        while(1)
        {
                if(flag==1)
                 {
                         panduan_jisuan();
                        
                        send_int_to_serial_port(ansi);
                 }   
    flag=0;                 
        }
}

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

使用道具 舉報

沙發
ID:161164 發表于 2023-6-21 11:24 | 只看該作者
1. flag不可以在每次進中斷都賦值,應改為串口超時后賦值
2. 如果TI不在中斷里清零,要在SBUF=。。。之前關中斷(ES=0;),TI清零后再開
回復

使用道具 舉報

板凳
ID:712097 發表于 2023-6-21 11:37 | 只看該作者
串口通信亂碼通常都是波特率不匹配。看下發送固定內容,每次接收到的亂碼是否相同。如果相同,則基本可以判定是波特率的問題。如果每次收到的都是隨機亂碼,則說明有干擾。
回復

使用道具 舉報

地板
ID:435640 發表于 2023-6-21 11:44 | 只看該作者
lkc8210 發表于 2023-6-21 11:24
1. flag不可以在每次進中斷都賦值,應改為串口超時后賦值
2. 如果TI不在中斷里清零,要在SBUF=。。。之前 ...

能否給改一下,串口第一次用
回復

使用道具 舉報

5#
ID:1066657 發表于 2023-6-21 14:46 | 只看該作者
這個首先要排除波特率誤差問題,其次才是報文等,因為串口通訊比較簡單
回復

使用道具 舉報

6#
ID:435640 發表于 2023-6-21 16:19 | 只看該作者
oldhawk 發表于 2023-6-21 14:46
這個首先要排除波特率誤差問題,其次才是報文等,因為串口通訊比較簡單

現在沒有亂碼只是計算結果為零
回復

使用道具 舉報

7#
ID:1084404 發表于 2023-6-21 17:36 | 只看該作者
系統亂碼:主要是Windows中顯示亂碼,比如菜單、桌面、啟動界面等,造成亂碼的主要原因是注冊表中有關字體部分出現錯誤。
軟件亂碼:主要出現在各種軟件、游戲中,本該顯示中文的地方出現亂碼。這種亂碼的形成比較復雜,可能與系統亂碼的原因相同,也有可能是軟件中用到中文動態鏈接庫被其他原語言鏈接庫覆蓋所造成的。
文件亂碼:一般出現在文檔或者郵件中,這是比較常見的亂碼。出現這種情況往往是因為系統里沒有安裝可以打開該文件的軟件,或者該文件類型的打開方式錯誤。
網頁亂碼:在瀏覽器打開的網頁中出現亂碼,一般來說,這是由于繁體中文大五碼(BIG5)與簡體中文(GB2312)不通用而造成的。
回復

使用道具 舉報

8#
ID:1084901 發表于 2023-6-23 13:36 | 只看該作者
想問一下你的亂碼是怎么解決的
回復

使用道具 舉報

9#
ID:1086796 發表于 2023-7-2 15:56 | 只看該作者
該單片機源程序存在幾個問題:  串口通信中斷函數 uart() 中的 nm 變量沒有初始化,默認為0,會導致接收到的數據存儲位置錯誤。建議在主程序中的 chuankou_chushihua() 函數中將 nm 初始化為0。  panduan_jisuan() 函數中判斷數字的條件有誤,應使用 rec_data[i] 判斷,而不是 rec_data[0]。正確的條件應為 '0' <= rec_data[i] && rec_data[i] <= '9'。  在 panduan_jisuan() 函數中對運算符進行處理后,應將指針移位至下一個字符,以避免重復處理已經處理過的字符。可以在 switch 語句執行后,將 i 自增1,即 i++。  在 send_int_to_serial_port() 函數中,未定義變量 i,建議在函數內部聲明 int i。  在 send_int_to_serial_port() 函數中,需要在發送每個字符之后等待發送完成,即等待 TI 標志位被置位后再繼續發送下一個字符。可以在 SBUF = jieguo; 后添加 while (!TI); 和 TI = 0;。
回復

使用道具 舉報

10#
ID:821429 發表于 2023-7-3 15:12 | 只看該作者
編程可以先畫個流程圖理清楚思路,整個程序思路有點亂,距離得到正確結果有點遠……
回復

使用道具 舉報

11#
ID:1040201 發表于 2023-7-4 09:28 | 只看該作者
void delay_ms(int a)
{
        int b,d;
        for(b=a;b>0;b--)
        for(d=0;d<114;d--);    //d++?  d--沒有意義呀,重新算一下這個  或者用邏輯分析儀測試。
        
}         


進了中斷  不清零,它出不去。      TI = 0;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费国产一区二区 | 国产一区二区毛片 | 国产一区二区三区在线 | 不卡一二区 | 99精品热视频 | 日韩中文字幕2019 | 伊人久久精品一区二区三区 | 91久久国产综合久久 | 欧美一区二区三区 | 亚洲国产精品久久久久久 | 国内成人免费视频 | 日韩欧美日韩在线 | 亚洲成人av在线播放 | 日韩成人免费视频 | 91精品国产91久久久久久 | 日日干夜夜操 | 国产不卡在线观看 | 精品久久久久久 | 亚洲一区二区久久 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 欧美一区二区在线免费观看 | 欧美日韩中文字幕在线播放 | 色888www视频在线观看 | 亚洲视频在线观看 | 精品三级在线观看 | 9999视频| 免费视频一区二区 | 特黄毛片 | 中文字幕av网址 | 亚洲狠狠丁香婷婷综合久久久 | 婷婷在线视频 | 亚洲视频中文字幕 | 久久久久久久久久爱 | 久久九九99 | 日韩精品在线看 | 丁香一区二区 | 亚洲成人精品久久久 | 麻豆av网站 | 亚洲欧美日韩电影 | 一区二区视频在线观看 | 日本免费一区二区三区视频 |