RS-232通信编程实验指导书
- 格式:doc
- 大小:828.50 KB
- 文档页数:82
目录0 序言 21 理论背景 3串口通讯的见解及接口电路 3传输速率与传输距离 5波特率 5发送/接收时钟 6波特率因子 7传输距离 7奇偶校验 8网络通讯的数据包 <帧) 91.4.1 HDLC 的帧构造 10点对点协议PPP的帧构造111.5 调制解调器 <MODEM)和流控制 11调制解调器<MODEM)11流控制132 技术背景162.1 RS-23216电气特点17连结器的机械特点192.1.3 RS-232的接口信号202.2 远距离通讯 25采用Modem(DCE>和电话网通讯时的信号连结25采用专用电话线通讯262.3 近距离通讯 27零Modem的最简单连线<3线制)27零Modem标准连结283 设计过程303.1 串行通讯资料 30串行通讯端口30串口通讯线303.2 整体设计见解与功能描绘32整体设计见解32字节传输33文本文件传输344 设计成就与运行过程354.1 实时信息交互功能354.2 文本和文件的传输440序言在各样单片机应用系统设计中,如智能仪器仪表、各样手持设备、 GPS 接收器等,都会碰到怎样与PC 机进行通讯的问题。
在数据量不大、传输速率要求不高的情况下,一般都采用串行通讯方式,即经过与PC 机配置的RS-232标准串行接口COM1 、 COM2 等相连结来实现应用系统与PC 机之间的数据互换。
比方南天加密键盘,它是南天自主开发的新产品,采用扫描式16 键金属键盘,用单片机与DES 芯片实现管理和控制,经过RS232 通讯口与PC 机相连。
它是针对南天自助产品而研制的,可对键盘敲入的键码加密,以密文形式送到PC 机,保证通讯过程中的数据加密,有效地保护键盘交易信息的安全。
本课题以计算机科学与技术专业的理论知识为基础,以计算机通讯技术为支撑,在全面掌握计算机通讯基本理论和基本技术的基础上,利用RS— 232 接口接口规范,设计与实现一个计算机通讯系统。
RS232串口通信实验报告学院:电子信息学院班级:08031102姓名:张泽宇康启萌余建军学号:2011301966 2011301950 2011301961时间:2014年11月13日学校:西北工业大学一.实验题目:设计一个简单的基于串口通信的信息发送和接受界面二.实验目的:1.熟悉并掌握RS232串口标准及原理。
2.实现PC机通过RS232串口进行数据的收发。
3.熟悉VC语言编写程序的环境,掌握基本的VC语言编程技巧。
三.实验内容程序代码:P// PC1PC2Dlg.cpp : implementation file//#include "stdafx.h"#include "PC1PC2.h"#include "PC1PC2Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CPC1PC2Dlg dialogCPC1PC2Dlg::CPC1PC2Dlg(CWnd* pParent /*=NULL*/): CDialog(CPC1PC2Dlg::IDD, pParent){//{{AFX_DATA_INIT(CPC1PC2Dlg)m_send = _T("");m_receive = _T("");m_bt = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CPC1PC2Dlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CPC1PC2Dlg)DDX_Control(pDX, IDC_MSCOMM1, m_Comm);DDX_Text(pDX, IDC_EDIT1, m_send);DDX_Text(pDX, IDC_EDIT2, m_receive);DDX_CBString(pDX, IDC_COMBO1, m_bt);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CPC1PC2Dlg, CDialog)//{{AFX_MSG_MAP(CPC1PC2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON_SET, OnButtonSet)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CPC1PC2Dlg message handlersBOOL CPC1PC2Dlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_Comm.SetCommPort(1); //选择COM1m_Comm.SetInputMode(1); //输入方式为二进制方式m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件// CString str;// str="9600,n,8,1";// m_Comm.SetSettings(str);m_Comm.SetPortOpen(TRUE);//打开串口return TRUE; // return TRUE unless you set the focus to a control}void CPC1PC2Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CPC1PC2Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CPC1PC2Dlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//把字符通过串口发送出去void CPC1PC2Dlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData(TRUE); //读编辑框内容if(strlen(m_send)==0)MessageBox("发送的数据不能为空!","提示",MB_OK);else{m_Comm.SetOutput(COleV ariant(m_send));Sleep(100);}}BEGIN_EVENTSINK_MAP(CPC1PC2Dlg, CDialog)//{{AFX_EVENTSINK_MAP(CPC1PC2Dlg)ON_EVENT(CPC1PC2Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CPC1PC2Dlg::OnOnCommMscomm1(){// TODO: Add your control notification handler code hereV ARIANT data;COleSafeArray data2;CByteArray datatemp;CString strtemp,buffer;LONG len,i;BYTE Inbyte[2048],temp;UpdateData(TRUE); //读编辑框内容if(m_Comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符{data=m_Comm.GetInput(); //读缓冲区data2=data; //V ARIANT型变量转换为ColeSafeArray型变量len=data2.GetOneDimSize(); ////得到有效数据长度if(len>0){for(i=0;i<len;i++)data2.GetElement(&i,Inbyte+i);//转换为BYTE型数组for(i=0;i<len;i++) //将数组转换为Cstring型变量{temp=*(char*)(Inbyte+i); //字符型strtemp.Format("%c",temp); //将字符送入临时变量strtemp存放buffer+=strtemp; //将字符串送入临时变量buffer中存放}}m_receive=m_receive+buffer+" ";}UpdateData(FALSE); //更新编辑框内容// MessageBox("gegnxin","提示",MB_OK);}void CPC1PC2Dlg::OnButtonSet(){// TODO: Add your control notification handler code hereUpdateData(TRUE);CString str;str.Format("%s,n,8,1",m_bt);m_Comm.SetSettings(str);}void CPC1PC2Dlg::OnButton2(){// TODO: Add your control notification handler code hereGetDlgItem(IDC_EDIT2)->SetWindowText(_T(""));}四.实验过程:(1)将9针RS232串口通信线与PC机串口连接,并用跳线将RS232串口通信线另一端2(RXD)和3(TXD)短接。
实验二RS232串口通信程序的编写一.实验目的1.掌握串口通讯编程的编写2.实现两台计算机通过RS232通信二.编程环境Visual studio 2008三、实验原理1 概述在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。
Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。
多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。
进程是应用程序的运行实例,拥有自己的地址空间。
每个进程拥有一个主线程,同时还可以建立其他的线程。
线程是操作系统分配CPU时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。
进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念。
2 VC++对多线程的支持使用MFC开发是较普遍的VC++编程方法。
VC++把线程分为两种:用户界面线程和工作者线程。
用户界面线程能够提供界面和用户交互,通常用于处理用户输入并相应各种事件和消息;而工作者线程主要用来处理程序的后台任务。
程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个进程。
创建上述的两种线程都利用这个函数。
线程的终止取决于下列事件之一:线程函数返回;线程调用ExitThread()退出;异常情况下用线程的句柄调用TerminateThread()退出;线程所属的进程被终止。
3 多线程在串口通信中的应用3.1 串口通信对线程同步的要求因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 9X/NT系统下线程是汇编级中断,所以有可能多个线程同时访问同一个对象。
这些对象可能是全局变量,MFC的对象,MFC的API等。
串口通信的几个特点决定了必须采用措施来同步线程的执行。
RS232串口通信实验一、认识RS232单片机的串行口是非常有用的,通过他我们可以把单片机系统的数据传回电脑处理或者接受电脑传过来的数据而进行相应的动作,在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。
RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口. 它是在1970年由美国电子工业协会(EIA)联合贝尔系统,调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB-25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来IBM的PC机将RS232简化成了DB-9连接器,从而成为事实标准.而工业控制的RS-232口一般只使用RXD,TXD,GND三条线.在讨论RS-232C接口标准的内容之前,先说明两点:首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。
因此这个标准的制定,并未考虑计算机系统的应用要求。
但目前它又广泛地被借来用于计算机(更准确的说,是计算机接口)与终端或外设之间的近端连接标准。
显然,这个标准的有些规定及和计算机系统是不一致的,甚至是相矛盾的。
有了对这种背景的了解,我们对RS-232C标准与计算机不兼容的地方就不难理解了。
其次,RS-232C标准中所提到的“发送”和“接收”,都是站在DTE立场上,而不是站在DCE的立场来定义的。
由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,因此双方都能发送和接收。
(1)RS232(DB9)的接口说明1 DCD 载波检测2 RXD 接收数据3 TXD 发送数据4 DTR 数据终端准备好5 SG 信号地6 DSR 数据准备好7 RTS 请求发送8 CTS 允许发送9 RI 振铃提示(2)接口的电气特性在RS-232-C中任何一条信号线的电压均为负逻辑关系。
实验一RS-232组网通信实验(一)PC及其兼容工控机的异步通讯接口PC及其兼容工控机都有两个异步通讯接口:COM1和COM2,其关键部件是通用异步收发器(UART)INS8250。
INS8250的内部有10个寄存器,分别用于通讯参数的设置、线路及MODEM的控制与状态查询、数据收发及中断管理等。
要在中断方式下收发数据,必须对INS8250的寄存器直接操作,各寄存器名称及其相应的端口地址列于表1。
由表1可知:THR、RBR和DLL占用同一个端口地址3F8H(2F8H),IER和DLM也占用同一个端口地址3F9H(2F9H),对它们进行访问时,如果设置LCR的最高位为1,访问的是除数寄存器;如果设置LCR的最高位为0,则访问的是THR、RBR和IER。
而THR是只写寄存器,RBR是只读寄存器,在LCR的最高位设置为0时,对端口地址3F8H(2F8H)的写入操作访问的是THR,读出操作访问的是RBR。
硬件连接方式:将2台PC机的COM1/COM2串行通信口通过9针D型接口3线连接。
(二)INS8250有关寄存器的设置串行口的初始化主要是对INS8250的有关寄存器进行设置,以确定通讯的数据格式、波特率、中断的触发方式等。
①确定数据格式数据格式是通过设置线路控制寄存器(LCR)来确定的,LCR的定义如下:其中:WSL1、WSL0用于选择每个发送或接收的串行字符的位数,分别设置这两位为00、01、10、11时,对应的字长依次是5位、6位、7位、8位;STB用于确定停止位的位数,STB =0时使用1位停止位,STB=1时,如果WSL1、WSL0设置为00,使用1.5位停止位,其它情况下使用2位停止位;PEN用于选择是否允许奇偶校验,PEN=0时,不进行奇偶校验,PEN=1时有奇偶校验;此时,EPS选择校验方式,EPS=0时是奇校验,EPS=1时是偶校验;SP用于选择是否在奇偶校验位和停止位之间插入奇偶标志位,SP=0时不插入,SP=1时插入1位奇偶标志位,偶校验时插一个0,奇校验时插入一个1;SB是设置间断控制位,SB=1时输出数据强迫为0,SB=0时可进行正常的数据收发;DLAB是除数寄存器访问位,DLAB =1时访问除数寄存器,DLAB=0时访问THR、RBR和IER。
RS-232串口通信程序设计实验要求:用TC对计算机的串口进行编程,并作一个简单的串口查询通讯程序。
实验方案:用RS-232串口通讯线将两台计算机A、B的串口相连。
实验步骤:1、首先对计算机串口通讯控制芯片8250的控制寄存器进行初始化和设置;2、对计算机B的串口发送一个数据前,查询计算机A的串口的发送移位寄存器是否为空,如果是则发送数据,如果为否则继续查询,直到条件成立;执行完发送指令后,再次查询计算机A的口的发送移位寄存器是否为空,如果是则结束发送;如果为否,则继续查询,直到条件成立。
3、从计算机A的串口接受刚才从计算机B的串口发送的数据前,先查询计算机A的口的接收数据标志位是否为1,如果是则表示计算机A的口接收数据准备就绪,执行接收指令,即从计算机A的口读入数据,若否则表示没有准备好接收,继续查询计算机A的口的接收数据标志位,直到为1;接收完数据后,再次查询计算机A的串口的接受寄存器是否为空的标志位的状态,如果为1则程序转入计算机B的串口的数据发送程序;如果否,则继续查询等待,直到接收。
实验内容:1.在COMDEBUG中针对串口通信各寄存器进行设置,掌握各寄存器在串口通信中的作用及各参数的含义。
地址寄存器名称备注3F8H 发送保持寄存器(THR)DLAB=03F8H 接收缓冲寄存器(RBR)DLAB=03F8H 波特率因子寄存器[低](DLL)DLAB=13F9H 波特率因子寄存器[高](DLM)DLAB=13F9H 中断允许寄存器(IER)DLAB=03FAH 中断识别寄存器(IIR)3FBH 线路控制寄存器(LCR)3FCH Modem控制寄存器(MCR)3FDH 线路状态寄存器(LSR)3FEH Modem状态寄存器(MSR)注:com1口的基地址为:3F8; com2口的基地址为:2F8。
在上表中,10个可编程寄存器,使用了7个地址,其中部分寄存器共用一个地址,由DLAB=0/1来区分,在DLAB=1,用于设定通讯所需的波特率;8250的控制寄存器控制/状态字:1)接收缓冲寄存器(RBR)和发送保持寄存器(THR)RBR暂存从线路上接收到的有效字符,等待本地读取。
R S232串口通信实验(总7页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--实验名称:RS-232串口通信实验实验目的:利用单片机的TXD、RXD口,学会单片机串行口的使用。
实验原理:1、51单片机内置全双工异步串行口,共有4种工作方式,电原理图如下:2、串行通信的编程:(1)串行口控制寄存器SCON(2)SM0、SM1—串行口工作方式选择位SM0 SM1 方式功能说明0 0 0 同步移位寄存器方式(用于扩展I/O口)0 1 1 8位异步收发,波特率可变(由定时器控制)1 02 9位异步收发,波特率为fosc/64或fosc/321 1 3 9位异步收发,波特率可变(由定时器控制)(3)REN—允许串行接收位该控制为由软件置“1”或清“0”。
REN=1 允许串行口接收数据。
REN=0 禁止串行口接收数据。
(4)TB8—发送的第9位数据方式2和3时,TB8是要发送的第9位数据,可作为奇偶校验位使用,也可作为其他标志。
(例:在多机通讯中,可以标注传输内容为地址或数据) RB8—接收到的第9位数据方式2和3时,RB8存放接收到的第9位数据。
在方式1,如果SM2=0,RB8是接收到的停止位。
在方式0,不使用RB8。
(5)TI——发送中断标志位方式0时,串行发送第8位数据结束时由硬件置“1”,其它工作方式,串行口发送停止位的开始时置“1”。
TI=1,表示一帧数据发送结束,可供软件查询,也可申请中断。
CPU响应中断后, 向SBUF写入要发送的下一帧数据。
TI必须由软件清0。
RI——接收中断标志位方式0时,接收完第8位数据时,RI由硬件置1。
其它工作方式,串行接收到停止位时,该位置“1”。
RI=1,表示一帧数据接收完毕,并申请中断, CPU从接收SBUF取走数据。
该位状态也可软件查询。
RI必须由软件清“0”。
(6)特殊功能寄存器PCONSMOD:波特率倍增位方式0,波特率=fosc/12方式2,波特率= fosc*2SMOD/64方式1、3,波特率=定时器T1的溢出频率*2SMOD/643、多机通讯:主机传输的信息包括地址+数据,每个从机根据自己的地址来判断是否参与通讯SM2 —多机通信控制位用于方式2或方式3中的多机通信控制。
一.实验目的及要求(1)实验目的1.了解串行通信口的基本知识。
2.了解RS-232标准以及通信方法。
(2)实验要求1.通过三线制制作一条串口通信线(PC-PC)。
2.编程实现两台PC间通过RS-232进行实时的字符通信。
二.实验步骤(1)实验准备Pc版本:window10企业版编程语言及工具:Python和serial包。
材料:RS-232缆线(2)实验步骤1.使用Python语言的serial包实现两台PC机进行实时的字符通信。
(1)利用Python中的tkinter包编写出串口通信的GUI页面,包括6个组件,分别是:字符显示框,端口选择框,波特率选择框,打开串口框,信息输入框,信息发送框,并且建立一个响应事件,监测是否有发送信息或有信息发送过来。
(2)串口设置:为方便,这里只设置一个参数:波特率,初始参数设为9600,可选参数为4800,9600,19200。
(3)打开串口:首先输入两个串口COM1和COM2,启动一个辅助线程,处理串口事件,若按钮点击打开串口,若检测到串口未打开,则打开串口,并显示串口打开成功;若已经打开,则显示打开串口错误。
(4)发送字符:从输入框中读取字符并将其编码,通过线程将编码后的字符发送。
(5)接收字符:用read函数读取发送过来的字符,将其显示在字符显示框中。
2.用虚拟串口在本机上虚拟两台机之间的通信。
(1)打开Configure Virtual Serial Port Driver软件。
(2)运行程序,打开COM1端口,再次运行程序,打开COM2端口。
(3)在COM1端口的GUI上发送字符,在COM2端口的GUI上发送字符,即可实现两台机之间虚拟的串口通信。
三. 实验结果及验证(1)串口通信GUI页面如图1;图1(2)打开串口:打开COM1,结果显示true,即打开成功,如图2;打开COM2;结果显示true,即打开成功,如图3;图2图3(3)在COM1端口发送字符串“hello”,COM2接收字符串并显示,如图4;在COM2口发送字符串“hi,COM1收字符串并显示,如图5;图4图5(4)在Configure Virtual Serial Port Driver软件上虚拟的通信记录,如图6;可见,COM1端口发送5个字符,即“hello”,COM2接收5个字符,COM2端口发送2个字符,即“hi”,因此成功实现虚拟串口之间的通信。
目录0 引言 (2)1 理论背景 (3)1.1串口通讯的概念及接口电路 (3)1.2传输速率与传输距离 (5)1.2.1 波特率 (5)1.2.2 发送/接收时钟 (6)1.2.3 波特率因子 (7)1.2.4 传输距离 (7)1.3奇偶校验 (8)1.4网络通信的数据包(帧) (9)1.4.1 HDLC的帧结构 (10)1.4.2 点对点协议PPP的帧结构 (11)1.5调制解调器(MODEM)和流控制 (12)1.5.1 调制解调器(MODEM) (12)1.5.2 流控制 (14)2 技术背景 (17)2.1RS-232 (17)2.1.1 电气特性 (18)2.1.2 连接器的机械特性 (20)2.1.3 RS-232的接口信号 (22)2.2远距离通信 (26)2.2.1 采用Modem(DCE)和电话网通信时的信号连接 (26)2.2.2 采用专用电话线通信 (28)2.3近距离通信 (28)2.3.1 零Modem 的最简单连线(3线制) (29)2.3.2 零Modem标准连接 (30)3 设计过程 (32)3.1串行通信材料 (32)3.1.1 串行通信端口 (32)3.1.2 串口通信线 (32)3.2总体设计概念与功能描述 (34)3.2.1 总体设计概念 (34)3.2.2 字节传输 (35)3.2.3 文本文件传输 (36)4 设计成果与运行过程 (38)4.1实时信息交互功能 (38)4.2文本和文件的传输 (47)5 总结 (82)0 引言在各种单片机应用系统设计中,如智能仪器仪表、各类手持设备、GPS接收器等,都会遇到怎样与PC机进行通讯的问题。
在数据量不大、传输速率要求不高的情况下,一般都采用串行通讯方式,即通过与PC机配置的RS-232标准串行接口COM1、COM2等相连接来实现应用系统与PC机之间的数据交换。
例如南天加密键盘,它是南天自主开发的新产品,采用扫描式16键金属键盘,用单片机与DES芯片实现管理和控制,通过RS232通讯口与PC机相连。
它是针对南天自助产品而研制的,可对键盘敲入的键码加密,以密文形式送到PC机,确保通信过程中的数据加密,有效地保护键盘交易信息的安全。
本课题以计算机科学与技术专业的理论知识为基础,以计算机通信技术为支撑,在全面掌握计算机通信基本理论和基本技术的基础上,利用RS—232接口接口规范,设计与实现一个计算机通信系统。
串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。
提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
实际上1992年Crescent Software Inc.公司专为VB设计了MSCOMM.VBX用户通信控件,它提供了通过串口发送和接收数据的串行通信能力,不但包括了全部Windows API中关于串行通信的16个函数所完成的功能,而且开拓了更多的使用户设计方便的对象属性来满足不同用户不同业务的需求。
所以只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。
这也是为什么我们这次设计所用的编程工具是VB6.0。
通过这些控件能实现两台计算机之间的串行通信其中包括字节,文本,文件等信息。
1 理论背景1.1 串口通讯的概念及接口电路随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。
这里所说的通信是只计算机与外界的信息交换。
因此,通信即包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU 之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口。
许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送方式,实际上,CPU与接口之间仍按并行方式工作。
图1.1串行通信传输位串行通信的概念所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。
如图1.1所示。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
由于CPU 与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。
典型的串行接口的结构如图1.2所示。
图1.2典型的串行接口的结构在数据输入过程中,数据一位一位地从外设进入接口的“接收移位寄存器”,当“接收移位寄存器”中已接收完1个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。
CPU从“数据输入寄存器”中读取接收到的字符。
(并行读取,即D7~D0同时被读至累加器中)。
“接收移位寄存器”的移位速度由“接收时钟”确定。
在数据输出过程中,CPU把要输出的字符(并行地)送入“数据输出寄存器”,“数据输出寄存器”的内容传输到“发送移位寄存器”,然后由“发送移位寄存器”移位,把数据一位一位地送到外设。
“发送移位寄存器”的移位速度由“发送时钟”确定。
接口中的“控制寄存器”用来容纳CPU送给此接口的各种控制信息,这些控制信息决定接口的工作方式。
“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。
例如,用状态寄存器的D5位为“1”表示“数据输出寄存器”空,用D0位表示“数据输入寄存器满”,用D2位表示“奇偶检验错”等。
能够完成上述“串<- ->并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal Asynchronous Receiver and Transmitter),典型的芯片有:Intel 8250/8251,16550。
1.2 传输速率与传输距离1.2.1 波特率在串行通信中,用“波特率”来描述数据的传输速率。
所谓波特率,即每秒钟传送的二进制位数,其单位为bps(bits per second)。
它是衡量串行数据速度快慢的重要指标。
有时也用“位周期”来表示传输速率,位周期是波特率的倒数。
国际上规定了一个标准波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。
例如:9600bps,指每秒传送9600位,包含字符的数位和其它必须的数位,如奇偶校验位等。
大多数串行接口电路的接收波特率和发送波特率可以分别设置,但接收方的接收波特率必须与发送方的发送波特率相同。
通信线上所传输的字符数据(代码)是逐为位传送的,1个字符由若干位组成,因此每秒钟所传输的字符数(字符速率)和波特率是两种概念。
在串行通信中,所说的传输速率是指波特率,而不是指字符速率,它们两者的关系是:假如在异步串行通信中,传送一个字符,包括12位(其中有一个起始位,8个数据位,2个停止位),其传输速率是1200b/s,每秒所能传送的字符数是1200/(1+8+1+2)=100个。
图1.3波特率1.2.2 发送/接收时钟在串行传输过程中,二进制数据序列是以数字信号波形的形式出现的,如何对这些数字波形定时发送出去或接收进来,以及如何对发/收双方之间的数据传输进行同步控制的问题就引出了发送/接收时钟的应用。
在发送数据时,发送器在发送时钟(下降沿)作用下将发送移位寄存器的数据按串行移位输出;在接收数据时,接收器在接收时钟(上升盐)作用下对来自通信线上串行数据,按位串行移入移位寄存器。
可见,发送/接收时钟是对数字波形的每一位进行移位操作,因此,从这个意义上来讲,发送/接收时钟又可叫做移位始终脉冲。
另外,从数据传输过程中,收方进行同步检测的角度来看,接收时钟成为收方保证正确接收数据的重要工具。
为此,接收器采用比波特率更高频率的时钟来提高定位采样的分辨能力和抗干扰能力。
1.2.3 波特率因子在波特率指定后,输入移位寄存器/输出移位寄存器在接收时钟/发送时钟控制下,按指定的波特率速度进行移位。
一般几个时钟脉冲移位一次。
要求:接收时钟/发送时钟是波特率的16、32或64倍。
波特率因子就是发送/接收1个数据(1个数据位)所需要的时钟脉冲个数,其单位是个/位。
如波特率因子为16,则16个时钟脉冲移位1次。
例:波特率=9600bps,波特率因子=32,则接收时钟和发送时钟频率=9600×32=297200Hz。
1.2.4 传输距离串行通信中,数据位信号流在信号线上传输时,要引起畸变,畸变的大小与以下因素有关:波特率——信号线的特征(频带范围)传输距离——信号的性质及大小(电平高低、电流大小)当畸变较大时,接收方出现误码。
在规定的误码率下,当波特率、信号线、信号的性质及大小一定时,串行通信的传输距离就一定。
为了加大传输距离,必须加调制解调器。
图1.4传输信号的频谱特性1.3 奇偶校验串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为:0100,0101=45HD7 D0由于干扰,可能使0变为1,这种情况,我们称为出现了“误码”。
我们把如何发现传输中的错误,叫“检错”。
发现错误后,如何消除错误,叫“纠错”。
最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。
可采用奇校验或偶校验。
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:1 0110,01010 0110,0001偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:1 0100,01010 0100,0001奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。
在发现错误后,只能要求重发。
但由于其实现简单,仍得到了广泛使用。
有些检错方法,具有自动纠错能力。
如循环冗余码(CRC)检错等。
1.4 网络通信的数据包(帧)在网络通信中,“包”(Packet)和“帧”(Frame)的概念相同,均指通信中的一个数据块。
对于具体某种通信网络,一般使用术语“帧”。
一种网络的帧格式可能与另一种网络不同,通常使用术语“包”来指一般意义的帧。