新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > CAN總線與PC機串口通信適配器設計與實現

        CAN總線與PC機串口通信適配器設計與實現

        作者: 時間:2009-09-16 來源:網絡 收藏


        以下為VB的發送接收程序:
        Private SuBcmdSendàClick() 使用按鈕控件
        MSComm1. Output= txtSend. Text 將傳送區內的字符串以Output屬性送出
        End Sub
        Private SuBFormàLoad() 窗體的加載事件
        MSComm1. PortOpeN= True  將通訊斷口開啟,通訊參數也可以在開啟前先設定
        MSComm1. RThreshold = Val (txtThreshold. Text) 設定引發接收事件的接收閾值,使程序一執行便開啟通訊端口,將接收的閾值設定為閾值,設定文本框內的值。
        End Sub
        Private SuBMSComm1. OnComm() 通訊控件的OnComm事件。引發接收事件后,將字符收進來并放在接收的文本框中
        SelectCase MSComm1. CommEvent 根據下面每一個case 語句處理每個事件和錯誤事件
          Case comEvCD  CD 線的狀態發生變化
          Case commEvReceive  收到Rthreshold # of
          txtReceive. Text= txtReceive. Text+ Trim(MSComm1. Input)vbCrLf
          Case comEvSend  傳輸緩沖區有Sthreshold 個字符
        End Select
        End Sub
        Private SuBtxtThreshold Change ( ) p閾值設定文本框的Change事件
        MSComm1. Rthreshold = Val (txtThreshold. Text) p當設定的閾值變化時,實時改變通訊對象的屬性
        End Sub

        AT89C51單片機部分
        單片機部分采用C語言編程。C語言編程具有快捷、模塊功能強大、可靠性好、效率高等優點。其中程序初始化包括設定工作方式,定時器、中斷寄存器初始化,各變量的初始化。

        TMOD = 0x20; //定時器1為發生器
        SCON= 0x50; //工作方式1
        TH1= 0xfd ; //設定波特率= 9600bit/s
        TL1= 0xfd ;
        EA= 1; //開中斷
        ES= 1; //允許中斷
        TR1= 1; //啟動定時器T1
        SPECHAR = 0xff ; //設定通訊開始標志

        程序采用中斷接收,查詢發送的方式。串口中斷服務程序流程圖如圖3所示。


        SJA1000控制器部分

        初始化子程序INIT()
        選用2. 0協議構建控制網絡,對SJA1000的初始化主要包括工作方式的設置、驗收代碼寄存器ACR、驗收屏蔽寄存器AMR、波特率的參數設置等。
        void canàinit(void) /*SJA1000的初始化子函數*/
        {control = 1; /*禁止超載、出錯及接收中斷,并置復位請求位使其進入復位狀態*/
         while (control0x01== 0);
         acceptanceàcode = 0x01; /*驗收碼寄存器(存機號1號)*/
         acceptanceàmask= 0xfe ; /*驗收屏蔽碼寄存器*/
         busàtimingà0= 0x03; /*定時寄存器0,同步跳轉寬度
        T0= T,BPS= 125 k*/
         busàtimingà1= 0x18; /*定時寄存器1,T1= 9T,T2=2T,波特率為500kbit/S*/
         outputàcontrol = 0x1A; /*正常輸出方式,TX1引腳懸浮*/
         clockàdivider = 0x40; /*BASICCAN模式,RX1接固定電平*/
         control = 0x1A; /*清復位請求,使其進入工作狀態*/
        }

        發送canàsend()
        發送子程序負責節點報文的發送,由CAN控制器SJA1000獨立完成,將命令寄存器里的發送請求標志置位,即可發送SJA1000發送緩沖區中的報文。
        void canàsend(unsigned char ID ,char*xdata) /*該子函數完成一幀數據的發送*/
        {while ( (status0x10)>> 4 == 1)àNOPà; /*檢查上次請求發送是否完成*/
        while ( (status0x04)>> 2== 0)àNOPà;
        Transmitbuffer1= ID;
        Transmitbuffer2= 0x08;
        Transmitbuffer3= txdata[0] ;
        Transmitbuffer10= txdata[7] ;
        Command = 0x05 ; /*發送請求*/
        while ( (status0x08)>> 3== 0);
        }

        接收子程序canàreceive ()
        接收子程序負責節點報文的接收。SJA1000自動接收發往該節點的數據并將收到的數據放到它的接收緩沖器中。
        SJA1000的報文接收主要有2種方式:中斷接收方式和查詢接收方式。系統采用的是中斷接收方式。
        {unsigned char ir ;
         ir = interrupt; /*獲得SJA1000的中斷狀態*/
         EA= 0;
         If ( (ir0x04)>> 2== 1)error ( ); /*如果是出錯中斷,則調出錯處理函數*/
         If ( (ir0x08)>> 3== 1)overruN( ); /*如果是超載中斷,則調超載處理函數*/
         While ( ( (ir0x04)>> 2== 1)‖( ( (ir0x08)>> 3)== 1){àNOPà;}
          RxID[0] = Receivebuffer1;
          RxID[0] = Receivebuffer2;
        If ( ( (Receivebuffer20x10)>> 4)== 0) /*如果是數據幀,則接收數據*/
          {Rxdata[0] = Receivebuffer3;
          .
          Rxdata[7] = Receivebuffer10;
          Command = 0x04 ; /*SJA1000的接收緩存器被釋放*/
          }
         else if ( ( (Receivebuffer20x10)>> 4)== 1) /*如果是遠程幀,則作相應處理*/
          {  /*相應處理程序*/
          EA= 1;
          }
        }

        結束語

        介紹了一種低成本、高可靠性、快捷的通用型CAN總線與機通過RS-232串口互連方案。該互連方案很好地保證了管理監控層和現場生產測控層之間的連接,方便了上下層信息交流,滿足工廠、變電站等工業場合的應用要求。

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 肃北| 雷波县| 鸡西市| 保亭| 怀远县| 沅陵县| 大渡口区| 肥西县| 定州市| 陇南市| 应城市| 论坛| 绵阳市| 阿鲁科尔沁旗| 莫力| 安徽省| 离岛区| 阜南县| 海阳市| 城市| 莱州市| 尉犁县| 吉林省| 永顺县| 丹巴县| 盖州市| 象山县| 万源市| 宜宾县| 德令哈市| 恭城| 互助| 湟中县| 新竹县| 留坝县| 兴义市| 江北区| 临朐县| 城步| 咸阳市| 临澧县|