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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6802|回復: 13
收起左側(cè)

請問如何利用單片機+RS485總線進行多機通信?

  [復制鏈接]
回帖獎勵 100 黑幣 回復本帖可獲得 100 黑幣獎勵! 每人限 1 次
ID:541653 發(fā)表于 2019-5-28 17:50 | 顯示全部樓層 |閱讀模式
現(xiàn)在,我已經(jīng)會1對1的數(shù)據(jù)通信了,比如 能把從機1的溫度傳感器的讀數(shù)發(fā)給主機。但是目前的問題是,如何用主機的LCD 把 如圖兩個從機 的溫度讀數(shù)都顯示出來(根據(jù)主機地址輸入顯示 或者 同時顯示)?請各位前輩指點指點。另外,關(guān)于地址選擇,我看書百度,還是都不怎么會,現(xiàn)在想的是能不能兩個從機的溫度,同時顯示在LCD屏幕上?拜托各位前輩了。謝謝!

這是1對1時的485部分單片機代碼:

//////////////////
發(fā)送端(從機):
/////////////////

sbit UART_EN=P3^3;

void UART_init() //串口初始化
{
TMOD=0x20;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
UART_EN=1;    //485一直在寫
}
/***
**函數(shù)名:UART_sent()
**功能:  串口發(fā)送一個字節(jié)
****/
void send(unsigned char str)
{
if(TI==0)
{
  SBUF=str;
  while(TI==0);
  TI=0;
}
}

//////////////////

接收端(主機):

/////////////////

unsigned int sdata; // LCD將要顯示的溫度

sbit UART_EN=P3^3;
void uart_init() //串口初始化
{
TMOD=0x20;  //9600bps
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
ES=1;
EA=1;
UART_EN=0;    //串口一直處于接收狀態(tài)
}
void receive(void) //接收數(shù)據(jù)函數(shù)
{
while(RI==0);
RI=0;
sdata=SBUF;     
}
3 (1).png
1.png
4 (1).png
4 (2).png
5 (1).png
回復

使用道具 舉報

ID:548878 發(fā)表于 2019-6-5 13:13 | 顯示全部樓層
你有完成的程序嗎?我也在做一個多機通行的設(shè)計,怎么實現(xiàn)無線遠程的多機通信?
回復

使用道具 舉報

ID:415123 發(fā)表于 2019-6-5 17:10 | 顯示全部樓層
一對多通信,那么就有地址問題,將從機編號啊,按你的圖,你就將從機編為1號和3號。現(xiàn)在你要改的是通信程序,有兩種方法:主機發(fā)起,從機響應。二、從機定時上傳,主機接收。你來決定用哪一個方法。主機發(fā)起,從機響應的思路是這樣的:你需要定義一個幀結(jié)構(gòu),至少要包含從機地址。比如說,你定義一個兩字節(jié)的幀,第一個字節(jié)表示地址,如1,第二個字節(jié)表示命令。那么從機接收到這兩個字節(jié)后,各自判讀,如果1號機讀到后響應返回溫度值,那么主機就讀到了啊,由于是1號機,2號機其實也讀到了相同的命令,由于地址不對,所以2號機不響應。定時響應的方法,你自己思考一下
回復

使用道具 舉報

ID:93224 發(fā)表于 2019-6-5 17:42 | 顯示全部樓層
我做過這個相關(guān)的仿真,多從機的,實在不行你加我的QQ 1014461948
回復

使用道具 舉報

ID:541653 發(fā)表于 2019-6-9 16:46 | 顯示全部樓層
濤濤濤濤12138 發(fā)表于 2019-6-5 13:13
你有完成的程序嗎?我也在做一個多機通行的設(shè)計,怎么實現(xiàn)無線遠程的多機通信?

沒有欸
回復

使用道具 舉報

ID:541653 發(fā)表于 2019-6-9 16:57 | 顯示全部樓層
honey_teck 發(fā)表于 2019-6-5 17:10
一對多通信,那么就有地址問題,將從機編號啊,按你的圖,你就將從機編為1號和3號。現(xiàn)在你要改的是通信程序 ...

謝謝。這個流程就是地址確認,然后再傳輸數(shù)據(jù),大方向我能理解,但是細節(jié)的代碼部分,漏洞百出。請問一下,中斷方式是第一種方法還是第二種方法?
回復

使用道具 舉報

ID:762124 發(fā)表于 2020-6-4 15:53 | 顯示全部樓層
學習了,謝謝樓主,太棒了
回復

使用道具 舉報

ID:18297 發(fā)表于 2020-6-6 09:40 | 顯示全部樓層
多機通訊需要一個可靠的協(xié)議:
可以參考其他通訊的協(xié)議,自己給他搞個簡單的協(xié)議。
比如你這個可以這樣定義。
主機發(fā)送:命令+地址+校驗。等待對應的地址進行返回。
從機返回:地址+數(shù)據(jù)+校驗。
例如:主機發(fā)送0a(cmd)+01(address)+0b(sum)     //采用簡單的求和,也可以采用其他的檢驗方式)
address的從機發(fā)送:01(address)+88(數(shù)據(jù))+89(sum)。
其他地址的從機不處理。
這個只是最簡單的一種協(xié)議,當然可以拓展成更復雜的。
通過CMD可以對從機決心參數(shù)設(shè)定,校準等待。
僅供參考。
回復

使用道具 舉報

ID:767423 發(fā)表于 2020-6-6 10:45 | 顯示全部樓層
honey_teck 發(fā)表于 2019-6-5 17:10
一對多通信,那么就有地址問題,將從機編號啊,按你的圖,你就將從機編為1號和3號。現(xiàn)在你要改的是通信程序 ...

第二個方法不好實現(xiàn),會出現(xiàn)多個從機同時發(fā)的沖突。
回復

使用道具 舉報

ID:767423 發(fā)表于 2020-6-6 10:53 | 顯示全部樓層
產(chǎn)品上用的部分程序,可以參考,modbus協(xié)議
/********485通訊接收處理*******/
void com_recv(void)
{
        recv_ok=0;
        red_addr_flg=0;
        /*讀寄存器功能碼03H處理*/
        if(recv_data[1]==0x03)        //讀寄存器(功能碼03H)處理
        {
                if((recv_data[0]==0)&&(recv_data[3]==17))
                {
                        red_addr_flg=1;
                }
                if((recv_data[0]!=0)||(red_addr_flg!=0))//地址不為0,或為0讀地址
                {
                        send_data[0]=ADDR_s1;                        //本機地址
                        send_data[1]=0x03;                                //功能碼
                        send_data[2]=recv_data[5]<<1;        //字節(jié)數(shù)
                        send_count=send_data[2];
                        while(send_count!=0)
                        {
                                send_data[send_i+3]=(ram_data[recv_data[3]+send_j]&0xff00)>>8;        //取變量高字節(jié)
                                send_i++;
                                send_data[send_i+3]=ram_data[recv_data[3]+send_j]&0x00ff;                //取變量低字節(jié)
                                send_i++;
                                send_j++;
                                send_count--;
                        }
                        CRC_string(send_data[2]+3);                                                //發(fā)送數(shù)據(jù)串CRC校驗
                        send_data[send_data[2]+3]=(CRC_data&0x00ff);        //CRC校驗碼低字節(jié)
                        send_data[send_data[2]+4]=(CRC_data&0xff00)>>8;        //CRC校驗碼高字節(jié)
                        send_count=send_data[2]+5;
                        p1_6=1;                        //485設(shè)為輸出
                        re_u0c1=0;                //不允許接收
                        tx_count=1;
                        send_count--;
                        u0tb=send_data[0];
                        CRC_data=0xffff;
                        send_i=0;
                        send_j=0;
                        red_addr_flg=0;
                }
                else
                {
                        re_u0c1=1;        //允許串口接收       
                }
        }
        else
        {
                if((status.stu.far_near==1)&&(recv_data[0]!=0))        //為遠程和地址不為0才能設(shè)置
                {                       
        /*功能碼10H處理*/                                       
                        if(recv_data[1]==0x10)        //寫寄存器(功能碼10H)處理
                        {
                        /********10H功能給主機返饋***********/
                                send_data[0]=ADDR_s1;                        //本機地址
                                send_data[1]=0x10;                                //功能碼
                                send_data[2]=recv_data[2];                //變量起始地址高字節(jié)
                                send_data[3]=recv_data[3];                //變量起始地址低字節(jié)
                                send_data[4]=recv_data[4];                //變量個數(shù)高字節(jié)
                                send_data[5]=recv_data[5];                //變量個數(shù)低字節(jié)
                                CRC_string(6);                                        //發(fā)送數(shù)據(jù)串CRC校驗
                                send_data[6]=(CRC_data&0x00ff);        //CRC校驗碼低字節(jié)
                                send_data[7]=(CRC_data&0xff00)>>8;//CRC校驗碼高字節(jié)
                                p1_6=1;                                                        //485設(shè)為輸出
                                re_u0c1=0;                                                //不允許接收
                                tx_count=1;                                                //指向第二個字節(jié)
                                send_count=7;                                        //后續(xù)字節(jié)在發(fā)送中斷中發(fā)
                                u0tb=send_data[0];                                //發(fā)第一個字節(jié)
                                CRC_data=0xffff;
                        /**************************************/       
                        /**********裝載收到的數(shù)據(jù)*************/
                                               
                                load_count=recv_data[5];//變量個數(shù)
                                send_i=7;                                //recv_data[7]開始為數(shù)據(jù)
                                while(load_count!=0)
                                {
                                        ram_data[recv_data[3]+send_j]=recv_data[send_i]<<8;
                                        send_i++;
                                        ram_data[recv_data[3]+send_j]=ram_data[recv_data[3]+send_j]|recv_data[send_i];
                                        send_i++;
                                        send_j++;
                                        load_count--;
                                }
                                ram_data[1]=status.stus;//狀態(tài)不能寫
                                if((ram_data[16]==0x0008)||(ram_data[16]==0x0009)||(ram_data[16]==0x000a))
                                {
                                        ram_data[16]=0x0008;
                                }
                                send_i=0;
                                send_j=0;
                                //time_spke=0;            //聲音延時時間清零
                                //delay_spke_flg=1;   //聲音延時標志
                        }
                }
                re_u0c1=1;        //允許串口接收
        }
}
回復

使用道具 舉報

ID:772431 發(fā)表于 2020-6-8 09:47 | 顯示全部樓層
關(guān)于主從機,他是咋分配的
回復

使用道具 舉報

ID:793949 發(fā)表于 2020-11-11 08:29 來自觸屏版 | 顯示全部樓層
老哥做出來多機通信了嗎?
回復

使用道具 舉報

ID:313791 發(fā)表于 2020-11-12 17:28 | 顯示全部樓層
就是主機發(fā)送的數(shù)據(jù)需要有地址
回復

使用道具 舉報

ID:546729 發(fā)表于 2020-11-17 08:53 | 顯示全部樓層
有人做出來了嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品日韩精品国产精品 | 欧美大片一区二区 | 亚洲一区二区av在线 | 国产精品av久久久久久久久久 | 一区二区三区在线 | 秋霞影院一区二区 | 国产成人综合在线 | 99精品视频一区二区三区 | 国产精品不卡一区 | 精品久久国产 | 久久99深爱久久99精品 | 91免费电影 | 男人天堂国产 | 亚洲综合一区二区三区 | 日日夜夜精品免费视频 | 毛片一区二区三区 | 日韩在线免费视频 | 精品国产黄色片 | 国产一区二区激情视频 | 亚洲一区二区三区四区av | 中文字幕不卡在线观看 | 一区二区三区高清在线观看 | 午夜专区| 偷拍亚洲色图 | 久久久久国产精品 | 一级黄在线观看 | 国产日韩精品一区二区 | 久久综合久色欧美综合狠狠 | 日韩一区二区三区av | 日本粉嫩一区二区三区视频 | 亚洲精品乱码久久久久久按摩 | 国产黑丝av | 久久com | 国产一级一级 | 一区在线观看 | 欧美日韩一区在线观看 | 亚洲欧美日韩一区二区 | 在线一区 | 黄色一级免费观看 | 国产91丝袜在线播放 | 欧美精品v |