当前位置:文档之家› 使用串口UART0接收上位机发送的数据

使用串口UART0接收上位机发送的数据

使用串口UART0接收上位机发送的数据
使用串口UART0接收上位机发送的数据

/****************************************Copyright

(c)**************************************************

** Guangzou ZLG-MCU Development Co.,LTD.

** graduate school

** https://www.doczj.com/doc/4516816594.html,

**

**--------------File

Info-------------------------------------------------------------------------------

** File name: main.c

** Last modified Date: 2004-09-16

** Last Version: 1.0

** Descriptions: The main() function example template

**

**------------------------------------------------------------------------------------------------------

** Created by: Chenmingji

** Created date: 2004-09-16

** Version: 1.0

** Descriptions: The original version

**

**------------------------------------------------------------------------------------------------------

** Modified by:

** Modified date:

** Version:

** Descriptions:

**

***************************************************************** ***************************************/

/**************************************************************** ************

* 文件名:main.C

* 功能:使用串口UART0接收上位机发送的数据,并将数据原封不动地发送回上位机。

* 说明:通讯波特率115200,8位数据位,1位停止位,无奇偶校验。

***************************************************************** ***********/

#include "config.h"

#include "stdio.h"

#define BEEP 1<<7 //P0.7脚控制蜂鸣器

#define KEY1 1<<18 //P0.18叫接Key1

#define KEY2 1<<19 //P0.19叫接Key2

#define LED1 1<<22 //P1.22脚控制核心板上的LED1

/* 定义串口模式设置数据结构*/

typedef struct UartMode

{ uint8 datab; // 字长度,5/6/7/8

uint8 stopb; // 停止位,1/2

uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验

} UARTMODE;

uint8 rcv_buf; // UART0数据接收缓冲区

volatile uint8 rcv_new; // 接收新数据标志

/**************************************************************** ************

* 名称:IRQ_UART0()

* 功能:串口UART0接收中断。

* 入口参数:无

* 出口参数:无

***************************************************************** ***********/

void __irq IRQ_UART0(void)

{

if( 0x04==(U0IIR&0x0F) )

{

rcv_new = 1; // 设置接收到新的数据标志}

rcv_buf= U0RBR; // 读取FIFO的数据,并清除中断标志

VICVectAddr = 0x00; // 中断处理结束

}

/**************************************************************** ************

* 名称:SendByte()

* 功能:向串口UART0发送字节数据。

* 入口参数:data 要发送的数据

* 出口参数:无

***************************************************************** ***********/

void SendByte(uint8 data)

{

U0THR = data; // 发送数据

while( (U0LSR&0x20)==0 ); // 等待数据发送

}

/**************************************************************** ************

* 名称:UART0_Init()

* 功能:初始化串口0。设置其工作模式及波特率。

* 入口参数:baud 波特率

* set 模式设置(UARTMODE数据结构)

* 出口参数:返回值为1时表示初化成功,为0表除参数出错

***************************************************************** ***********/

uint8 UART0_Init(uint32 baud, UARTMODE set)

{ uint32 bak;

/* 参数过滤*/

if( (0==baud)||(baud>115200) ) return(0);

if( (set.datab<5)||(set.datab>8) ) return(0);

if( (0==set.stopb)||(set.stopb>2) ) return(0);

if( set.parity>4 ) return(0);

/* 设置串口波特率*/

U0LCR = 0x80; // DLAB位置1

bak = (Fpclk>>4)/baud;

U0DLM = bak>>8;

U0DLL = bak&0xff;

/* 设置串口模式*/

bak = set.datab-5; // 设置字长度

if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位

if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}

bak |= set.parity<<4; // 设置奇偶校验

U0LCR = bak;

return(1);

}

/**************************************************************** ************

* 名称:main()

* 功能:初始化串口,并等待接收到串口数据。

* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。

***************************************************************** ***********/

int main(void)

{

int i;

UARTMODE uart0_set;

char disp[50] ;

PINSEL0 = 0;

IO0DIR = BEEP; //BEEP脚设置为输出,KEY1设置为输入。

IO0SET = BEEP; //BEEP =1,关闭蜂鸣器

PINSEL2 &=(~(1<<3)); //使能P1.16~P1.25为GPIO

IO1DIR = LED1; //LED1设置为输出

IO1SET = LED1; //熄灭LED1

PINSEL0 = 0x00000005; // 设置I/O连接到UART0 PINSEL1 = 0x00000000;

ADC_Init(); // 初始化ADC接口

LcdInit(); // LCD初始化

rcv_new = 0;

uart0_set.datab = 8; // 8位数据位

uart0_set.stopb = 1; // 1位停止位

uart0_set.parity = 0; // 无奇偶校验

UART0_Init(115200, uart0_set); // 初始化串口模式

U0FCR = 0x00; // 禁止接收FIFO

U0IER = 0x01; // 允许RBR中断,即接收中断

/* 设置中断允许*/

VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断

VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高

VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址

VICIntEnable = 0x00000040; // 使能UART0中断

while(1) // 等待中断

{

if((IO0PIN & (KEY1)) == 0)

{

sprintf(disp, "所测电压:%d mv", ReadADC()); // 将要输出到LCD显示的内容输出到缓存里

LcdPuts(disp); // 输出disp缓冲区里的内容到液晶

CursorRst(); // 光标复位

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

{

disp[i]=0;

}

}

if((IO0PIN & (KEY2)) == 0)

{

sprintf(disp, "所测电压:%d mv\n\r", ReadADC()); // 将要输出到LCD显示的内容输出到缓存里

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

{

SendByte(disp[i]); // 将接收到的数据发送回主机

if(ReadADC()>2000)

{ IO0CLR = BEEP;

Delay(1);

IO0SET = BEEP;

Delay(1);

if((IO1SET & LED1)==0)

{

IO1SET = LED1;

}

else

{

IO1CLR = LED1;

}

}

}

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

{

disp[i]=0;

}

}

}

return(0);

}

/**************************************************************** *****************************************

** End Of File

***************************************************************** ***************************************/

基于MATLAB实时串口数据采集与曲线显示

全日制普通本科生毕业设计 基于MATLAB实时串口数据采集与曲线显示REAL-TIME SERIAL DATA ACQUISITION AND FIGURE SHOW BASED ON MATLAB 学生姓名: 学号: 年级专业及班级: 指导老师及职称: 学院: 提交日期:2011年5月

全日制普通本科生毕业论文(设计) 诚信声明 本人郑重声明:所呈交的本科毕业论文(设计)是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体在文中均作了明确的说明并表示了谢意。本人完全意识到本声明的法律结果由本人承担。 毕业论文(设计)作者签名: 年月日

目录 摘要 (1) 关键词 (1) 1前言 (2) 1.1 Matlab实时串口数据采集研究现状及发展趋势 (2) 1.2研究的目的和意义 (4) 1.3论文的组织结构 (5) 2Matlab下实时串口数据采集概要 (5) 2.1 Matlab的Serial类 (5) 2.2 数据采集 (6) 2.3曲线显示 (7) 3实时串口数据采集与曲线显示的实现 (8) 3.1实时串口通信的实现 (8) 3.2数据采集的实现 (9) 3.3曲线显示GUI的实现 (10) 4基于MATLAB的实时串口数据采集与曲线显示的具体做法 (12) 4.1数据采集的一般流程 (12) 4.1.1创建接口对象并设置属性 (12) 4.1.2打开串口设备对象 (12) 4.1.3读写串口操作 (13) 4.1.4关闭并清除设备对象 (13) 4.2基于Matlab中断方式的实时串行通信编程 (13) 4.3绘制采集数据的曲线波形和数据显示 (14) 4.3.1绘制曲线波形 (14)

基于单片机实时时钟-串口显示

/*******************说明:************************** 将实时时钟数据通过串口发送 -------------------------------------------------- 基于51/AVR最小系统板及DS1302实时时钟模块编写 **************************************************/ #include #define uchar unsigned char #define uint unsigned int //DS1302引脚定义,可根据实际情况自行修改端口定义 sbit RST=P1^3; sbit IO=P1^2; sbit SCK=P1^1; //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_hr_add 0x84 //时数据地址 #define ds1302_date_add 0x86 //日数据地址 #define ds1302_month_add 0x88 //月数据地址 #define ds1302_day_add 0x8a //星期数据地址 #define ds1302_year_add 0x8c //年数据地址 #define ds1302_control_add 0x8e //控制数据地址 #define ds1302_charger_add 0x90 #define ds1302_clkburst_add 0xbe //初始时间定义 uchar time_buf[8] = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始时间uchar readtime[14];//当前时间 uchar sec_buf=0; //秒缓存 uchar sec_flag=0; //秒标志位 //功能:延时1毫秒 //入口参数:x //出口参数:无 //说明:晶振为12M void Delay_xms(uint x) { uint i,j; for(i=0;i

单片机串口发送数据帧_0

单片机串口发送数据帧 很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu 首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体: //结构体 struct { char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0 int index;//索引,指向需要发送数组的位置 int length;//整个数据帧的长度 char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断busy_falg 为0 } send_buf; 发送数据的函数,这里有个缺点,就是还是要使用while 来检测串口是否忙碌,不过这样比占用系统时间来发送要好的多了:

//发送一帧 void SendBuf(char *buf,int length) { while(busy_falg);//查询发送是否忙,否则循环等待 send_buf.length = length; send_buf.index = 0; send_buf.buf = buf; send_buf.busy_falg = 1; SBUF = send_buf.buf[0];//写入SBUF,开始发送,后面就自动进入中断发送 } 串口中断发送函数,注意设置空闲标志位,避免多任务时多个发送帧调用了同一个结构体: void SerialInt() interrupt 4 //串口中断 { if(RI == 1)//串口接收 { RI = 0; } else if(TI == 1)//串口发送 { TI = 0;

串口采集数据,表格显示

竭诚为您提供优质文档/双击可除串口采集数据,表格显示 篇一:基于matlab实时串口数据采集与曲线显示 全日制普通本科生毕业设计 基于matlab实时串口数据采集与曲线显示 Real-timeseRialdataacquisitionandFiguReshow basedonmatlab 学生姓名: 学号: 年级专业及班级: 指导老师及职称: 学院: 提交日期:20xx年5月 全日制普通本科生毕业论文(设计) 诚信声明 本人郑重声明:所呈交的本科毕业论文(设计)是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对

本文的研究做出重要贡献的个人和集体在文中均作了明确 的说明并表示了谢意。本人完全意识到本声明的法律结果由本人承担。 毕业论文(设计)作者签名: 年月日 目录 摘要1关键词11前言2 1.1matlab实时串口数据采集研究现状及发展趋势2 1.2研究的目的和意义4 1.3论文的组织结构52matlab下实时串口数据采集概要5 2.1matlab的serial类5 2.2数据采集6 2.3曲线显示73实时串口数据采集与曲线显示的实现8 3.1实时串口通信的实现8 3.2数据采集的实现9 3.3曲线显示gui的实现104基于matlab的实时串口数据采集与曲线显示的具体做法12 4.1数据采集的一般流程12 4.1.1创建接口对象并设置属性12 4.1.2打开串口设备对象12 4.1.3读写串口操作13

4.1.4关闭并清除设备对象13 4.2基于matlab中断方式的实时串行通信编程13 4.3绘制采集数据的曲线波形和数据显示14 4.3.1绘制曲线波形14 4.3.2数据显示15 4.3.3采集图像15 4.4扩展功能——发送数据175结论17参考文献18致谢19 附录19附录120 基于matlab实时串口数据采集与曲线显示 摘要:数据采集是获取信息的基本手段,数据采集技术作为信息科学的一个重要分支,它研究信息数据的采集、存储、处理及控制等作业,具有很强的实用性,与传感器、信号测量与处理、微型计算机等技术为基础而形成的一门综合应用技术。本设计是在matlabR20xxa版本中以串口通信实时接收目标系统数据,将采集的数据进行时间同步和字对齐处理,并在matlab的数据采集工具箱支持下,利用图形界面gui的设计,直观的实时显示数据曲线。设计得重点在于在matlab上实现串口数据同步采集与处理,接收数据的时间同步和字对齐,同时扩展了发送数据的功能。关键词:matlab;gui;实时串口;数据采集;曲线显示;

matlab串口实时波形显示

作者:GG 功能:实现matalb与PC外设通讯 本例:串口232与外设单片机51通讯。实时监控51数据并且实时图形显示 时间:2011—9—16 简介:实现该功能使用M脚本文件和函数文件。 第一个文件连接串口和打开串口,设置了串口的一些参数和触发事件。连接串口COM5。有关该方面的知识请自行百度I/O文字流。 第二个文件是时间回调函数,相当于其他语言中例如C语言的中断函数 第三文件是关闭串口和清除列连接。并且清除中间TXT中介文件内容 下面是源文件 第一个: clear all s=serial('COM5');%打开串口 s.BytesAvailableFcnMode='byte';%设置事件触发为接受触发 s.InputBufferSize=5000;%设置接受缓冲区大小为5000个字节 s.BytesAvailableFcnCount=10;%每次接受到50个数据时候触发事件 s.BaudRate=19200;%设置通讯波特率 s.BytesAvailableFcn=@my_callback;%指向触发事件函数 fopen(s);%打开串口 第二个 function my_callback(obj,event) out=fread(obj,10,'uint8');%串口处读出50个数据 fid=fopen('G1.txt','a+');%打开文件并且追加 fprintf(fid,'%3d',out); fclose(fid); speed=textread('G1.txt','%u'); plot(speed); disp('save ok!'); end 第三个 fclose(s);%关闭串口 delete(s);%删除串口变量 clear all; fid=fopen('G1.txt','w');%清除中间文件txt a=[]; fprintf(fid,'%s',a); fclose(fid); clear all;%清除所以变量

串口接收、发送数据OK

//接收数据 procedure TFrm_https://www.doczj.com/doc/4516816594.html,m1ReceiveData(Sender: TObject; Buffer: PAnsiChar; BufferLength: Word); var i:integer; rbuf,sbuf:array[1..21] of byte; tmpstr,tmphex,tmpview:string; begin tmpstr:=''; tmphex:=''; move(buffer^,pchar(@rbuf)^,bufferlength); for i:=1 to BufferLength do begin tmpstr:=tmpstr+char(rbuf[i]); //字符型 tmphex:=tmphex+inttohex(rbuf[i],2); //16进制型 end; if trim(tmpstr)<>'' then viewstring:=viewstring+tmpstr; if tmphex='0A' then begin //Memo1.Lines.Add(viewstring); if Edit1.Text<>viewstring then Edit1.Text:=viewstring; viewstring:=''; end; end; //发送数据 procedure senddata; var i:integer; commflg:boolean; begin viewstring:=''; commflg:=true; for i:=1 to high(sbuf) do begin if not https://www.doczj.com/doc/4516816594.html,m1.writecommdata(@sbuf[i],1) then begin commflg:=false; break; end; //发送时字节间的延时 sleep(5); viewstring:=viewstring+inttohex(sbuf[i],2)+' '; if not commflg then messagedlg('发送失败!',mterror,[mbyes],0); end; viewstring:='发送'+viewstring; Form1.memo1.lines.add(viewstring); Form1.memo1.lines.add(''); end; procedure TForm1.sentcustom(); var str11:string ; i,j,k:integer; tmpstr:string; begin if Edit1.Text<>'' then begin str11:=Trimplace(Edit1.Text); //替换字符串中的所有空格 i:=round(length(str11)/2); //获得字符串长度,除2取整后加1 setlength(sbuf,i+1); //重新设定发送数组范围 for j:=1 to i do begin tmpstr:=copy(str11,j*2-1,2); if tmpstr='' then tmpstr:='00'; sbuf[j]:=byte(strtoint('$'+tmpstr)); //将变量转换为byte数组end; end else begin sbuf[1]:=byte($53); //帧头 sbuf[2]:=byte($54); sbuf[3]:=byte($2C); sbuf[4]:=byte($47); sbuf[5]:=byte($53); sbuf[6]:=byte($2C); sbuf[7]:=byte($2B); sbuf[8]:=byte($20); sbuf[9]:=byte($20); sbuf[10]:=byte($20); sbuf[11]:=byte($30); sbuf[12]:=byte($2E); sbuf[13]:=byte($30); sbuf[14]:=byte($30); sbuf[15]:=byte($20); sbuf[16]:=byte($6B); sbuf[17]:=byte($67); sbuf[18]:=byte($20); sbuf[19]:=byte($20); sbuf[20]:=byte($0D); sbuf[21]:=byte($0A); end; end;

基于C++Builder的串口数据实时曲线绘制的实现

基于C++Builder的串口数据实时曲线绘制的实现 范寒柏, 赵建锐, 谢汉华时间:2011年10月27日来源:微型机与应用2011年第14期 关键词:C++ Builder实时曲线MSComm控件串行通信 摘要:介绍了在C++ Builder 6.0软件开发环境下设计温盐深实时数据采集与处理系统的方法,其中PC机与数据接收装置之间的串行通信采用MSComm串行通信控件来实现,并给出了相应的程序代码,利用模拟数据源模拟现场采集数据,将实地测量得到的温度和电导率值依次通过串口传输到本软件中,结果证实系统运行稳定,该后台软件以实时曲线绘制的方式形象、直观地显示了采集的温盐深数据,并能把盐度、密度、声速的曲线绘制出来,运行良好。 关键词:C++ Builder; 实时曲线; MSComm控件; 串行通信 在海洋投弃式温盐深剖面测量中,需要进行大量的实时数据采集和可视化显示,经过软件处理后形成的曲线比原始数据更能给人直观的印象。C++ Builder是一种面向对象的可视化应用程序开发工具,为程序开发人员提供了十分轻松而快捷的开发环境。它以其友好的界面设计和方便的编程实现,广泛应用于工程实践中。本系统在C++ Builder环境下针对抛弃式温盐深剖面测量系统进行软件设计。其中利用C++ Builder进行数据的串行传输的方法,只要根据实际情况对代码稍做修改,即可应用到其他的以串口测量的系统,具有一定的通用性。 1 系统概述 该软件在Windows操作系统下以C++ Builder为开发平台,应用于海洋投弃式温盐深剖面测量系统中的实时数据采集与处理。如图1所示,其主要包含与下位机通信、实时数据处理、实时曲线显示和数据导出,浏览等部分。软件以RS 232方式与下位机进行通信。对接收的数据进行处理和温度盐度曲线绘制后可在每次测量结束后自动将所有数据存储到Realtime Data文件夹和Backup文件夹中。操作人员可以对历史数据进行查询,并根据需要打印。 2 串口通信 2.1 MSComm控件 MSComm(Microsoft Communications Contro1)控件是Microsoft公司提供的简化Windows 下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。它的安装也十分简单,只需把VB安装目录下Mscomm.reg、Mscomm32.ocx、Mscomm32.dep 这三个文件拷贝到Windows的system32目录下。然后用Windows下的注册工具regsvr32注册该OCX控件,剩下的工作是在C++ Builder中导入这个ActiveX控件,进入C++ Builder 环境在Component菜单下选Import ActiveX Control,这时在列表中可以看到Microsoft Comm Control 6.0选项, 选中这个选项点击Install按钮,完成安装。在ActiveX控件页面上可以看到一个为电话图标的控件,这就是MSComm控件。 MSComm控件有很多属性,如CommPort属性用来设置或返回通信端口号,可以设置为1~16

使用串口UART0接收上位机发送的数据

/****************************************Copyright (c)************************************************** ** Guangzou ZLG-MCU Development Co.,LTD. ** graduate school ** https://www.doczj.com/doc/4516816594.html, ** **--------------File Info------------------------------------------------------------------------------- ** File name: main.c ** Last modified Date: 2004-09-16 ** Last Version: 1.0 ** Descriptions: The main() function example template ** **------------------------------------------------------------------------------------------------------ ** Created by: Chenmingji ** Created date: 2004-09-16 ** Version: 1.0 ** Descriptions: The original version ** **------------------------------------------------------------------------------------------------------ ** Modified by: ** Modified date: ** Version: ** Descriptions: ** ***************************************************************** ***************************************/ /**************************************************************** ************ * 文件名:main.C * 功能:使用串口UART0接收上位机发送的数据,并将数据原封不动地发送回上位机。 * 说明:通讯波特率115200,8位数据位,1位停止位,无奇偶校验。 ***************************************************************** ***********/

串口通讯-单片机向电脑发送数据

#include unsigned char data1[]={"have a nice day!"}; //这是要发送的数据,它将 //显示在电脑的串口调试助手上 bit sent_over; //定义一个本次字符是否已经发送完毕的标志位 void serial_timer1_init() //串口及定时器1的初始化函数 { SCON=0x40; //串口工作方式1,只发送不接收数据 PCON=0x00; //不倍增 ES=1; //开串口中断 EA=1; //开总中断 TMOD=0x20; //定时器工作方式2,8位自动重装 TH1=0xfd; //初值为0xfd,波特率9600 TL1=0xfd; TR1=1; //开定时器1 } void serial_ISR() interrupt 4 //串口中断服务例程,每发送完一个字符 { //就会中断一次 TI=0; //TI=0,为下一次发送字符数据作准备 sent_over=1; //本次字符已经发送完毕,标志位置1 } //使下一次发送字符能够进行 void main() { serial_timer1_init(); sent_over=1; //置为1,使第一次发送字符能够进行 while(1) { static unsigned char i=0; //定义一个静态局部变量,便于在data1中取出字符 if(sent_over==1) //如果为1,说明本次字符已经发送完毕,可以进行 { //下个字符发送了 SBUF=data1[i]; //发送字符 sent_over=0; //清0,等字符发送完毕,在中断里再重新置1 if(data1[i]!='\0') //如果整个字符数组还没发送完,就继续发送 i++; else while(1); //如果整个字符数组发送完了,就使单片机停下来} } }

串口通信接收发送数据显示

1、接收数据 #include #define Data_d P0 #define Data_w P2 #define uint unsigned int #define uchar unsigned char unsigned char flag; unsigned char Duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};// 显示段码值01234567 code const unsigned char Weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码 /*------------------------------------------------ 延时子程序 ------------------------------------------------*/ void delayms(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } ///*------------------------------------------------ // 定时器初始化子程序 //------------------------------------------------*/ //void Init_Timer0(void) //{ // TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 // //TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 // //TL0=0x00; // EA=1; //总中断打开 // ET0=1; //定时器中断打开 // TR0=1; //定时器开关打开 //} /*----------------------------------------------- 串口初始化 ------------------------------------------------*/ void serial_init(void) { SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收REN=1,SM0=0,SM1=1 */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */

stm32,DMA采集一个AD数据,并通过DMA向串口发送

#include #include "ADC1.h" #include "DMA1.h" #include "USART1.h" #include "time.h" #include "stdio.h" extern uint32_t SendBuff; float ADC_Received; uint32_t ADC_Received1; uint8_t ADC_Received2[11]; //printf函数重新定向,方便在程序中使用 int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char) ch); while (!(USART1->SR & USART_FLAG_TXE)); return (ch); } void usart_putchar(uint8_t ch) { USART_SendData(USART1,ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); } int main() { ADC1_Config(); DMA_Config(); USART1_Config(); while(1) { // ADC_Received = (float)ADC_GetConversionV alue(ADC1)*3.3/4069; // ADC_Received1 = ADC_Received * 1000000000; ADC_Received = (float)SendBuff*3.3/4069; ADC_Received1 = ADC_Received * 1000000000; ADC_Received2[0]=(ADC_Received1/1000000000 + 0x30); //usart_putchar(0x2e);

VB6 实时 串口通信 数据采集代码

VB6 实时串口通信数据采集代码 介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。 ----一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。 ----该仪表的串口数据通信协议是:数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。仪表每秒发送50帧检测数据,每帧数据由4个字节组成。第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即:1 x x x x x x x 则为负数;第八位为0,即:0 x x x x x x x 则为正数。 ----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示-26.87 34.62。 ----通信传输速率为9600bps,则最快速度1.04ms发送一帧数据。

9600bps = 1200Bps这样计算出来的结果相当于8bits/Frame,现在串口中协议是10bits/Frame,求解方程1200 * 8 = x * 10得到x = 960Frame/s。1000/960 = 1.04167Frame/ms。仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。----为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下: RThreshold = 1 接收缓冲区收到一个字节产生OnComm事件 InputLen = 1 每次读取一个字节 ----仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms 时间(1000/50=20),然后再进行数据处理。①如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;②如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情

单片机串口通信的发送与接收

51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。 无论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用“中断方式”,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数,收到了新数据。 发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来等待发送完毕。 这时,处理不好的话,就可能带来问题。 看了一些网友编写的程序,发现有如下几条容易出错: 1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。 这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。 这种处理方法,就会遗漏收到的数据。 2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。但是,却在中断函数中,将TI 清零! 这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。 3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。 对此,做而论道发表自己常用的方法: 接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。 发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。 这样一来,收、发两者基本一致,编写程序也很规范、易懂。 更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。 实例: 求一个PC与单片机串口通信的程序,要求如下: 1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。 2、如果接收到1,则将P10置高电平,接收到0,P10置低电平。(用来控制一个LED)单片机是STC89C52RC/晶振11.0592/波特率要求是9600或4800。谢谢!

红外接收并通过串口发送数据至电脑

/** ************************************************************************* * [url=home.php?mod=space&uid=288409]@file[/url] main.c * [url=home.php?mod=space&uid=187600]@author[/url] xr * [url=home.php?mod=space&uid=212281]@date[/url] 2014年3月31日22:30:08 * [url=home.php?mod=space&uid=895143]@version[/url] V1.2.3 * [url=home.php?mod=space&uid=247401]@brief[/url] 串口通信+红外通信通过串口发送红外遥控器的解码值到PC * [url=home.php?mod=space&uid=536309]@NOTE[/url] 单片机STC89C52RC MCU 晶振11.0592MHZ ************************************************************************* */ #include void ConfigUart(); void UartSend(unsigned char dat); void delayms(unsigned int xms); extern bit irflag; extern unsigned char ircode[4]; extern void ConfigInfrared(); void main() { ConfigUart(); ConfigInfrared(); while (1) { if (irflag) //接收到红外数据 { irflag = 0; UartSend(ircode[0]); //发送用户码 delayms(100);//延时100ms UartSend(ircode[2]); //发送键码 } } } /** * @brief 延时xms * @param xms * @retval 无 */

串口通信基本连线操作以及流控制方式

串口通信基本连线操作以及流控制方式 目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。 1.DB9和DB25的常用信号脚说明 9针串口(DB9)25针串口(DB25) 针号功能说明缩写针号功能说明缩写 1 数据载波检测DCD 8 数据载波检测DCD 2 接收数据RXD 3 接收数据RXD 3 发送数据TXD 2 发送数据TXD 4 数据终端准备DTR 20 数据终端准备DTR 5 信号地GND 7 信号地GND 6 数据设备准备好DSR 6 数据准备好DSR 7 请求发送RTS 4 请求发送RTS 8 清除发送CTS 5 清除发送CTS 9 振铃指示DELL 22 振铃指示DELL 2.RS232C串口通信接线方法(三线制) 首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连 ·同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连; ·两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口) 上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交叉,信号地对应相接,就能百战百胜。 3.串口调试中要注意的几点: 串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。 单工、半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。 如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。 奇偶校验 串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E',其各位为: 0100,0101=45H D7 D0 由于干扰,可能使位变为1,这种情况,我们称为出现了"误码"。我们把如何发现传输中的错误,叫"检错"。发现错误后,如何消除错误,叫"纠错"。

串口通信基本接线方法

串口通信基本接线方法 目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口 (RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。 1.DB9和DB25的常用信号脚说明  9针串口(DB9) 25针串口(DB25) 针号功能说明缩写针号功能说明缩写 1 数据载波检测 DCD 8 数据载波检测 DCD 2 接收数据 RXD 3 接收数据 RXD 3 发送数据 TXD 2 发送数据 TXD 4 数据终端准备 DTR 20 数据终端准备 DTR 5 信号地 GND 7 信号地 GND 6 数据设备准备好 DSR 6 数据准备好 DSR 7 请求发送 RTS 4 请求发送 RTS 8 清除发送 CTS 5 清除发送 CTS 9 振铃指示 DELL 22 振铃指示 DELL 2.RS232C串口通信接线方法(三线制) 首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连 · 同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连; · 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口) 上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交叉,信号地对应相接,就能百战百胜。 3.串口调试中要注意的几点:

PC机之间串口通信的实现

PC机之间串口通信的实现 一、实验目的 1.熟悉微机接口实验装置的结构和使用方法。 2.掌握通信接口芯片8251和8250的功能和使用方法。 3.学会串行通信程序的编制方法。 二、实验内容与要求 1.基本要求 主机接收开关量输入的数据(二进制或十六进制),从键盘上按“传输”键(可自行定义),就将该数据通过8251A传输出去。终端接收后在显示器上显示数据。具体操作说明如下: (1)出现提示信息“start with R in the board!”,通过调整乒乓开关的状态,设置8位数据; (2)在小键盘上按“R”键,系统将此时乒乓开关的状态读入计算机I中,并显示出来,同时显示经串行通讯后,计算机II接收到的数据; (3)完成后,系统提示“do you want to send another data? Y/N”,根据用户需要,在键盘按下“Y”键,则重复步骤(1),进行另一数据的通讯;在键盘按除“Y”键外的任意键,将退出本程序。 2.提高要求 能够进行出错处理,例如采用奇偶校验,出错重传或者采用接收方回传和发送方确认来保证发送和接收正确。 三、设计报告要求 1.设计目的和内容 2.总体设计 3.硬件设计:原理图(接线图)及简要说明 4.软件设计框图及程序清单 5.设计结果和体会(包括遇到的问题及解决的方法) 四、8251A通用串行输入/输出接口芯片 由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。能够完成上述“串←→并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal

串口温度数据采集并实时显示

2013年4月 17日 [请输入学校名称 [请 输 入 专 业] 论文 串口温度数据采集并实时显示 (上位机部分) 姓 名: [请输入作者] 学 号: [请 输 入 学 号] 指导教师: [请输入指导教师]

一、原理 读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了. 有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号.将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理. 查看原来的数据的原理也是这样的,不同的地方就是,数据是从文件中来,同样的也是将多个数据分成一个一个的,然后这一个数据的大小就是画图的某一个点的纵坐标,横坐标同样为数据的序号,再将这些点用线连起来就是曲线图. 图形能移动的原理,是我们首先改变的只是数据,图形并没有变,但图形的形式是由这些数据来确定的,当数据发生变化后,我们通过刷新显示区来变化的.

二、程序流程 发送到串口来的数 接收数据 显示保 存 数 据 查看以前的数据 打开以前的数据文件 按 《 方 式 查 按 》 方 式 查 按 < 方 式 查 按 > 方 式 查 选择接收数据的方

三、串口程序设计 ///////////////文件 commDlg.cpp//////////////// //一个类,对话框类,本程序使用的是对话框形式,这个类是在VC 用MFC 自动生成的,其中包括了对话框程序应有的一些方法 class CAboutDlg : public CDialog { }; /********************以下的个方法也是VC 的MFC 的对话框程序固有的,也是MFC 自动生成的**************/ CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { } 发送到串口来的数 OnComm() Display() OnPaint() OnComm () 查看以前的数据 打开以前的数据文件 OnButton4( OnComselect(),OnComspe OnButton5( OnButton6( OnButton7

相关主题
文本预览
相关文档 最新文档