RS232组网通信实验

合集下载

#RS232通信编程实验指导书

#RS232通信编程实验指导书

目录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串口通信实验报告

RS232串口通信实验报告

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双机通信实验

基于RS232双机通信实验

实验报告基于RS232双机通信实验一、实验目的1、理解串行通信的基本概念和51系列单片机的串行通信接口结构。

2、理解现场仪表的通讯过程二、实验内容1、使用串口实现单片机1与单片机2的数据通信,实现互相控制。

要求按下单片机1系统板上的按键,单片机2系统板上LED点亮。

三、实验环境1、编程软件keil2、仿真软件proteus四、实验原理MAX232芯片用于电平转换,实现RS232电平与TTL电平(单片机)的互相转换。

本次实验单片机之间通信不使用握手信号,只需3根信号线:TXD(发送线),RXD(接收线),GND(地线)。

单片机之间通信的原理图如图1所示,当单片机1(主机) 查询外接控制开关S3按下时,单片机1发送一个自定义信号给单片机2(从机),单片机2收到信号后点亮指示灯LED4。

图1 单片机之间通信的原理图五、实验过程1、实现实验要求(1)实验程序主机程序:#include<reg51.h>void main(){TMOD=0x20; //使用T1定时器工作方式2SCON=0X50; //使用串行接口方式一TH1=0XFD; //设置T1的初始值,使得波特率为9600TL1=0XFD;PCON=0x00;TR1=1; //启动T1定时器P1=0xff; //设置P1口初始值while(1) //开始死循环{SBUF=P1; //将P1值给SBUFwhile(!TI); //等待发送完成TI=0; //发送标志位置零等待下次发送}}从机程序:#include<reg51.h>void main(){TMOD=0x20; //使用T1定时器工作方式2SCON=0X50; //使用串行接口方式一TH1=0XFD; //设置T1的初始值,使得波特率为9600TL1=0XFD;PCON=0x00;TR1=1; //启动T1定时器P1=0xff; //设置P1口初始值while(1){P1=SBUF; //接受数据并用P1口显示while(!RI); //等待接受完成RI=0; //关闭接受使能位,等待下次接送}}(2)仿真图2、升级使得按钮按下闪三次并LED显示,每按下按钮显示加一,当LED达到15后重新开始计数。

RS232串口通讯

RS232串口通讯

实验九 RS232串口通讯应用一、实验目的串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而且也能实现电脑对单片机的控制,比如可以很直观地把红外遥控器键值的数据码显示在电脑上等。

本次实验目的:1、通过实际硬件连接及软件编程完成 51单片机和PC机之间的串口通讯,从而加深对异步串行通信接口的基本结构、工作原理等串行通信基本概念的理解;2、了解RS-232C电平规定与TTL电平规定的不同,及采用专用芯片MAX232实现两者之间电平转换的连接电路。

二、实验设备51单片机实验板、PC机、串口连接线、串口调试软件、Keil软件、连接导线等。

三、实验原理及内容51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。

进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,在此采用专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

采用三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。

这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

图1 串口通讯的硬件电路连接为了能够在电脑端看到单片机发出的数据,必须借助一个WINDOWS软件进行观察,这里利用一个免费的电脑串口调试软件(这是一个绿色的软件,无需安装,可以直接在当前位置运行这个软件)。

软件界面如下图,1先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。

串口选择为COM1,当然51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源,这时只要按下K1一次,在串口调试助手软件的接收区界面中就会增加一个“AF”字符,表示单片机向电脑发送“AF”字符成功。

RS232接口实验

RS232接口实验

RS232接口实验一、实验原理和电路说明数据通信设备与外部进行信息交换时,一般是通过数据接口进行。

在数据接口中主要是传输两类信息:(1)数据;(2)时钟。

有时也只有数据信息而没有时钟信息,这时时钟信息将由接收端从接收数据流中提取出来。

数据接口的设计取决于应用场合。

复杂的接口包括物理层、链路层等,简单的只包括物理层:即物理结构与信号方式的定义(信号的传输方式)。

在信号传输方式方面,目前可选的种类很多:TTL、RS232、RS422、V35、ECL等。

信号传输方式的选择与信号的速率、传输距离、抗干扰性能等有关。

对于低速、近距离信号的传输采用TTL方式,对于一般较高速率、距离较近时可选用RS232方式。

随着距离的增加、信号速率的提高可采用RS422、V35等信号方式,对于很高的信号速率通常采用ECL信号接口方式。

RS232是电气设备之间常用的串行数据接口标准之一。

RS232电气接口具有以下特点:RS232是一种不平衡接口,信号源开路电压小于25V,负载阻抗3000到700 0Ω,负载电容小于2500pF。

在接口端电压低于–3V时确定为1,接口电压高于3V时确定为数据0。

RS232电路采用接口专用集成芯片MAX232,其内部含两个独立的收发通道。

终端A模块的功能电原理框图如图8.2.1所示。

在该模块中,测试点的安排如下:1、TPF01(TPG01):RS232接收数据(RS232→—TTL)2、TPF02(TPG02):TTL接收数据(RS232→—TTL)3、TPF03(TPG03):TTL发送数据(TTL→—RS232)4、TPF04(TPG04):RS232发送数据(TTL→—RS232)注:括弧内为终端B模块内测试点。

其余测试点安排在JH02连接头的外部自环接头上。

自环连接头的制作见图8.2.2。

TPF02TPF03TPF01TPF04① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨⑩JF01 UF01发送数据接收数据图8.2.1 同步接口模块电原理框图RS232TTL1 3 5 7 92 4 6 8 10图8.2.2 RS232接口自环连接测二、实验仪器1、 Z H5001通信原理综合实验系统 一台2、 20MHz 双踪示波器一台三、实验目的1、 熟悉RS232接口的基本特性和应用;四、实验内容异步数据接口B调制器解调器信道TPG03收数据自环m 序列输入图8.2.3 终端接口测试系统连接示意图TTL RS232异步数据接口ATPG02发数据TPF03收数据准备工作:为便于引入观测信号,将来自解调器的数据送往RS232端口进行测试,测试系统连接参见图8.2.3所示。

计算机网络实验RS232串口通信程序的编写

计算机网络实验RS232串口通信程序的编写

计算机网络实验RS232串口通信程序的编写RS232是一种常见的串行通信接口,用于在计算机和其他外部设备之间传输数据。

它广泛应用于各种设备和应用程序,如串口调试工具、点阵打印机等。

本文将介绍如何编写一个基本的RS232串口通信程序。

我们将使用C 语言和Linux操作系统来演示。

在开始编写程序之前,我们需要了解一些RS232串口的基本概念和通信协议。

RS232串口由发送线(TX)、接收线(RX)、控制线(如RTS、CTS、DTR和DSR)等组成。

通信时,发送方将数据从TX线发送到接收方的RX线,然后接收方通过RX线接收数据。

以下是一个简单的RS232串口通信程序示例:```c#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <termios.h>#include <unistd.h>int maiint fd = open("/dev/ttyS0", O_RDWR , O_NOCTTY); // 打开串口设备if (fd == -1)perror("打开串口失败");exit(1);}struct termios options;tcgetattr(fd, &options); // 获取当前串口设置//设置波特率为9600cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);//设置数据位为8位,无奇偶校验,停止位为1位options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag ,= CS8;//更新串口设置tcsetattr(fd, TCSANOW, &options);char buffer[255];while (1)ssize_t len = read(fd, buffer, sizeof(buffer)); // 从串口读取数据if (len == -1)perror("读取串口失败");exit(1);}printf("接收到数据:%.*s\n", len, buffer);ssize_t nwrite = write(fd, buffer, len); // 向串口写入数据if (nwrite == -1)perror("写入串口失败");exit(1);}}close(fd);return 0;```该程序首先打开串口设备`/dev/ttyS0`,如果打开失败则会输出错误信息并退出。

RS232组网通信实验

RS232组网通信实验

实验一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。

实验四Zigbee无线通信及RS232串口通信实验

实验四Zigbee无线通信及RS232串口通信实验

实验四Zigbee⽆线通信及RS232串⼝通信实验实验四 Zigbee⽆线通信及RS232串⼝通信实验实验预习要求1、了解Zigbee⽆线通信原理。

2、学习RS232串⼝和定时器编程⽅法。

⼀、实验⽬的1、了解Zigbee驱动函数的功能。

2、了解MSP430F6638中USCI_Ax模块的UART模块的使⽤。

3、掌握MSP430F6638的串⼝通信和定时器的使⽤。

⼆、实验器材PC机、两个CC2520模块、两台MSP430F6638实验箱、USB数据线、杜邦线三、实验内容1、验证性实验利⽤两个Zigbee模块通信,⼀个模块作发射,⼀个作接收。

发射模块所在实验箱按下按键控制接收模块所在实验箱上LED1的亮灭,从⽽实现⽆线点灯的功能。

2、设计性实验利⽤MSP430F6638单⽚机的USCI_Ax模块进⾏RS232串⼝通信,实现PC机和单⽚机的双向通信,要求如下:(1)单⽚机发送数字0到9⾄ PC机,从数字5开始发送,每隔1s发送⼀个数。

若单⽚机开发板上按下⼀按键(例如S3),则数字加1后进⾏发送,加到9以后,⼜从0开始,若没有按键按下,则继续发送当前的数字。

在PC机上⽤串⼝调试助⼿软件查看PC机接收的数据是否正确。

(2)PC机向单⽚机发送点灯的命令。

如果单⽚机接收到PC机发送的数字1,则点亮单⽚机开发板上的LED1;接收到PC机发送的数字2,则点亮单⽚机开发板上的LED2,……,直到LED5点亮。

四、实验原理1、验证性实验Zigbee是基于IEEE802.15.4标准的低功耗个域⽹协议。

根据这个协议规定的技术是⼀种短距离、低功耗的⽆线通信技术。

这⼀名称来源于蜜蜂的⼋字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在⽅位信息,也就是说蜜蜂依靠这样的⽅式构成了群体中的通信⽹络。

其特点是近距离、低复杂度、⾃组织、低功耗、低数据速率、低成本。

主要适合⽤于⾃动控制和远程控制领域,可以嵌⼊各种设备。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
textcolor(0);
textbackground(3);
clrscr();
gotoxy(3,2);
cprintf(" Receive from COM1:\n");
gotoxy(3,4);
cprintf(" 9600 bps,8 bit,2 stop,even\n");
gotoxy(3,6);
(四)推荐程序调实方式:
①在1台PC机上安装具有如下界面的软件工具——“串口调实助手”(图1),在另一台PC机上分别调实发送和接收程序;
②在2台PC机上联合调实完整的发送/接收程序。
(五)推荐基础程序1——Turbo C语言程序
1.程序说明:
本程序是通过硬件中断方式完成RS-232接收与发送串行通信的。使用COM1进行通信时,产生的硬件中断号为IQR4,对应的中断向量为0CH。
③中断机制的引发INS8250可由4个事件中的任一个来引发一个中断,这4个事件依此是:接收数据有效;发送保持寄存器空;接收数据出错;MO-DEM状态改变。通过IER的bit0~bit3可依次设置它们是否被允许,某位为1时相应的事件允许引发一个中断,为0时禁止。
INS8250通过INTRPT引脚的高电平向系统发出中断请求,为了使INS8250能够向系统发中断,MCR的第三位必须置1。
{
unsigned char B;
asyncvect=getvect(0x0c);
disable();
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
textcolor(14);
port_init(PORT,255);
while(i!=1)
{
a=getche();/*由键盘输入数据*/
if(a=='*')break;
else
outportb(0x3f8,a);/*发送数据*/
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
}
void check(unsigned char states)
{
while((inportb(0x3fd)&states)==0);
}
void putb(unsigned char ch)
{
int temp=0;
由表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。
unsigned char Buffer[BUFFLEN];
intbuffin=0;
intbuffout=0;
inti=0,ii=0;
unsigned char temp_buffer[BUFFMAX];
unsigned char ch,flag;
/*开放串行口中断*/
void enableports(void)
③为保证通讯的可靠性以及不耽误CPU响应其它中断,中断服务程序应尽量短,一些费时的操作如数据存盘等应放在中断服务程序以外。
④在把一个数据写入发送保持寄存器(THR)之前,必须检查线路状态寄存器LSR,以保证发送保持寄存器为空。
⑤初始化中断系统时,应该关闭中断,初始化完成后再开放。可使用C语言的库函数disable()和enable()来完成。
clrscr();/*绘制数据发送窗口*/
window(3,2,41,10);
textcolor(0);
textbackground(3);
clrscr();
gotoxy(3,2);
cprintf(" Transfer from COM1:\n");
gotoxy(3,4);
cprintf(" 9600bps, 8bit,2stop,even\n");
enable();
setvect(0x0c,asyncvect);
}
/*对COM1串行口有关参数的初始化*/
void Init()
{
outportb(0x3fb,0x80);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x1f);
实验一RS-232组网通信实验
(一)PC及其兼容工控机的异步通讯接口
PC及其兼容工控机都有两个异步通讯接口:COM1和COM2,其关键部件是通用异步收发器(UART)INS8250。INS8250的内部有10个寄存器,分别用于通讯参数的设置、线路及MODEM的控制与状态查询、数据收发及中断管理等。要在中断方式下收发数据,必须对INS8250的寄存器直接操作,各寄存器名称及其相应的端口地址列于表1。
(三)程序设计要点
在程序设计时,应该考虑以下问题:
①设置中断向量,以保证CPU执行中断服务程序时有一个正确的入口地址。可使用C语言的库函数setvect()和getvect()对中断向量进行设置和读取。
②中断服务程序什么时候结束,CPU无法知道,8259中断控制器也无法知道,必须通过指令通知8259中断控制器。对于PC机,这条指令就是向端口地址20H写入一个命令字20H。
unsigned char getb(void)
{
if(buffout!=buffin)
{
if(++buffout==BUFFLEN)buffout=0;
return(Buffer[buffout]);
}
else return(0xff);
}
main()
{
clrscr();/*绘制数据接收窗口*/
window(3,2,41,10);
flag=1;
putb(ch);
outportb(0x20,0x20);
}
/*关闭串行口中断*/
void disableports(void)
{
disable();
outportb(0x3f9,0x00);
outportb(0x3fc,0x00);
outportb(0x21,inportb(0x21)&0x10);
②设置波特率INS8250内部包含一个可编程的波特率发生器,它允许用1~65535的任意除数对1.8432MHz的输入频率进行分频,分频后的信号即波特率发生器的输出频率,而波特率是波特率发生器输出频率的1/16。由此可知,除数=1843200/(波特率×16)。16位的除数应在初始化时写入除数锁存器。
PC使用8259中断控制器,它可以管理来自外设的8个各自独立的中断请求信号IRQ0~IRQ7,其中IRQ4和IRQ3分别用于COM1和COM2的中断申请。8259内部有一个中断屏蔽寄存器(IMR),端口地址为21H,它的bit0~bit7分别对应IRQ0~IRQ7,通过设置其中的某一位为0以允许与其对应的中断请求。
B=inportb(0x21)&0xef;
outportb(0x21,B);
setvect(0x0c,asyncint);
enable();
}
/*中断服务程序*/
void interrupt far asyncint(void)
{
unsigned char ch;
ch=inportb(0x3f8);
其中: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。
尹彦芝.C语言常用算法与子程序.清华大学出版社.1993年.239-241
袁征,杨仁树,严建新. C语言编程技巧程序集.电子工业出版社.1993年.233-234
2.接收数据子程序如下:
/*通过中断方式由RS-232接收数据*/
#include<stdlib.h>
#include<dos.h>
#include<process.h>
#include<h>
#include<bios.h>
#include<ctype.h>
#include<stdio.h>
#include<fcntl.h>
#define BUFFLEN 10800
#define BUFFMAX 900
void Init(void);
void check(unsigned char states);
#include"process.h"
相关文档
最新文档