第一篇:RS232串口通信原理簡介
串口是計算機上一種非常通用設備通信的協議。大多數計算機包含兩個基于RS232的串口。串口同時也是儀器儀表設備通用的通信協議;很多GPIB兼容的設備也帶有RS-232口。同時,串口通信協議也可以用于獲取遠程采集設備的數據。
串口通信的概念非常簡單,串口按位(bit)發送和接收字節。盡管比按字節(byte)的并行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。它很簡單并且能夠實現遠距離通信。比如IEEE488定義并行通行狀態時,規定設備線總常不得超過20米,并且任意兩個設備間的長度不得超過2米;而對于串口而言,長度可達1200米。
典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發送數據同時在另一根線上接收數據。其他線用于握手,但是不是必須的。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對于兩個進行通行的端口,這些參數必須匹配:
波特率:這是一個衡量通信速度的參數。它表示每秒鐘傳送的bit的個數。例如300波特表示每秒鐘發送300個bit。當我們提到時鐘周期時,我們就是指波特率例如如果協議需要4800波特率,那么時鐘是4800Hz。這意味著串口通信在數據線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。
數據位:這是衡量通信中實際數據位的參數。當計算機發送一個信息包,實際的數據不會是8位的,標準的值是5、7和8位。如何設置取決于你想傳送的信息。比如,標準的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數據使用簡單的文本(標準 ASCII碼),那么每個數據包使用7位數據。每個包是指一個字節,包括開始/停止位,數據位和奇偶校驗位。由于實際數據位取決于通信協議的選取,術語“包”指任何通信的情況。
停止位:用于表示單個包的最后一位。典型的值為1,1.5和2位。由于數據是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,并且提供計算機校正時鐘同步的機會。適用于停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率同時也越慢。
奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對于偶和奇校驗的情況,串口會設置校驗位(數據位后面的一位),用一個值確保傳輸的數據有偶個或者奇個邏輯高位。例如,如果數據是011,那么對于偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,校驗位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數據,簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數據是否不同步。
第二篇:串口通信實驗報告范文
華南農業大學
實驗報告
----------目錄----------
1、實驗任務和目的..............................................................................................................2、實驗準備..........................................................................................................................3、實驗步驟................................................................................................................................4、實驗分析與總結....................................................................................................................(1)、分析.............................................................................................................................(2)、總結.............................................................................................................................1、實驗任務和目的
了解串行通信的背景知識后,通過三線制制作一條串口通信線(PC-PC),并編程實現兩臺PC間通過RS-232C通信。要求兩臺PC機能進行實時的字符通信,并了解工業自動化控制中的基本通信方式。
2、實驗準備
1、檢查PC是否具有串行通信接口,并按其針腳類準備一條串口通信線纜。
2、串口包的安裝,下載javacomm20-win32.zip并解壓,將win32com.dll復制到
3、實驗步驟
1、將實驗所需RS-232纜線準備好,并將JAVA串口包復制到相應地目錄下。
2、查找有關串口通信的書籍以及在網上查找相應地串口通信代碼。
3、用JAVA編程軟件JCreator編寫代碼。
4、實驗分析與總結
(1)、分析
(I)、對串口讀寫之前需要先打開一個串口并檢測串口是否被占用: public void open(){//打開串口以及輸入輸出流
recieve=false;
try
{serialPort=(SerialPort)portId.open(“Serial Communication”, 2000);}
catch(PortInUseException e){System.out.println(“端口正被占用!”);}
try
{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}
catch(UnsupportedCommOperationException e){System.out.println(“不支持通信”);}
try
{
outputStream=serialPort.getOutputStream();
inputStream=serialPort.getInputStream();
1-完整運行程序如圖所示:
圖1
(2)、總結
通過本次串口實驗,我對串口通信的知識了解的更透徹,這是在剛開始對串口通信知識不了解的情況下就編程而造成許多錯誤之后才得到的結果。在網上查找資料的時候也接觸到了不少其他的編程語言例如VB,delphi,C#等,這也讓我對這些從沒有學過的語言有所了解,我想這些知識對以后的實驗工作都有幫助。
3--
第三篇:單片機串口通信方式總結
IIC總線通信協議————數據傳輸高位在前p233 1,起始和停止條件
開始信號:SCL為高電平,SDA由高電平向低電平跳變,開始傳送數據。void start()// 開始位 { SDA = 1;
//SDA初始化為高電平“1”
SCL = 1;
//開始數據傳送時,要求SCL為高電平“1”
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SDA = 0;
//SDA的下降沿被認為是開始信號
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SCL = 0;
//SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)} 結束信號:SCL為高電平,SDA由低電平向高電平跳變,結束傳送數據。void stop()// 停止位 { SDA = 0;
//SDA初始化為低電平“0”
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SCL = 1;
//結束數據傳送時,要求SCL為高電平“1”
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SDA = 1;
//SDA的上升沿被認為是結束信號 }
2,數據格式(數據輸入)
在IIC總線開始信號后,送出的第一個字節數據是用來選擇器件地址和數據方向的,其格式為
從器件收到地址型號后與自己的地址比較,一致則此器件就是主器件要找的器件,并返回ACK(不管是寫數據還是地址都會返回)。IIC傳送數據時SCL為低電平時SDA可改變高低電平,SCL轉跳為高時數據輸入(此時SDA不能跳變),發送數據:bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;
//儲存應答位
for(i = 0;i < 8;i++)// 循環移入8個位
{
SDA =(bit)(y&0x80);
//通過按位“與”運算將最高位數據送到S
//因為傳送時高位在前,低位在后
_nop_();
//等待一個機器周期
SCL = 1;
//在SCL的上升沿將數據寫入AT24Cxx
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SCL = 0;
//將SCL重新置為低電平,以在SCL線形成傳送數據所需的8個脈沖
y <<= 1;
//將y中的各二進位向左移一位
} SDA = 1;
// 發送設備(主機)應在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,//以讓SDA線轉由接收設備(AT24Cxx)控制
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
SCL = 1;
//根據上述規定,SCL應為高電平
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
_nop_();
//等待一個機器周期
ack_bit = SDA;//接受設備(AT24Cxx)向SDA送低電平,表示已經接收到一個字節
//若送高電平,表示沒有接收到,傳送異常
SCL = 0;
//SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
return ack_bit;
// 返回AT24Cxx應答位 } 讀數據:unsigned char ReadData()// 從AT24Cxx移入數據到MCU { unsigned char i;unsigned char x;
//儲存從AT24Cxx中讀出的數據
for(i = 0;i < 8;i++){
SCL = 1;
//SCL置為高電平
x<<=1;
//將x中的各二進位向左移一位
x|=(unsigned char)SDA;//將SDA上的數據通過按位“或“運算存入x中
SCL = 0;
//在SCL的下降沿讀出數據
} return(x);
//將讀取的數據返回 } 發送數據步驟:
oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr處寫入數據WriteCurrent { start();
//開始數據傳遞
WriteCurrent(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
WriteCurrent(add);
//寫入指定地址
WriteCurrent(dat);
//向當前地址(上面指定的地址)寫入數據
stop();
//停止數據傳遞
delaynms(4);
//1個字節的寫入周期為1ms, 最好延時1ms以上 } 讀數據步驟:
/*************************************************** 函數功能:從AT24Cxx中的當前地址讀取數據 出口參數:x(儲存讀出的數據)
***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();
//開始數據傳遞
WriteCurrent(OP_READ);
//選擇要操作的AT24Cxx芯片,并告知要讀其數據
x=ReadData();
//將讀取的數據存入x stop();
//停止數據傳遞
return x;
//返回讀取的數據 } /*************************************************** 函數功能:從AT24Cxx中的指定地址讀取數據 入口參數:set_add 出口參數:x
***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址讀取 { start();
//開始數據傳遞
WriteCurrent(OP_WRITE);
//選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
WriteCurrent(set_add);
//寫入指定地址
return(ReadCurrent());
//從指定地址讀出數據并返回 }
單總線協議————數據傳輸低位在前——p237 1,初始化單總線器件
初始化時序程序:
函數功能:將DS18B20傳感器初始化,讀取應答信號 出口參數:flag
***************************************************/ bit Init_DS18B20(void){ bit flag;
//儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
DQ = 1;
//先將數據線拉高
for(time=0;time<2;time++)//略微延時約6微秒
;DQ = 0;
//再將數據線從高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延時約600微秒
;
//以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ = 1;
//釋放數據線(將數據線拉高)
for(time=0;time<10;time++)
;//延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
flag=DQ;
//讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
for(time=0;time<200;time++)//延時足夠長時間,等待存在脈沖輸出完畢
;return(flag);
//返回檢測成功標志 }
單總線通信協議中存在兩種寫時隙:寫0寫1。主機采用寫1時隙向從機寫入1,而寫0時隙向從機寫入0。所有寫時隙至少要60us,且在兩次獨立的寫時隙之間至少要1us的恢復時間。兩種寫時隙均起始于主機拉低數據總線。產生1時隙的方式:主機拉低總線后,接著必須在15us之內釋放總線,由上拉電阻將總線拉至高電平;產生寫0時隙的方式為在主機拉低后,只需要在整個時隙間保持低電平即可(至少60us)。在寫時隙開始后15~60us期間,單總線器件采樣總電平狀態。如果在此期間采樣值為高電平,則邏輯1被寫入器件;如果為0,寫入邏輯0。
下圖為寫時隙(包括1和0)時序
上圖中黑色實線代表系統主機拉低總線,黑色虛線代表上拉電阻將總線拉高。下面是代碼:
WriteOneChar(unsigned char dat){ unsigned char i=0;for(i=0;i<8;i++)
{
DQ =1;
// 先將數據線拉高
_nop_();
//等待一個機器周期
DQ=0;
//將數據線從高拉低時即啟動寫時序
DQ=dat&0x01;
//利用與運算取出要寫的某位二進制數據,//并將其送到數據線上等待DS18B20采樣
for(time=0;time<10;time++)
;//延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣
DQ=1;
//釋放數據線
for(time=0;time<1;time++)
;//延時3us,兩個寫時序間至少需要1us的恢復期
dat>>=1;
//將dat中的各二進制位數據右移1位
}
for(time=0;time<4;time++)
;//稍作延時,給硬件一點反應時間 }
對于讀時隙,單總線器件僅在主機發出讀時隙時,才向主機傳輸數據。所有主機發出讀數據命令后,必須馬上產生讀時隙,以便從機能夠傳輸數據。所有讀時隙至少需要60us,且在兩次獨立的讀時隙之間至少需要1us恢復時間。每個讀時隙都由主機發起,至少拉低總線1us。在主機發出讀時隙后,單總線器件才開始在總線上發送1或0。若從機發送1,則保持總線為高電平;若發出0,則拉低總線。
當發送0時,從機在讀時隙結束后釋放總線,由上拉電阻將總線拉回至空閑高電平狀態。從機發出的數據在起始時隙之后,保持有效時間15us,因此主機在讀時隙期間必須釋放總線,并且在時隙起始后的15us之內采樣總線狀態。
下圖給出讀時隙(包括0或1)時序
圖中黑色實線代表系統主機拉低總線,灰色實線代表總局拉低總線,而黑色的虛線則代表上拉電阻總線拉高。代碼為:
unsigned char ReadOneChar(void){
unsigned char i=0;
unsigned char dat;//儲存讀出的一個字節數據
for(i=0;i<8;i++)
{
DQ =1;
// 先將數據線拉高
_nop_();
//等待一個機器周期
DQ = 0;
//單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_();
//等待一個機器周期
DQ = 1;
//將數據線“人為”拉高,為單片機檢測DS18B20的輸出電平作準備
for(time=0;time<2;time++)
;
//延時約6us,使主機在15us內采樣
if(DQ==1)
dat|=0x80;//如果讀到的數據是1,則將1存入dat
else
dat|=0x00;//如果讀到的數據是0,則將0存入dat
//將單片機檢測到的電平信號DQ存入r[i]
for(time=0;time<8;time++)
;
//延時3us,兩個讀時序之間必須有大于1us的恢復期
}
return(dat);
//返回讀出的十進制數據 }
每個單總線器件內部都光刻了一個全球唯一的64位二進制序列碼,用于該單總線器件的識別
SPI總線協議
SPI總線有四種工作方式(SP0, SP1, SP2, SP3),其中使用的最為廣泛的是SPI0和SPI3方式。
SPI是一個環形總線結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。
上升沿發送、下降沿接收、高位先發送。
上升沿到來的時候,sdo上的電平將被發送到從設備的寄存器中。
下降沿到來的時候,sdi上的電平將被接收到主設備的寄存器中。讀代碼:
unsigned char ReadCurrent(void){
unsigned char i;unsigned char x=0x00;
//儲存從X5045中讀出的數據
SCK=1;
//將SCK置于已知的高電平狀態
for(i = 0;i < 8;i++){
SCK=1;
//拉高SCK
SCK=0;
//在SCK的下降沿輸出數據
x<<=1;//將x中的各二進位向左移一位,因為首先讀出的是字節的最高位數據
x|=(unsigned char)SO;//將SO上的數據通過按位“或“運算存入 x
} return(x);
//將讀取的數據返回
} 寫代碼:
void WriteCurrent(unsigned char dat){
unsigned char i;SCK=0;
//將SCK置于已知的低電平狀態
for(i = 0;i < 8;i++)// 循環移入8個位
{
SI=(bit)(dat&0x80);
//通過按位“與”運算將最高位數據送到S
//因為傳送時高位在前,低位在后
SCK=0;
SCK=1;
//在SCK上升沿寫入數據
dat<<=1;
//將y中的各二進位向左移一位,因為首先寫入的是字節的最高位
} } RS232通訊協議 串行通訊方式3 RS485通訊協議 串行通訊方式1
第四篇:串口通信實驗報告
實驗三
雙機通信實驗
一、實驗目的
UART 串行通信接口技術應用
二、實驗實現的功能
用兩片核心板之間實現串行通信,將按鍵信息互發到對方數碼管顯示。
三、系統硬件設計
(1)單片機的最小系統部分
(2)電源部分
(3)人機界面部分
數碼管部分
按鍵部分
(4)串口通信部分
四、系統軟件設計
#include
sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;
uint m=0,i=0,j;uchar temp,prt;/***y延時函數***/ void delay(uint k){ uint i,j;
}
/***鍵盤掃描***/ char scan_key(){ H1=0;H2=0;
L1=1;L2=1;L3=1;if(L1==0){ delay(5);if(L1==0){ L1=0;H1=1;H2=1;if(H1==0)} //定義局部變量ij
//外層循環 for(i=0;i { m=1;return(m);} if(H2==0){ m=4;return(m);} } } //KEY1鍵按下 //KEY4鍵按下 if(L2==0){ delay(5);if(L2==0){ L2=0;H1=1;H2=1;if(H1==0) { m=2;return(m);} if(H2==0){ m=5;return(m);} } } //KEY5鍵按下 //KEY2鍵按下 if(L3==0){ delay(5);if(L3==0){ L3=0;H1=1;H2=1;if(H1==0){ m=3; //KEY3鍵按下 } return(m);} if(H2==0){ m=6;return(m);} } } return(0); // KEY6鍵按下 /***主函數***/ main(){ P1M1=0x00;P1M0=0xff; SCON=0x50;//設定串行口工作方式1 TMOD=0x20;//定時器1,自動重載,產生數據傳輸速率 TH1=0xfd;//數據傳輸率為9600 TR1=1;//啟動定時器1 P0&=0xf0;while(1){ //如果有按鍵按下 if(scan_key()){ SBUF=scan_key();//發送數據 while(!TI);TI=0;} if(RI){ RI=0;} // // 等待數據傳送 清除數據傳送標志 //是否有數據到來 // 清除數據傳送標志 temp=SBUF; // 將接收到的數據暫存在temp中 P1=code0[temp];// 數據傳送到P1口輸出 delay(500);} } //延時500ms 五、實驗中遇到的問題及解決方法 (1)串行口和定時器的工作方式設定是關鍵,本次是按需傳輸的是兩位十六進制數,串行口為工作方式1,定時器為8位自動重載;(2)采用P0&=0xf0語句使4個數碼管靜態點亮; (3)在發送和接受過程中,用標識位TI和RI來檢測發送和接受是否完成;(4)在用電腦和單片機進行串口通信測試時,電腦的傳世速率一定要和單片機的傳輸速率相等,否則顯示會出現錯誤。 指導老師簽字: 日期: 通信的目的:傳遞消息中所包含的信息。 消息:是物質或精神狀態的一種反映,例如語音、文字、音樂、數據、圖片或活動圖像等。信息:是消息中包含的有效內容。 信道:將來自發送設備的信號傳送到接收端的物理媒質。分為有線信道和無線信道兩大類。模擬通信系統是利用模擬信號來傳遞信息的通信系統。 數字通信系統是利用數字信號來傳遞信息的通信系統。 信源編碼與譯碼目的:提高信息傳輸的有效性、完成模/數轉換 信道編碼與譯碼目的:增強抗干擾能力 加密與解密目的:保證所傳信息的安全 數字調制與解調目的:形成適合在信道中傳輸的帶通信號 同步目的:使收發兩端的信號在時間上保持步調一致。 數字通信的特點 優點: 抗干擾能力強,且噪聲不積累 傳輸差錯可控 便于處理、變換、存儲 便于將來自不同信源的信號綜合到一起傳輸 易于集成,使通信設備微型化,重量輕 易于加密處理,且保密性好 缺點: 需要較大的傳輸帶寬 對同步要求高 通信系統的分類 按通信業務分類:電報通信系統、電話通信系統、數據通信系統、圖像通信系統 … … 按調制方式分類:基帶傳輸系統和帶通(調制)傳輸系統 調制傳輸系統又分為多種調制,詳見書中表1-1。 按信號特征分類:模擬通信系統和數字通信系統 按傳輸媒介分類:有線通信系統和無線通信系統 按工作波段分類:長波通信、中波通信、短波通信 … … 按信號復用方式分類:頻分復用、時分復用、碼分復用 通信方式: 單工通信:消息只能單方向傳輸的工作方式 半雙工通信:通信雙方都能收發消息,但不能同時收發的工作方式 全雙工通信:通信雙方可同時進行收發消息的工作方式 并行傳輸:將代表信息的數字信號碼元序列以成組的方式在兩條或兩條以上的并行信道上同時傳輸 優點:節省傳輸時間,速度快:不需要字符同步措施 缺點:需要 n 條通信線路,成本高 串行傳輸 :將數字信號碼元序列以串行方式一個碼元接一個碼元地在一條信道上傳輸優點:只需一條通信信道,節省線路鋪設費用 缺點:速度慢,需要外加碼組或字符同步措施第五篇:通信原理