文档库 最新最全的文档下载
当前位置:文档库 › 串口通信笔记

串口通信笔记

串口通信笔记
串口通信笔记

1、串口硬件电路根据COM端口线路状态,自动从端口获取数据,然后将数据依次放入数据缓冲区,硬件电路这些操作并不受软件的任何控制。MSCoomm控件检测接收缓冲区的数据长度,当其大鱼RThrehold属性值时,产生OnComm事件,并将CommEvent属性值设置为2,已通知串口程序接收缓冲区中收到的数据

2、控件编程步骤

①、加载控件②初始化及打开串口③、捕获串口事件④、串口数据读写⑤、关串口

3、基于对话框的程序中使用控件

①拖动控件图标到窗口,创建控件ID

②在对话框头文件中声明CMSComm类的变量及引用控件类头文件

③创建CMSComm类的实例

④建立控件事件响应代码框架

具体为:

在对话框的头文件XXXXDlg.h最顶行,加上#inlcude “mscomm.h”,然后再对话框类的定义代码中加入CMSComm类变量的声明:

Public:

CMSComm myComm; //声明myComm变量为CMSComm类型

然后在主对话框的cpp文件里create消息下添加控件的创建代码:

DWORD style=WS_VISIBLE|WS_CHILD;

if (!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))

{

AfxMessageBox("创建MSComm控件失败!");

Return -1;

}

最后为MSComm建立类向导,添加OnComm消息

在SDI中,可以在View类或Frame类中按上述步骤创建实例

串口事件处理包括接收串行数据,发送串行数据以及对通信错误进行处理等操作。通常这部分程序是一个选择分支结构,使用switch语句,根据CommEvent属性值来确定执行哪个分支的代码

Case 2:收到RThreshold个字符。添加接收处理代码

Case 1:在传输缓冲区中有比RThreshold数少的字符,添加发送处理代码

Case 1008:接收缓冲区溢出,添加处理代码

Case 1010:传输缓冲区已满,添加处理代码

关闭串口使用SetPortOpen(0)

组合框的索引是从0,1,2....开始

Pow(double x,double y)计算X的Y次幂

CString str; float f=1.222;

str.Format(“%.0f”,f) 表示将浮点型的f格式化为字符串,且保留小数点后面一位,赋给str;

Str.format(“%d”,d)假设d已定义为int类型,那么将使d格式化为字符串赋给str.

需要在Dlg类的构造函数的声明下面继续声明以下变量:

Public:

CMSComm myComm; //声明myComm变量为CMSComm类型CSetupDlg mySetupDlg; //声明设置对话框实例

char myChar[2];

BYTE myCom; //串口号码

CString myParity; //奇偶校验类型

CString myBaudRate; //通信波特率

创建实例,在CReate消息中,上面有,不在赘述

设置串口通信参数:

CString strStatus,strTemp;

double dblBaud;

if(mySetupDlg.DoModal()==IDOK)

{ myCom=mySetupDlg.m_Com+1; //求取串口编号dblBaud=pow(2,(double)mySetupDlg.m_BaudRate); //求取波特率

dblBaud=19200/dblBaud;

strStatus.Format("%.0f",dblBaud);

myBaudRate=strStatus;

switch(mySetupDlg.m_Parity) {

case 0: { myParity="N"; break; }

case 1: { myParity="O"; break; }

case 2: { myParity="E"; break; } }

strStatus="COM";

strTemp.Format("%d",myCom);

strStatus+=strTemp;

strStatus+=",";

strStatus+=myBaudRate;

strStatus+=",";

strStatus+=myParity;

strStatus+=",8,1";

m_Para=strStatus;

UpdateData(false);

}

打开串口端口:

CString strPara; //串口参数

myComm.SetCommPort(myCom); //指定串口号myCom

strPara=myBaudRate;

strPara+=",";

strPara+=myParity;

strPara+=",8,1";

myComm.SetSettings(strPara); //通信参数设置

myComm.SetInBufferSize(1024); //指定接收缓冲区大小

myComm.SetInBufferCount(0); //清空接收缓冲区

myComm.SetInputMode(1); //设置数据获取方式

myComm.SetInputLen(0); //设置每次读取长度

myComm.SetRThreshold(1); //设置接收OnComm事件门限值myComm.SetPortOpen(1); //打开串口

m_Opencom.EnableWindow(false); //使“打开串口”按钮无效

m_Closecom.EnableWindow(true); //使“关闭串口”按钮生效

m_Setupcom.EnableWindow(false); //使“设置”按钮无效

m_Exit.EnableWindow(false); //使“退出”按钮无效

AfxMessageBox("串口打开成功!");

关闭串口:

myComm.SetPortOpen(0);

AfxMessageBox("串口关闭成功!");

m_Opencom.EnableWindow(true); //使打开串口按钮生效

m_Closecom.EnableWindow(false); //使关闭串口按钮无效

m_Setupcom.EnableWindow(true); //使设置按钮生效

m_Exit.EnableWindow(true); //使退出按钮生效

接收数据:

V ARIANT input1; //定义V ARIANT类型变量

BYTE rxdata[2048]; //定义存放二进制数据的数组

long len1,k;

COleSafeArray safearray1; //定义COleSafeArray类的实例

CString strDis;

switch(myComm.GetCommEvent()) {

case 2://收到RThreshold 个字符//添加接收处理代码

input1=myComm.GetInput(); //将VARAIANT变量赋值给COleSafeArray类实例

safearray1=input1; //使用COleSafeArray类的成员函数获取数据长度

len1=safearray1.GetOneDimSize();

for(k=0;k

for(k=0;k<1;k++) {

if(rxdata[k]==13)

{ m_Edit1.SetSel(1000000,1000000);

m_Edit1.ReplaceSel("\15\12");

UpdateData(false);}

else {

if(rxdata[k]<=126 && rxdata[k]>=32)

{

strDis+=rxdata[k];

m_Edit1.SetSel(1000000,1000000);

m_Edit1.ReplaceSel(strDis);

strDis="";

UpdateData(false);

}

}

}

}

对话框是不会响应OnChar和OnKeyDown消息的,会被其它控件拦截

试时发现不会进入这两个函数,必须重定义PreTranslateMessage()虚函数才能正确地进入这两个消息函数,具体实现如下:

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) {

SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);

return 0;

//return CDialog::PreTranslateMessage(pMsg); }

这样,程序就能正确地调用onKeyDown和onChar这两个函数了,且onKeyDown()在onCchar()之前处理的。

这样就能在对话框中响应WM_CHAR、WM_KEYDOWM消息了,注意在发送WM_CHAR 时,实际发送了三个消息

即WM_CHAR WM_KEYDOWM WM_KEYUP

所以,如果你有如下代码:

void CMy1Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

if(nChar=='a')

MessageBox("a");

CDialog::OnChar(nChar, nRepCnt, nFlags);

}

SetTimer(1,1000,null)启动定时器函数,第一个参数为定时器编号,第二个为定时时间,null 表示定时时间到后,使用默认的OnTimer()事件处理函数。

killTimer(1)表示关闭定时器1

1.1 事件驱动方式

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。

1.2 查询方式

查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来检测事件和通讯错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。

MSComm控件有两种处理通信的方式,即事件驱动和查询方式。事件驱动方式是处理串行通信的一种有效的方法,它可以利用OnComm事件捕获并处理通信中发生的事件或错误,实时性较强。而查询方式是在程序通过查询CommEvent属性的值来判断通信过程中的事件

或错误,这种方式适合于应用程序较小、实时性要求不高的系统中。

MSComm属性

Setting属性:设置并返回波特率、奇偶校验、数据位、停止位参数。

值为字符串表达式,格式为:"BBBB,P,D,S",分别对应为波特率、奇偶校验、数据位数、停止位数

如:MSComm1.Setting="9600,N,8,1" 波特率9600bit/s,无效验,8位数据,1位停止位。

其值说明通讯端口的设置值,如果值非法,则MSComm控件产生错误380(非法属性值) Setting属性缺省值为:"9600,N,8,1"

下表列出合法的波特率:

设置值:110、300、600、1200、2400、9600(缺省)、14400、19200、28800、38400、56000、128000、256000

下表说明合法的奇偶校验值。

设置值描述

E 偶数(Even) M 标记(Mark) N 缺省(Default) None O 奇数(Odd) S 空格(Space) 下表列出合法的数据位值。

设置值:4、5、6、7、8 (缺省)

下表列出合法的停止位值。

设置值:1 (缺省)、1.5、2

CommPort 属性:设置并返回通讯端口号。属性值为1~16,整型。

PortOpen 属性:设置并返回通讯端口的状态(开或关)。在设计时无效。

MSComm.PortOpen=true '打开端口

MSComm.PortOpen=false '关闭端口并清除接收和传输缓冲区

说明

设置PortOpen 属性为True 打开端口。设置为False 关闭端口并清除接收和传输缓冲区。当应用程序终止时,MSComm 控件自动关闭串行端口。

在打开端口之前,确定CommPort 属性设置为一个合法的端口号。如果CommPort 属性设置为一个非法的端口号,则当打开该端口时,MSComm 控件产生错误68(设备无效)。

另外,串行端口设备必须支持Settings 属性当前的设置值。如果Settings 属性包含硬件不支持的通讯设置值,那么硬件可能不会正常工作。

1、首先确定你数据的范围比如X方向范围是(0-10)Y方向的范围是

(0-100)

2、确定比例根据你对话框显示该曲线的范围来确定比例比如你显示

的大小为600*800

那么X的比例为1:60,Y的比例为1:8

3、确定原点在对话框的最左下角坐标为(0,800)(因为你对话框为

600*800的)

4、根据坐标计算你每个点的屏幕坐标xPos = 0 + X*60 (0

yPos

= 800 - Y*8 (0

于是你所有点的坐标就出来了

POINT pT;

pt.x = xPos ;

pt.y = yPos ;

于是用个循环

for(x=1;x<10;x++)

{

POINT ptNew ;

POINT ptOld ;

y = ax*x + bx +c ;

ptOld.x = 0 + (x-1)*60 ;

ptOld.y = 800 - (a(x-1)*(x-1)+b(x-1)+c)*8;

ptNew.x = 0 + x*60 ;

ptNew.y = 800 - y ;

然后利用CDC的方法画图就可以了

}

msdn中解释为Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles.

也就是说WS_OVERLAPPEDWINDOW可以创建一个拥有各种窗口风格的窗体,包括标题,系统菜单,边框,最小化和最大化按钮等。

创建窗口外观,在oncreate()函数内,添加

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);即可。

画曲线:

CPaintDC dc(this); // device context for painting

CRect rect;

int m_left,m_top,m_right,m_bottom;

int a[30]={1,2,1,4,2,3,1,2,1,0,1};

GetDlgItem(IDC_STATIC)->GetWindowRect(&rect);//获取控件相对于屏幕的位置

ScreenToClient(rect);//转化为对话框上的相对位置

CBrush brush;

brush.CreateSolidBrush(RGB(128,128,128)); //创建一个灰色的画刷

dc.SelectObject(&brush); //选入设备描述表

m_left=rect.left; //

m_top=rect.top;

m_right=rect.right;

m_bottom=rect.bottom;

dc.Rectangle(rect); //重绘此矩形

int i, jiangex,jiangey;

jiangex=(m_right-m_left)/10; //将横轴划分为10个间隔,每个间隔大小为jiangey;

jiangey=(m_bottom-m_top)/4; //将纵轴划分为4个间隔,每个间隔大小为jiangex;

CPen myPen; //创建画笔

myPen.CreatePen(PS_SOLID,0,RGB(0,0,0)); //画笔为黑色画坐标轴

dc.SelectObject(&myPen);

CString str;

int y_low,x_low;

y_low=0; //确定y轴的起点

x_low=0; //确定x轴的起点

//画y坐标轴

str.Format(_T("%d"),y_low);

dc.TextOut(m_left-5,m_bottom,str);

str.Format(_T("%d"),y_low+1);

dc.TextOut(m_left-10,m_bottom-jiangey,str);

str.Format(_T("%d"),y_low+2);

dc.TextOut(m_left-10,m_bottom-2*jiangey,str);

str.Format(_T("%d"),y_low+3);

dc.TextOut(m_left-10,m_bottom-3*jiangey,str);

str.Format(_T("%d"),y_low+4);

dc.TextOut(m_left-10,m_bottom-4*jiangey,str);

//画x坐标轴

for (i=1;i<11;i++)

{

str.Format(_T("%d"),x_low+i);

dc.TextOut(m_left+i*jiangex,m_bottom+5,str);

}

//画Y轴刻度线

for(i=m_bottom;i>m_top;i-=jiangey/2)

{

dc.MoveTo(m_left+5,i);

dc.LineTo(m_left,i);

}

//画x轴刻度线

for(i=m_left;i

{

dc.MoveTo(i,m_bottom-5);

dc.LineTo(i,m_bottom);

}

CPen m_pen;

m_pen.CreatePen(PS_DOT,1,RGB(0,1,1));

dc.SelectObject(&m_pen);

for (i=0;i<10;i++)

{

dc.MoveTo(m_left+i*jiangex,m_top);

dc.LineTo(m_left+i*jiangex,m_bottom);

}

//画曲线

CPen pen;

pen.CreatePen(PS_SOLID,2,RGB(255,0,0));

dc.SelectObject(&pen);

for (i=0;i<10;i++)

{

dc.MoveTo(m_left+(i)*jiangex,m_bottom-a[i]*jiangey);

dc.LineTo(m_left+(i+1)*jiangex,m_bottom-a[i+1]*jiangey);

}

在onbutton函数里添加代码,实现导入txt数据,并绘图

CClientDC dc(this);

CRect rect;

int m_left,m_top,m_right,m_bottom;

GetDlgItem(IDC_STATIC)->GetWindowRect(&rect);//获取控件相对于屏幕的位置

ScreenToClient(rect);//转化为对话框上的相对位置

m_left=rect.left;

m_top=rect.top;

m_right=rect.right;

m_bottom=rect.bottom;

int i, jiangex,jiangey;

jiangex=(m_right-m_left)/10; //将横轴划分为10个间隔,每个间隔大小为jiangey;

jiangey=(m_bottom-m_top)/4;

CFileDialog dlg(TRUE,NULL);

dlg.m_ofn.lpstrTitle="打开文件对话框";

dlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0Doc files(*.doc)\0*.doc\0\0";

if(dlg.DoModal()==IDOK)

{

CString filename=dlg.GetFileName();

FILE *fp=fopen(filename,"r");

for(int kk=0;kk<100;kk++)

{

fscanf(fp,"%f",&b[kk]); //fscanf遇到空格和换行时结束注意空格时也结束

//int fscanf(文件指针,格式字符串,输入列表);

//其中"%d",表示读入的是int型,"%f"表示读入的是float型

a[kk]=b[kk];

}

fclose(fp);

// CString str;

// str.Format(_T("%d"),b);

// MessageBox(str);

CPen pen;

pen.CreatePen(PS_SOLID,2,RGB(255,0,0));

dc.SelectObject(&pen);

for (i=0;i<100;i++)

{

dc.MoveTo(m_left+(i)*jiangex,m_bottom-a[i]*jiangey);

dc.LineTo(m_left+(i+1)*jiangex,m_bottom-a[i+1]*jiangey);

}

}

关于fscanf(文件指针,格式字符串,输入列表)函数的说明

%d:读入一个十进制整数.

%i :读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d 时会被算作31,但是使用%i时会算作25.

%u:读入一个无符号十进制整数.

%f %F %g %G : 用来输入实数,可以用小数形式或指数形式输入.

%x %X:读入十六进制整数.

%o': 读入八进制整数.

%s : 读入一个字符串,遇空字符‘\0'结束。

%c : 读入一个字符。无法读入空值。空格可以被读入

vb串口通信复习资料总结

串口基本概念与串口调试 1. 串口的定义:串口即串行接口的简称。CPU 与外设连接的接口电路称为I/O 口,串口是I/O 口的一种,采用串 行通信协议在一条信号线上将数据逐位传输的通信模式,所以又称“串行通信接口。 2. 数据传输方式:串行通信(同步&异步)、并行通信。 3. 同步通信:指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致,这就保证了通信双 方在发送和接收数据时具有完全一致的定时关系。 4. 异步通信: 5. 异步通信特点: a) 时钟要求不高,硬件成本低; b) 在不同传输系统中,通信格式设定可完全不同; c) 通信速率较慢; d) 依靠起始位和停止位可以到达同步; 6. 数据编码的方式:不归零编码(NRZ )、曼彻斯特编码、差分曼彻斯特编码。 7. 数据调制方式:幅移键控(ASK )、频移键控(FSK )、相移键控(PSK )。 8. 调幅方式: a) TTL 标准:+5v ——“1”,0v ——“0”(正逻辑); b) RS-232标准:-3V~-15V ——“1”,+3V~+15V ——“0”;(负逻辑); c) 20mA 电流环:存在20mA 电流为“1”,不存在为“0”; d) 60mA 电流环:存在60mA 电流为“1”,不存在为“0 ”; 9. 数据传送方式:单工、半双工、全双工。 10. 数据传送速率: a) 码元速率(R B )单位:波特/秒(baud/S )波特率;R B =log 2N (N 为编码级数); b) 信息速率(R b )单位:比特/秒(Bit/S )比特率;R b =log 22; R B /R b =log 2N /log 22=log 2N (计算机中编码级数为2,比特率等于波特率) c) 位时间(位周期):传送一个二进制位所需时间;T d =1波特/波特率 11. 发送时钟与接收时钟: a) 公式:F =n ×B b) F —发送时钟频率(Hz );B —数据传输的波特率(Baud/s );n —波特率因子(Baud -1); c) 发送/接收时钟周期:T c =1/F =T d /n ; 12. 串口接头类型:9针串口(DB-9)、25针串口(DB-25)13. 串口接线:接收接发送、发送接接收、信号地相连(25为7脚,9为5脚。) 14. 串行通信特点:接线少、成本低。 15. 串口连接线种类: a) 串口直连线;一公一母;发发/收收(延长) b) 串口交叉线;双公/双母;收发/发收(双机通信) 16. RS-232C : a) 全称:EIA-RS-232C (EIA :美国电子工业协会;RS :推荐标准) b) 全名:数据终端设备和数据通信设备之间串行二进制数据交换接口标准 c) 电气特性: i. RxD/TxD 上为1负0正; ii. RTS 、CTS 、DSR 、DTR 、DCD 上有效为正,无效为负 17. 串口调试的内容: a) 认识串口连接线和制作串口连接线; b) 采用相应串口调试工具软件对所使用的串口进行诊断。 18. 串口参数的设置:波特率、数据位、停止位和校验位。

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_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class 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

串口通信协议

串口通讯—通信协议 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 一、物理接口标准 1.串行通信接口的基本任务 (1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。 (2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。因此串并转换是串行接口电路的重要任务。 (3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选择和控制的能力。 (4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。 (5)进行TTL与EIA电平转换:CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。 (6)提供EIA-RS-232C接口标准所要求的信号线:远距离通信采用MODEM时,需要9根信号线;近距离零MODEM方式,只需要3根信号线。这些信号线由接口电路提供,以便与MODEM或终端进行联络与控制。 2、串行通信接口电路的组成 为了完成上述串行接口的任务,串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA 与TTL电平转换器以及地址译码电路组成。其中,串行接口芯片,随着大规模继承电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,如下表所示。它们的基本功能是类似的,都能实现上面提出的串行通信接口基本任务的大部分工作,且都是可编程的。才用这些芯片作为串行通信接口电路的核心芯片,会使电路结构比较简单。 3.有关串行通信的物理标准 为使计算机、电话以及其他通信设备互相沟通,现在,已经对串行通信建立了几个一致的概念和标准,这些概念和标准属于三个方面:传输率,电特性,信号名称和接口标准。 1、传输率:所谓传输率就是指每秒传输多少位,传输率也常叫波特率。国际上规定了一个标准波特率系列,标准波特率也是最常用的波特率,标准波特率系列为110、300、600、1200、4800、9600和19200。大多数CRT终端都能够按110到9600范围中的任何一种波特率工作。打印机由于机械速度比较慢而使传输波特率受到限制,所以,一般的串行打印机工作在110波特率,点针式打印机由于其内部有较大的行缓冲

串口通信实验报告全版.doc

实验三双机通信实验 一、实验目的 UART 串行通信接口技术应用 二、实验实现的功能 用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。 三、系统硬件设计 (1)单片机的最小系统部分 (2)电源部分 (3)人机界面部分

数码管部分按键部分 (4)串口通信部分 四、系统软件设计 #include #define uchar unsigned char #define uint unsigned int void send(); uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示 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; //定义局部变量ij for(i=0;i

{ m=1; //KEY1键按下 return(m); } if(H2==0) { m=4; //KEY4键按下 return(m); } } } if(L2==0) { delay(5); if (L2==0) { L2=0;H1=1;H2=1; if(H1==0) { m=2; //KEY2键按下 return(m); } if(H2==0) { m=5; //KEY5键按下 return(m); } } } if(L3==0) { delay(5); if (L3==0) { L3=0;H1=1;H2=1; if(H1==0) { m=3; //KEY3键按下

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

UART串口通信实验报告

实验四 UART 串口通信 学院:研究生院 学号:1400030034 姓名:张秋明 一、 实验目的及要求 设计一个UART 串口通信协议,实现“串 <-->并”转换功能的电路,也就是 “通用异步收发器”。 二、 实验原理 UART 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实 现全双工传输和接收。在嵌入式设计中,UART 用来主机与辅助设备通信,如汽 车音响与外接AP 之间的通信,与PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。 UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一 位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑” 0的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是 4、5、6、7、8等,构成 一个字符。通常采用ASCII 码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“ 1的位数应为偶数(偶校验)或奇数 (奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是 1位、1.5位、2位的高电 平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能 在通信中两台设备间出现了小小的不同步。 因此停止位不仅仅是表示传输的结束, 并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步 的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“ 1状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol )。 一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为 120 字符/秒,传输使用256阶符号,每个符号代表8bit ,则波特率就是120baud,比 特率是120*8=960bit/s 。这两者的概念很容易搞错。 三、 实现程序 library ieee; use ieee.std 」o gic_1164.all; end uart; architecture behav of uart is en tity uart is port(clk : in std_logic; rst_n: in std 」o gic --系统时钟 --复位信号 rs232_rx: in std 」o gic rs232_tx: out std 」o gic --RS232接收数据信号; --RS232发送数据信号;); use ieee.std_logic_ un sig ned.all;

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.wendangku.net/doc/5546028.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

几种通信总线详尽总结

微处理器中常用的集成串行总线是通用异步 接收器传输总线(UART)、串行通信接口(SCI) 和通用串行总线(USB)等,这些总线在速度、 物理接口要求和通信方法学上都有所不同。本文详细介绍了嵌入式系统设计的串行总线、驱动器和物理接口的特性,并为总线最优选择提供性能比较和选择建议。 由于在消费类电子产品、计算机外设、汽车和工业应用中增加了嵌入式功能,对低成本、高速和高可靠通信介质的要求也不断增长以满足这些应用,其结果是越来越多的处理器和控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 和通用串行总线,以及车用串行总线,包括控制器区域网(CAN)和本地互连网(LIN)。这些总线在速度、物理接口要求和通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器和物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述是基于微处理器的设计。 串行与并行相比 串行相比于并行的主要优点是要求的线数较少。例如,用在汽车工业中的LIN 串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号和电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址和数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。

单片机串口通讯实验报告

实验十单片机串行口与PC机通讯实验报告 ㈠实验目的 1.掌握串行口工作方式的程序设计,掌握单片机通讯的编制; 2.了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议; 3.了解PC机通讯的基本要求。 ㈡实验器材 1.G6W仿真器一台 2.MCS—51实验板一台 3.PC机一台 ㈢实验内容及要求 利用8051单片机串行口,实现与PC机通讯。 本实验实现以下功能,将从实验板键盘上键入的字符或数字显示到PC 机显示器上,再将PC机所接收的字符发送回单片机,并在实验板的LED上显示出来。 ㈣实验步骤 1.编写单片机发送和接收程序,并进行汇编调试。 2.运行PC机通讯软件“commtest.exe”,将单片机和PC机的波特率均设定 为1200。 3.运行单片机发送程序,按下不同按键(每个按键都定义成不同的字符), 检查PC机所接收的字符是否与发送的字符相同。 4.将PC机所接收的字符发送给单片机,与此同时运行单片机接受程序,检 查实验板LED数码管所显示的字符是否与PC机发送的字符相同。

㈤ 实验框图

源程序代码: ORG 0000H AJMP START ORG 0023H AJMP SERVE ORG 0050H START: MOV 41H,#0H ;对几个存放地址进行初始化 MOV 42H,#0H MOV 43H,#0H MOV 44H,#0H MOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示 MOV TMOD,#20H ;设置为定时器0,模式选用2 MOV TL1, #0E6H ;设置1200的波特率 MOV TH1, #0E6H SETB TR1 ;开定时器 MOV SCON,#50H ;选用方式1,允许接收控制 SETB ES SETB EA ;开中断 LOOP: ACALL SOUT ;键盘扫描并发送,等待中断 SJMP LOOP SERVE JNB RI,SEND ;判断是发送中断还是接收中断,若为发送中 断则调用 ACALL S IN ;发送子程序,否则调用接收子程序 RETI SEND: CLR TI ;发送子程序 RETI SIN: CLR RI ;接受子程序 MOV SCON, #00H MOV A, SBUF ;接收数据 LCALL XS ;调用显示子程序 RETI 子程序: SOUT: CLR TI ;清发送中断标志位 LCALL KEY ;调用判断按键是否按下子程序 MOV A,R0 ;将按键对应的数字存入A MOV SBUF,A ;输出按键数字给锁存 RET KEY: MOV P1,#0FFH ;将P1设置为输入口 MOV A, P1 CPL A ;将A内值取反

51单片机与PC串口通讯

目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -

最新串行通信实验报告整理

串行通信实验报告 班级姓名学号日期 一、实验目的: 1、掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2、了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3、学习串口通讯的程序编写方法。 二、实验要求 1.单机自发自收实验:实现自发自收。编写相应程序,通过发光二极管观察 收发状态。 2.利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。 三、实验说明 通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为 减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。也可以将本机的TXD接到RXD上。 连线方法:在第一个实验中将一台实验箱的RXD和TXD相连,用P1.0连接发光二极管。波特率定为600,SMOD=0。 在第二个实验中,将两台实验箱的RXD和TXD交叉相连。编写收发程序,一台实验箱作为发送方,另一台作为接收方,编写程序,从内部数据存储器 20H~3FH单元中共32个数据,采用方式1串行发送出去,波特率设为600。通过运行程序观察存储单元内数值的变化。 四、程序 甲方发送程序如下: ORG 0000H LJMP MAIN ORG 0023H LJMP COM_INT ORG 1000H MAIN: MOV SP,#53H MOV 78H,#20H

MOV 77H,00H MOV 76H,20H MOV 75H,40H ACALL TRANS HERE: SJMP HERE TRANS: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#80H SETB TR1 MOV SCON,#40H MOV IE,#00H CLR F0 MOV SBUF,78H WAIT1: JNB TI,WAIT1 CLR TI MOV SBUF,77H WAIT2: JNB TI,WAIT2 CLR TI MOV SBUF,76H WAIT3: JNB TI,WAIT3 CLR TI

几种通信总线详尽总结

微处理器中常用的集成串行总线就是通用异步接收器传输总线(UART)、串行通 信接口(SCI)与通用串行总线(USB)等,这些总 线在速度、物理接口要求与通信方法学上都 有所不同。本文详细介绍了嵌入式系统设计 的串行总线、驱动器与物理接口的特性,并为 总线最优选择提供性能比较与选择建议。 由于在消费类电子产品、计算机外设、汽车与工业应用中增加了嵌入式功能,对低成本、高速与高可靠通信介质的要求也不断增长以满足这些应用,其结果就是越来越多的处理器与控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线就是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 与通用串行总线,以及车用串行总线,包括控制器区域网(CAN)与本地互连网(LIN)。这些总线在速度、物理接口要求与通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器与物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述就是基于微处理器的设计。 串行与并行相比

串行相比于并行的主要优点就是要求的线数较 少。例如,用在汽车工业中的LIN串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号与电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址与数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。 串行总线的故障自诊断与调试也非常简单,可以很容易地跟踪网络中一个有故障的器件并用新器件替换而不会干扰网络。但另一方面,并行总线比串行速度快。例如,Rambus公司的“Redwood”总线速度可高达6、4GHz,而最高的串行速度不会超过几个兆赫。 在工业与汽车应用中常用的串行协议 1、UART

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; }

C#串口通信总结

我们知道对于标准DLL,可以采用DllImport进行调用。例如: [DllImport("KMY350X.dll")] private static extern int OpenPort(int PortNum, int BaudRate); 如果一些厂家比较懒的话,没有提供相应的dll,我们只能对它进行串口通信编程了。以前从没接触过串口编程,最近在一个项目中有几个地方都需要采用串口通信,跟公司一个老手请教后,感觉学到了很多东西,特在此做个总结: 一、首先我们来认识下什么是串口 右键我的电脑-管理-设备管理器-端口,选择一个端口,点击属性。 我们可以看到该串口的属性,在C#中我们使用SerialPort类来表示串口 ConfigClass config = new ConfigClass(); comm.serialPort.PortName = config.ReadConfig("SendHealCard"); //波特率 comm.serialPort.BaudRate = 9600; //数据位 comm.serialPort.DataBits = 8; //两个停止位

comm.serialPort.StopBits = System.IO.Ports.StopBits.One; //无奇偶校验位 comm.serialPort.Parity = System.IO.Ports.Parity.None; comm.serialPort.ReadTimeout = 100; comm.serialPort.WriteTimeout = -1; 二、串口调试工具 在对串口进行编程时候,我们要向串口发送指令,然后我们解析串口返回的指令。在这里向大家推荐一款工具。 串口调试助手.exe 将要发送的指令用空格隔开,选择HEX显示为放回的字符串。 三、正式编程

串口通信原理

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC- 51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为: 波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则 TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取P0端口数据,并将读取数据返回PC机; 0xA2:单片机从PC机接收一段控制数据; 0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口

51单片机与串口通信代码

51单片机与串口通信代码 2011年04月22日 17:18 本站整理作者:佚名用户评论(0) 关键字:串口通信(35) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude #i nclude #i nclude #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式 TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break;

串口记录

一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 =1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。 REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。 TB8 :在方式2、3 中,TB8 是发送机要发送的第9 位数据。在多机通信中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。 RB8 :在方式2、3 中,RB8 是接收机接收到的第9 位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。 TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。 RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。 电源控制寄存器PCON(见表3)。 表3 PCON寄存器

相关文档