国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

用VC++.NET實現C167CR單片機與PC的串行通信

發布時間:2010-11-5 19:53    發布者:techshare
關鍵詞: C167CR , 單片機
1 引言

PC與單片機構成的上位機、下位機分布式控制系統是一種常見的工業控制系統,單片機作為下位機可進行現場數據采集和就地控制,并可將采集到的數據或者狀態 信息傳送到上位PC機,以做進一步的分析處理。在實際應用中,上位機與下位機的通信問題是首要解決的問題之一,串行通信以其高效率、可靠、標準統一的優點 成為重要的通信手段,本文即在WINDOWS XP環境下,使用Visual C++.NET中的MSComm控件實現C167CR單片機與PC之間的串行通信,其通信線路通過RS232連接(距離小于15m)。

2 C167CR單片機串行接口簡介

C167CR單片機是德國Infineon公司(前西門子半導體部)開發的一種16位單片機,屬于單片機中的高端產品,片內有16通道10位A/D轉換 器、9個定時器、2個串行接口以及15個報文的CAN接口等功能模塊。C167CR單片機有兩種類型的串行接口:異步/同步串行接口(ASC0)和高速同 步串行接口(SSC),下面介紹異步/同步串行接口(ASC0)。ASC0的接口功能是通過設置幾個專用寄存器來予以確定。

2.1 異步/同步串行接口(ASC0)

16位控制寄存器S0CON的各位定義如圖1所示。

數據接收由接收使能位S0REN來控制,只有當波特率生成器啟動位S0R置為“1”時,才能進行串行數據的發送和接收。

2.2 ASC0波特率寄存器S0BG

寄存器S0BG具有雙重功能,可用作波特率生成器和重載寄存器,它具有13位的重載能力,不同的重載值對應不同的波特率。讀SOBG時,返回的是定時器的內容(15~13位返回為0),寫SOBG時,將更改重載寄存器的值(15~13位無效)。

2.3 緩存寄存器

串行口ASC0有兩個緩存寄存器:接收緩存寄存器S0RBUF和發送緩存寄存器S0TBUF。發送時只要發送器空閑,裝載到S0TBUF中的數據將立即轉送到發送移位寄存器進行發送。將S0R 和S0REN置位,可直接從接收緩存寄存器S0RBUF讀取數據。

2.4 中斷寄存器

串行口ASC0有4個可位尋址的中斷控制寄存器,發送中斷寄存器S0TIC,發送緩存器中斷寄存器S0TBIC,接收中斷寄存器S0RIC,串行口ASC0錯誤中斷寄存器S0EIC。只有當總中斷允許位IEN置“1”時,這些中斷寄存器才能進行控制。

3 Visual C++.NET串行通信控件

MSComm介紹

在WINDOWS環境下,用戶不能直接對PC的串行端口進行操作。Visual C++.NET中,通過使用微軟公司提供的Microsoft Comm Control控件(簡稱MSComm),可以方便地實現PC與外部設備之間的串行通信,編程工作量相對較少。注意Visual C++.NET中控件MSComm的函數與Visual C++6.0中的控件函數有所不同。MSComm有二十多個屬性,其中主要的屬性有:

CommPort:設置和返回通信端口號,CommPort=1即使用串行端口Com1。
PortOpen:打開或關閉通信端口。
InBufferSize:設置接收緩沖區大小。
OutBufferSize:設置發送緩沖區大小。
Input:讀取并刪除緩存區中的數據。
Output:將數據寫入發送緩存區。
Settings:設置波特率、奇偶校驗、數據位和停止位參數,默認值為“9600,N,8,1”,即波特率9600b/s、不進行奇偶校驗、8個數據位、1個停止位。
InputLen:設置每次從緩存區讀取的字節數。
InputMode:設置和返回數據類型,設置為0時讀取的數據為文本形式,設置為1時讀取的數據為二進制數據。PC與單片機通信時,InputMode屬性常設置為二進制數據形式。
Rthreshold:設置OnComm事件發生前,接收緩存區可以接收的字符數。若設置為0,則不產生OnComm事件。

串行通信控件MSComm有二種處理通信的工作方式:事件驅動方式和查詢工作方式。事件驅動方式是指:當串行端口接收或發送完指定數量數據以及發生通信錯 誤等情況時,MSComm控件觸發OnComm事件,作出相應處理。查詢工作方式是指:通過查詢控件的某些屬性值(如InBufferCount屬性)來 作出進一步的處理。以下的程序實例采用事件驅動方式來接收數據。

4 串行通信程序實例

4.1程序功能

本程序是在WINDOWS XP環境下進行數據的發送和接收,PC一次性向C167CR單片機發送12字節(ASCII字符)的數據,單片機接收完數據后,再返回所接收到的所有數據,通過比較PC發送和接收到的數據,驗證串行通信的可靠性。

4.2 PC通信程序設計

4.2.1 實現步驟

第一步:啟動“Visual Studio.NET”,選擇新建項目,在項目類型窗口中選擇“Visual C++項目”,模板窗口選擇“MFC應用程序”。輸入項目名稱,單擊“確定”按鈕。“應用程序類型”選擇“基于對話框”,其他設置皆為默認值,單擊“完成”按鈕。

第二步:選擇“工具”菜單下子菜單“自定義工具箱”中COM組件中的“Microsoft Communication Control,Version6.0”,單擊“確定”按鈕,插入MSComm控件。這與Visual C++6.0的插入方法不同。

第三步:刪去應用程序主對話框中的靜態文本和“確定”按鈕,將“取消”按鈕改為“退出程序”。添加兩個靜態文本“發送數據”和“接受數據”,以及兩個編輯框、一個按鈕“開始通信”和一個MSComm控件。

第四步:添加變量和事件處理程序。由于Visual C++.NET沒有ClassWizard,添加方法與Visual C++6.0不同。右鍵單擊控件,通過子菜單“添加變量”和“添加事件處理程序”實現此步驟。為兩個編輯框分別添加CString型全局變量m_Send 和m_Receive,并為“開始通信”按鈕添加BN_CLICKED事件處理函數OnSendData(),為MSComm控件添加CMSComm型變 量m_Com和OnComm事件處理函數OnCommMscomm()。其中函數OnSendData()用來發送數據,函數OnCommMscomm ()用來接收數據。

窗體界面如圖2所示。



4.2.2 Visual C++.NET程序代碼

在OnInitDialog()函數中進行串行口初始化

BOOL CserialDlg::OnInitDialog()
{//省略自動生成的代碼
// TODO:在此添加額外的初始化代碼
m_Com.put__CommPort(1); //設置串口為COM1
m_Com.put_InBufferSize(1024); //設置輸入緩存區的大小,Bytes
m_Com.put_OutBufferSize(512); //設置發送緩存區的大小,Bytes
m_Com.put_PortOpen(true); // 打開串口
m_Com.put_InputMode(1); //以二進制方式接收數據
m_Com.put_Settings(“9600,n,8,1”); //設置數據傳輸速率等參數
m_Com.put_RThreshold(12); //表示收到12個字符引發一個OnComm事件
m_Com.put_InputLen(0); //一次讀出接收緩存區的字符
m_Com.get_Input(); //清空接收緩存區
return TRUE; // 除非設置了控件的焦點,否則返回 TRUE
}

數據發送程序代碼
void CserialDlg::OnSendData()
{ // TODO: 在此添加控件通知處理程序代碼
if(!m_Com.get_PortOpen()) m_Com.put_PortOpen(true); //若沒打開串口,則打開
UpdateData(true); //將編輯框中的數據傳遞給變量
m_Com.put_Output(COleVariant(m_Send)) ; //將編輯框中的字符串數據轉換
VARIANT類型,并發送出去
}

數據接收程序代碼
void CserialDlg::OnCommMscomm()
{ // TODO: 在此添加消息處理程序代碼
VARIANT vReceive;
COleSafeArray sReceivearray;
long k , i;
BYTE bReceive[1024];
CString str;
m_Receive="";
k=m_Com.get_CommEvent();
switch(k){
case 2: //接收到Rthreshold個數據
vReceive=m_Com.get_Input(); //讀取緩存區內的數據
sReceivearray=vReceive; //將數據由VARIANT型轉換為SafeArray型
for(i=0;i<12;i++)
sReceivearray.GetElement(&i,bReceive+i); //將數據轉換為BTYE型數組
for (i=0;i<5;i++)
{ char a=*(char*)(bReceive+i);
str.Format("%c",a);
m_Receive+=str; } //將數據轉換為CString型,傳遞給變量m_Receive
UpdateData(false); //更新編輯框內容
break;
default: break;
}
}

程序中的put_Output()函數要求VARIANT型數據作為參數,可以調用類ColeVariant的構造函數將多種類型數據(如CString,int等)轉換為VARIANT類型數據。同時數據接收函數get_Input()接收到的數據為VARIANT類型,可通過一系列轉換,轉換為所要求的類型予以顯示。

4.3 C167CR單片機通信程序設計

C167CR單片機串行通信程序采取8位數據異步發送工作方式,接收數據使用中斷方式,接收完12字節數據后再將全部數據發送出去。具體C語言程序如下。

初始化程序:
#include <reg167.h>
void init(void)
{ P3 |= 0x0400; /*設置輸入、輸出引腳*/
DP3 |= 0x0400;
DP3 &= 0xF7FF;
S0BG = 0x40; /*設置波特率為9600*/
S0CON = 0x8011; /*設置串行口狀態:8位數據異步工作方式,1位停止位等*/
S0RIC=0x0044; /*設置中斷允許位、中斷優先級*/
IEN=1; } /*中斷全局使能*/
主程序:
#include <reg167.h>
extern void init(void);
static unsigned int i=0;
static unsigned char c;
unsigned int n;
void serialcom (void) interrupt 0x2B using s_rbank{ /*中斷接收數據*/
if(i==0) c[0]=S0RBUF; else c[ i]=S0RBUF;
if(i==11) { for(n=0;n<12;n++) S0TBUF=c[n]; } /*接收12個字節后發送*/
i=i+1; if(i==12) i=0;
}
void main (void) { init (); while (1) {S0RIR=0;} }
本文地址:http://m.qingdxww.cn/thread-36884-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人亚洲精品 | 在线免费一区 | 日韩高清在线免费看 | 在线精品国产成人综合第一页 | 曰韩一级 | 四虎.coms3u8| 亚洲欧美日韩在线观看播放 | 久久精品国产精品青草app | 五月天第一页 | 丁香婷婷在线视频 | 国产在线99| 偷偷狠狠的日日高清完整视频 | 日本不卡在线观看免费v | 一级特黄特色的免费大片视频 | 麻豆观看 | 国产综合精品日本亚洲777 | 精品99一区二区三区麻豆 | 国产高清一区二区三区四区 | 九九精品在线视频 | 永久黄网站色视频免费网站 | 人人模人人干 | 特级做a爰片毛片免费看一区 | 996久久国产精品线观看导航 | 亚洲欧美日韩在线不卡中文 | 五月开心六月伊人色婷婷 | 欧美成人高清免费大片观看 | 免看一级a毛片一片成人不卡 | 中文字幕精品一区二区三区在线 | 精品精品国产高清a毛片牛牛 | 成人9久久国产精品品 | 69视频在线观看免费 | 欧美激情一二区 | 天堂男人在线 | 在线欧美精品一区二区三区 | 四虎国产精品免费观看 | 天天干天天夜 | a一级日本特黄aaa大片 | 一区二区三区视频观看 | 欧美一区二区不卡视频 | 最近最新视频中文字幕4 | 精品国产品香蕉在线观看75 |