新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)和PC通過(guò)串口通信

        單片機(jī)和PC通過(guò)串口通信

        作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
        通信協(xié)議:每次PC單片機(jī)發(fā)送10個(gè)字節(jié)的數(shù)據(jù),第一個(gè)字節(jié)為0XFA,數(shù)據(jù)開(kāi)始標(biāo)志,后面8個(gè)字節(jié)為任意數(shù)據(jù),最后一個(gè)字節(jié)為前9個(gè)數(shù)據(jù)和的低字節(jié)(高字節(jié)忽略),作為校驗(yàn)和。

        串口設(shè)置:PC串口參數(shù)設(shè)置

        本文引用地址:http://www.104case.com/article/201611/318354.htm

        串口號(hào):COM1(默認(rèn),具體視使用情況而定)

        波特率:9600

        數(shù)據(jù)位:8

        其他默認(rèn)

        測(cè)試方法:可以用串口調(diào)試工具的字符串輸入框輸入:FAFAFA FA FA FA FA FA FACA,選擇HEX發(fā)送,HEX顯示,如果每發(fā)送一次就接收到以上數(shù)據(jù),并在單片機(jī)開(kāi)發(fā)板上正確顯示,則測(cè)試成功。

        //52單片機(jī)串口接收和發(fā)送測(cè)試程序;

        //接收采用中斷方式,發(fā)送采用查詢(xún)方式;

        //52串口通信,T1做串口波特率發(fā)生器;

        #include "Port_Config.h"http://單片機(jī)端口定義

        #include "LCD_Driver.h"http://單片機(jī)LCD顯示

        #include "52_UART.h"http://52串口

        #defineREC_BUF_LEN10//數(shù)據(jù)長(zhǎng)度

        #defineucharunsigned char;

        #defineuintunsigned int;

        ucharrec_buf[REC_BUF_LEN];//接收數(shù)據(jù)緩沖區(qū)

        uintcheck_sum= 0;//接收數(shù)據(jù)校驗(yàn)和

        ucharcount= 0;//當(dāng)前接收數(shù)據(jù)個(gè)數(shù)

        bitrec_flag= 0;//數(shù)據(jù)接收完成標(biāo)志

        bitstart_flag= 0;//接收數(shù)據(jù)起始標(biāo)志

        //==================================================

        //函數(shù):void Init_UART1(void)

        //描述:串口初始化函數(shù),使用T1方式2自重載方式做波特率發(fā)生器,

        //串口使用方式1,8位數(shù)據(jù),可變波特率

        //參數(shù):無(wú)

        //返回:無(wú)

        //作者:geoff日期:2010/11/04

        //修改:日期:

        //版本:V1.1

        //==================================================

        void UART1_Init(void)

        {

        SCON=0x50 ;//方式1,8位可變波特率

        TMOD=0x20 ;//定時(shí)器1,方式2,8位自重載

        PCON=0x00 ;//倍頻禁用

        TH1=0xfa ;//晶振22.1184MHz,波特率9600;

        TL1=0xfa ;//9600

        IE|=0x90 ;//開(kāi)中斷

        TR1=1 ;//啟動(dòng)定時(shí)器

        }

        //==================================================

        //函數(shù):uchar UART1_Receive_Char(void)

        //描述:?jiǎn)纹瑱C(jī)從串口接收一個(gè)字符

        //參數(shù):無(wú)

        //返回:uchar dat//接收到的數(shù)據(jù)

        //作者:geoff日期:2010/11/11

        //修改:日期:

        //版本:V1.1

        //==================================================

        uchar UART1_Receive_Char(void)

        {

        uchar rec_data;

        while(!RI);//等待接收完成

        RI = 0;//接收完成后,清接收完成中斷

        rec_data = SBUF;

        return rec_data;

        }

        //==================================================

        //函數(shù):void UART1_Send_Char(uchar send_data)

        //描述:?jiǎn)纹瑱C(jī)向串口發(fā)送一個(gè)字符

        //參數(shù):uchar send_data//待發(fā)送數(shù)據(jù)

        //返回:無(wú)

        //作者:geoff日期:2010/11/09

        //修改:日期:

        //版本:V1.1

        //==================================================

        void UART1_Send_Char(uchar send_data)

        {

        SBUF = send_data;

        while(!TI);//等待發(fā)送完成

        TI = 0;//發(fā)送完成后,清發(fā)送完成中斷

        }

        //==================================================

        //函數(shù):void UART1_Send_String(uchar *str, uchar len)

        //描述:?jiǎn)纹瑱C(jī)向串口發(fā)送一個(gè)字符串

        //參數(shù):uchar *str//待發(fā)送數(shù)據(jù)

        //uchar len//字符串長(zhǎng)度

        //返回:無(wú)

        //作者:geoff日期:2010/11/10

        //修改:日期:

        //版本:V1.1

        //==================================================

        void UART1_Send_String(uchar *str, uchar len)

        {

        uchar i;

        for(i=0; i

        {

        UART1_Send_Char(*(str+i));

        }

        }

        //==================================================

        //函數(shù):void UART1_Intr(void) interrupt 4

        //描述:串口中斷處理函數(shù),接受串口向單片機(jī)發(fā)來(lái)的數(shù)據(jù)

        //參數(shù):無(wú)

        //返回:無(wú)

        //作者:geoff日期:2010/11/10

        //修改:geoff日期:2010/11/12

        //版本:V2.1注意:第一個(gè)數(shù)據(jù)以0XFA開(kāi)始

        //==================================================

        void UART1_Intr(void) interrupt 4

        {

        uchar rec_temp;

        if(RI)//RI=1,串口接收到數(shù)據(jù)

        {

        RI = 0;//清RI

        rec_temp = SBUF;//接收數(shù)據(jù)

        if((rec_temp==0xfa)&&(count==0))//判斷數(shù)據(jù)是否以O(shè)XFA開(kāi)始

        {

        check_sum = 0;//清校驗(yàn)和

        rec_buf[count] = rec_temp;//把接收到的數(shù)據(jù)存到接收數(shù)組里

        count++;//

        /////測(cè)試用

        LCD_DataWrite(rec_temp);//在LCD上顯示接收數(shù)據(jù)

        check_sum += rec_temp;//計(jì)算校驗(yàn)和

        start_flag = 1;//數(shù)據(jù)以O(shè)XFA開(kāi)始,置開(kāi)始標(biāo)志

        }

        else if(start_flag==1)//判斷數(shù)據(jù)是否開(kāi)始

        {

        rec_buf[count] = rec_temp;//接收數(shù)據(jù)

        count++;//

        /////測(cè)試用

        LCD_DataWrite(rec_temp);//在LCD上顯示接收數(shù)據(jù)

        check_sum += rec_temp;//計(jì)算校驗(yàn)和

        if(count==REC_BUF_LEN)//判斷是否是最后一位數(shù)據(jù),第十位

        {

        count = 0;//從0重新計(jì)數(shù)

        start_flag = 0;//接收數(shù)據(jù)結(jié)束

        check_sum -= rec_temp;//計(jì)算最終校驗(yàn)和

        if((uchar)check_sum==rec_temp)//判斷數(shù)據(jù)接收是否正確,

        {//數(shù)據(jù)最后一位是校驗(yàn)和的后8位

        rec_flag = 1;//置接收完成標(biāo)志

        }

        }

        }

        }

        }

        //==================================================

        //函數(shù):void UART1_Demo(void)

        //描述:串口通信測(cè)試程序,使用T1方式2自重載方式做波特率發(fā)生器,

        //串口使用方式1,8位,可變波特率

        //晶振22.1184MHz,波特率9600;

        //參數(shù):無(wú)

        //返回:無(wú)

        //作者:geoff日期:2010/11/08

        //修改:geoff日期:2010/11/09

        //版本:V1.1

        //==================================================

        void UART1_Demo(void)

        {

        UART1_Init();

        TI = 1;//SBUF置空

        /////測(cè)試用

        LCD_RegWrite(0x80);

        while(1)

        {

        if(rec_flag == 1)//把接收到的數(shù)據(jù),發(fā)送到串口輸出

        {

        rec_flag = 0;//清接收完成標(biāo)志

        UART1_Send_String(rec_buf,REC_BUF_LEN);

        }

        Rst_WDT();//喂狗

        }

        }

        //==================================================

        //函數(shù):void main(void)

        //描述:主函數(shù)

        //參數(shù):無(wú)

        //返回:無(wú)

        //作者:geoff日期:2010/11/08

        //修改:日期:

        //版本:V1.1

        //==================================================

        void main(void)

        {

        LCD_Init();//單片機(jī)LCD初始化

        UART1_Demo();

        }

        本文通過(guò)約定特定通信協(xié)議,實(shí)現(xiàn)單片機(jī)和PC的通信,經(jīng)過(guò)測(cè)試,單片機(jī)收發(fā)正常;出現(xiàn)不能通信時(shí),可以多發(fā)幾個(gè)非0XFA數(shù)據(jù),讓單片機(jī)準(zhǔn)備接收,然后按照約定的格式發(fā)送,并保證每次發(fā)送字符長(zhǎng)度為10個(gè)字節(jié)。



        關(guān)鍵詞: 單片機(jī)PC串口通

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 凤城市| 博野县| 汉阴县| 五河县| 天水市| 遂昌县| 仁布县| 自治县| 专栏| 娱乐| 卢湾区| 柳河县| 太仆寺旗| 晋江市| 临清市| 阿城市| 满洲里市| 辽阳县| 达孜县| 永安市| 闸北区| 和硕县| 镇平县| 绥化市| 永善县| 余江县| 峨山| 聊城市| 金塔县| 台州市| 桃江县| 旅游| 长岭县| 团风县| 巴南区| 通渭县| 麟游县| 车险| 碌曲县| 皋兰县| 理塘县|