日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mfc如何将一个数组中的字节数据用串口发送出去_RS232串口多机通信

發布時間:2023/12/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mfc如何将一个数组中的字节数据用串口发送出去_RS232串口多机通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基本原理

1、主從多機通信拓撲圖

2、主從多機通信的具體過程

1)使所有的從機的SM2位置1,以便接收主機發來的地址;

2)主機發出一幀地址信息,其中包括8位需要與之通信的從機地址,第9位為1;

3)所有從機接收到地址幀后,各自將所接收到的地址與本機地址比較,對于地址相同的從機,使SM2位清零以接收主機隨后發來的所有信息。對于地址不符合的從機,仍保持SM2=1的狀態,對主機隨后發來的數據不予理睬,直至發送新的地址幀;

4)主機給已被尋址的從機發送控制命令和數據(數據幀的第9位為0);

5)本次通信結束后,從機重置SM2=1,主機可再尋址其它從機。

二、主從模式

首先要設定工作方式3:(主從模式+波特率可變)

SCON位定義:

SCON串口功能寄存器:SM0=1;SM1=1(工作方式3)

注:主機和從機都要為工作方式3。

1、工作方式2 (SM0 SM1 :1 0):

串行口為11位異步通信接口。發送或接收一幀信息包括1位起始位“0”、8位數據位、1位可編程位、1位停止位“1”。

發送數據:發送前,先根據通信協議由軟件設置TB8為“奇偶校驗位”或“數據標識位”,然后將要發送的數據寫入SBUF,即能啟動發送器。

發送過程是由執行任何一條以SBUF為目的寄存器的指令而啟動的,把8位數據裝入SBUF,同時還把TB8裝到發送移位寄存器的第9位上,然后從TXD(P3.1)端口輸出一幀數據。

接收數據:先置REN=1,使串行口為允許接收狀態,同時還要將RI清“0”。然后再根據SM2的狀態和所接收到的RB8的狀態決定此串行口在信息到來后是否置R1=1,并申請中斷,通知CPU接收數據。

當SM2=0時,不管RB8為“0”還是為“1”,都置RI=1,此串行口將接收發送來的信息。當SM2=1時,且RB8=1,表示在多機通信情況下,接收的信息為“地址幀”, 此時置RI=1,串行口將接收發來的地址。

當SM2=1時,且RB8=0,表示在多機通信情況下,接收的信息為“數據幀”, 但不是發給本從機的,此時RI不置為“1”,因而SBUF中接收的數據幀將丟失。

2、工作方式3 (SM0 SM1 :1 1):

為波特率可變的11位異步通信方式,除了波特率有所區別之外,其余方式都與方式2相同。

三、代碼編寫

1、主機.

1)主機的配置發送“地址”時,把TB8設定為1,發送數據時TB8設定為0;

2)主機在配置SCON寄存器時,不需要配置SM2=1;該位主要用于從機接收地址和數據時的區分;

3)其發送幀結構為:

主機的配置,及相關程序為:

//主機為STC12C5A60S2單片機,下面是初始化程序

void UART_init()

{

TMOD =0x20; //定時器1,工作方式2:8位、自動重裝

PCON=0x00;//波特率不加倍$

TH1 = 0xfd; //fd: 9600bps @ 11.0592M

TL1 = 0xfd; //e8: 1200bps @ 11.0592M

SCON|= 0xd8; //串行口工作方式3 主機模式,不需設置SM2=1

TR1 = 1; //啟動定時器1

ES = 1; //開串口中斷

EA = 1; //中斷 總開關

}

//主機端發送程序,使用為串口多機通信

void TXdata(unsignedchar addr,unsigned char *str)

TB8 = 1; //發送地址

SBUF = addr; //把地址發送出去

while(!TI); //判斷是否發送成功(發送成功后TI會置1,需手動清0)

TI = 0;!

TB8 = 0; //發送數據

while(*str != '0') //發送數組

{

SBUF = (*str);

while(!TI);

TI = 0;-

str++;)

}

}

//中斷程序

void UartReceive()interrupt 4 //串口中斷服務函數

{!

ES = 0; //關閉串口中斷

if(RI) //再次判斷,是否接收到數據(接收到數據后,RI會置1,需手動清0)

{

RXData = SBUF;

if(RXData== '*') //判斷是否接收到數據結束標志 $

{

LCD_Write_String(0,0,ReceiveData);

j_yang=0;$

}

else if(RXData=='#')

{

LCD_Write_String(0,1,ReceiveData);

j_yang=0;

}9 B7 W. E8 g) U3 i8 E

else //接收到 結束標志 $

{

ReceiveData[j_yang] = RXData;//沒有接收到結束標志,正常保存數據至數組

j_yang++;

}

}

RI = 0; //清除接收標志位

ES = 1; //重新開啟串口中斷

}

2、從機

1)從機接收時,首先串口初始化時,使SM2=1(接收地址模式,即只能接收到TB8=1的數據,才觸發中斷),主機發送TB8=0的數據,被認為是總線上的主機發送給別機的通信數據,本機丟棄,不產生中斷。

2)接收的地址與本機地址相符后,使SM2=0(接收數據模式,接收數據正常觸發中斷)

從機的配置及相關程序:

//使用的單片機是STC15W4K48S4,該單片機設置獨立定時器為波特率發生器,配置程序,若是不使用此種單片機或者是此種波特率發生器,則除了SM2設置不一樣之外,其他設置與主機是一致的。

void Serial_Init()

{

SCON = 0xf8; //8位數據,可變波特率

AUXR = 0x14; //允許獨立波特率發生器運行,獨立波特發生器每1個時鐘周期記一次數

AUXR |= 0x01; // 獨立波特率發生器作為串口1的波特率發生器,此時定時器1得到釋放,可以作為獨立定時器使用

T2L = (65536 - (FOSC/4/BAUD)); //設置波特率重裝值,其中FOSC為外部晶振的頻率,BAUD為定義的波特率,此處為9600

T2H = (65536 - (FOSC/4/BAUD))>>8;

ES = 1; //使能串口中斷

EA = 1;

//中斷服務程序

void Uart(void)interrupt 4

{

ES = 0; //關閉串口中斷

if(RI) //再次判斷,是否接收到數據(接收到數據后,RI會置1,需手動清0)

{

RXData = SBUF;)

if(RXstart) //判斷是否接收到過本地址;

{

if(RXData != '*') //判斷是否接收到數據結束標志*

{

ReceiveData[j_yang] = RXData; //沒有接收到結束標志,正常保存數據至數組

j_yang++;

}

else //接收到 結束標志*

{

RXstart= 0; //本次接收結束

UartSends(ReceiveData);//將接受的數據反過來發送回去

UartSendChar('#');//默認接收以#結束

SM2 = 1; //重新 配置為:只接收地址模式,下次發送TB8=1才中斷

j_yang = 0;

Uart_flag1=1;

}

}

if(RXData == 2) //判斷是否呼叫本機,地址范圍:000– 254(00 - FE)

{

RXstart = 1; //開始接收數據

SM2 = 0; //配置為:接收數據 模式

}

}

RI = 0; //清除接收標志位'

ES = 1; //重新開啟串口中斷

}

四、注意事項

1)在寫主機程序時,發現如果不寫中斷服務程序,單片機會默認一直發送第一個字節,最后發現應該是串口中斷程序影響的,沒有串口中斷就會一直發送第一個字節,究其原因是數據發送完成后TI會置1,這將導致中斷的產生,一旦沒有中斷服務程序,默認不產生中斷,就一直發不清零。

2)主機程序配置時,不需要配置SM2,這樣從機不管是誰發送數據,主機都可以接收的到,但是是在通信的時候做區分,比如主機給從機1發消息,發送完成后,從機1立馬給主機發送請求的數據,發送完成之后,從機再配置SM2=1,只接收地址的模式。

3)波特率一定要設置的一致,否則無法正常通信。

【如果你喜歡EDA365的文章,記得關注和點贊哦!】

總結

以上是生活随笔為你收集整理的mfc如何将一个数组中的字节数据用串口发送出去_RS232串口多机通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。