MC9S12XS128 串口操作例程

时间:2019-05-12 16:47:57下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《MC9S12XS128 串口操作例程》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《MC9S12XS128 串口操作例程》。

第一篇:MC9S12XS128 串口操作例程

MC9S12XS128 串口操作例程

Code Warrior 4.7 Target : MC9S12XS128 Crystal: 16.000Mhz busclock: 8.000MHz pllclock:16.000MHz 本程序主要包括以下功能: 1.设置锁相环和总线频率; 2.IO口使用;

3.共四路ATD使用及显示方法。

LED计数,根据灯亮可以读取系统循环了多少次

*****************************************************************************************/ #include /* common defines and macros */ #include /* derivative information */ #include #include #include #pragma LINK_INFO DERIVATIVE “mc9s12xs128”

#pragma CODE_SEG DEFAULT #define CR_as_CRLF TRUE // if true , you can use “n” to act as CR/LF, // if false, you have to use “nr”,but can get a higher speed static int do_padding;static int left_flag;static int len;static int num1;static int num2;static char pad_character;unsigned char uart_getkey(void){ while(!(SCI0SR1&0x80));//keep waiting when not empty return SCI0DRL;} /* void uart_init(void){ SCI0CR2=0x0c;SCI0BDH=0x00;//16MHz,19200bps,SCI0BDL=0x1a SCI0BDL=0x34;//16MHz,9600bps,SCI0BDL=0x34 } */ void uart_putchar(unsigned char ch){ if(ch == 'n'){ while(!(SCI0SR1&0x80));SCI0DRL= 0x0d;//output'CR' return;} while(!(SCI0SR1&0x80));//keep waiting when not empty SCI0DRL=ch;} void putstr(char ch[]){ unsigned char ptr=0;while(ch[ptr]){ uart_putchar((unsigned char)ch[ptr++]);} } static void padding(const int l_flag){ int i;if(do_padding && l_flag &&(len < num1))for(i=len;i

/* Build number(backwards)in outbuf */ cp = outbuf;do { *cp++ = digits[(int)(num % base)];} while((num /= base)> 0);if(negative)*cp++ = '-';*cp--= 0;/* Move the converted number to the buffer and */ /* add in the padding where needed.*/ len = strlen(outbuf);padding(!left_flag);while(cp >= outbuf)uart_putchar(*cp--);padding(left_flag);} static void outnum(long num, const long base ,unsigned char sign)//1, signed 0 unsigned { unsigned int negative;if((num < 0L)&& sign){ negative=1;num =-num;} else negative=0;

reoutnum(num,negative,base);} static int getnum(char** linep){ int n;char* cp;n = 0;cp = *linep;while(isdigit(*cp))n = n*10 +((*cp++)-'0');*linep = cp;return(n);} void printp(char* ctrl,...){ int long_flag;int dot_flag;char ch;va_list argp;va_start(argp, ctrl);for(;*ctrl;ctrl++){ /* move format string chars to buffer until a format control is found.*/ if(*ctrl!= '%'){ uart_putchar(*ctrl);#if CR_as_CRLF==TRUE if(*ctrl=='n')uart_putchar('r');#endif continue;} /* initialize all the flags for this format.*/ dot_flag = long_flag = left_flag = do_padding = 0;pad_character = ' ';num2=32767;try_next: ch = *(++ctrl);if(isdigit(ch)){ if(dot_flag)num2 = getnum(&ctrl);else { if(ch == '0')pad_character = '0';num1 = getnum(&ctrl);do_padding = 1;} ctrl--;goto try_next;} switch(tolower(ch)){ case '%': uart_putchar('%');continue;case '-': left_flag = 1;break;case '.': dot_flag = 1;break;case 'l': long_flag = 1;break;case 'd': if(long_flag ==1){ if(ch == 'D'){outnum(va_arg(argp, unsigned long), 10L , 0);continue;} else /* ch == 'd' */ {outnum(va_arg(argp, long), 10L,1);continue;} } else { if(ch == 'D'){outnum(va_arg(argp, unsigned int),10L,0);continue;} else /* ch == 'd' */ {

outnum(va_arg(argp, int), 10L,1);

continue;} } case 'x': // X 无符号,x 有符号

if(long_flag ==1){ if(ch == 'X'){

outnum(va_arg(argp, unsigned long), 16L,0);

continue;} else /* ch == 'x' */ {

outnum(va_arg(argp, long), 16L,1);

continue;} } else { if(ch == 'X'){

outnum(va_arg(argp, unsigned int), 16L,0);

continue;} else /* ch == 'x' */ {

outnum(va_arg(argp, int), 16L,1);

continue;} } //如果按照16进制打印,将全部按照无符号数进行

continue;case 's': outs(va_arg(argp, char*));continue;case 'c': uart_putchar(va_arg(argp, int));continue;default: continue;} goto try_next;} va_end(argp);} #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 20 SCI0_ISR(void){ SCI0CR2_RIE=0;//此处为串口中断需要处理的事情

uart_putchar(uart_getkey());PORTA_PA0=~PORTA_PA0;SCI0CR2_RIE = 1;} #pragma CODE_SEG DEFAULT //----------------------void setbusclock(void){ CLKSEL=0X00;//disengage PLL to system PLLCTL_PLLON=1;//turn on PLL SYNR=1;REFDV=1;//pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;_asm(nop);//BUS CLOCK=16M _asm(nop);while(!(CRGFLG_LOCK==1));//when pll is steady ,then use it;CLKSEL_PLLSEL =1;//engage PLL to system;} //----------------------static void SCI_Init(void){ SCI0CR1 =0x00;SCI0CR2 =0x2c;//enable Receive Full Interrupt,RX enable,Tx enable SCI0BD =0x68;//SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BD=0x34 //busclk 16MHz, 9600bps,SCI0BD=0x68 //busclk 24MHz, 9600bps,SCI0BD=0x9C } //busclk 32MHz, 9600bps,SCI0BD=0xD0 //busclk 40MHz, 9600bps,SCI0BD=0x106 //----------------------void Dly_ms(int ms){ int ii,jj;if(ms<1)ms=1;for(ii=0;ii

setbusclock();SCI_Init();DDRA=0xFF;PUCR_PUPBE=1;EnableInterrupts;for(;;){ LedCnt=(LedCnt>0XFE?0:++LedCnt);Dly_ms(1000);//修改延时以修改数据发送频率

//低电平灯亮用这句,注释掉下面那句

PORTA_PA0=~PORTA_PA0;

//高电平灯亮用这句,注释掉上面那句

//PORTB=LedCnt;putstr(“n http:%/%/shop36265907.taobao.com”);printp(“n Minute elapsed: %03ds”,LedCnt);} }

第二篇:单片机串口总结

51单片机串口总结

有句话说“尽信书不如无书”,要学好单片机就要不断的、大胆的实验,要多怀疑,即使我们的怀疑最终被证明是错误的那么这也是进步(人们认识事物很多情况下来源于怀疑),当怀疑出现时就要去实践。有很多东西如果不通过实践是不可能掌握其中隐藏的奥秘,就拿51单片机串口通讯这一块,我认为掌握很好了,可以很轻松的实现数据的接收、发送,但这段时间当我重新学习串口时,我才发现里面还有很多小细节从没注意,更别说研究了。对于接收发送程序永远是按照别人的模式来编写程序,并没有真真正正的挖掘深层次的内容。我身边太多的人在临摹别人的程序,当然我不反对,但是希望自己多问几个问什么,单纯的会编程是学不好单片机的,毕竟单片机有自己独特的硬件结构。

开讲之前先简要说一下同步、异步通信:

同步通信:发送方时钟对接收方时钟控制,使双方达到完全同步。

异步通信:发送与接受设备使用各自的时钟控制数据的发送和接受过程(虽然时钟不同,但一般相差不大)。

51单片机串行口结构

从上图中我们看到,51单片机有两个物理上独立的接收、发送缓冲器SBUF,它们共用同一个地址99H,但是请注意:接收缓冲器只能读而不能写,发送缓冲器只写不读。单片机可以同时实现数据的发送与接收功能。

特别注意:接收器是双缓冲结构:当前一个字节从接收缓冲区取走之前,就已经开始接收第

二个字节(串行输入至移位寄存器),此时如果在第二个字节接收完毕而前一个字节还未被读走,那么就会丢失前一个字节。

51单片机串口控制寄存器

关于51单片机的控制寄存器各个位表示的含义在这里我只谈SM2。

SM2为多机控制位,主要用于工作方式2和3,当接收机的SM2=1时,可以利用接收到的RB8来控制是否激活RI(RB8=0不激活RI,收到的数据丢失;RB8=1时收到的数据进入SBUF,并激活RI ,进而在中断服务程序中将数据从SBUF中读走)。当SM2=0时,不论收到的RB8为何值都将使接收到的数据进入SBUF,并激活RI,通过控制SM2实现多机通信。

51单片机串口通讯方式

51串口通讯方式有3种,方式0、方式

1、方式2与方式3,他们的工作模式不尽相同。首先他们的波特率很容易忽视。方式0与方式2的波特率固定,而方式1和3的波特率由T1的溢出率决定。

方式0的波特率=f/12

系统晶振的12分频,换句话说12M晶振的情况下,其波特率可达1M,速度是很高的(当我们在选用串行器件并采用方式0时需要特别注意器件所能允许的最大时钟频率)。

方式2 =f/64或f/32(当SMOD=1时为f/32,SMOD=0时为f/64)。

曾经我用方式2进行MODBUS通信时,总是通讯失败,我仔细检查程序,没有发现逻辑错误,特别是当我参考别人的程序时,发现很少有人用方式2进行MODBUS通讯,所以当时自己妄下结论51单片机的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,试想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。这才恍然大悟,看来还是自己太武断了,没有认真看书啊。有时我们认为我们犯这样的错误很低级,其实我们很多次都是因为这样的小细节导致我们整个系统不正常,正所谓“千里之堤毁于蚁穴”,这些细节真的伤不起啊。

方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.关于3种通讯方式其中有几点特别容易出错:

1、无论采用哪种通讯方式,数据发送和接受都是低位在先,高位在后。、3种方式作为输出,由于输出是CPU主动发送,不会产生重叠错误,当数据写入SBUF后,发送便启动(通过单片机内部逻辑控制,与程序无关),当该字节发送结束(SBUF空),置TI。不要理解为当数据一写入SBUF就置位TI,如果中断允许则在中断中发送数据,这就大错特错了。同样作为输入,可能会产生重叠错误(主要依赖于特定的环境),当一个字节的数据接收完毕(SBUF满)置位RI,表示缓冲区有数据提示CPU读取。

接下来通过一些实验具体说明串口通信中需要注意的地方 方式0输出

方式0主要功能是作为移位寄存器,将数据从SBUF中逐位移出,最常见的用法就是外接串入并出的移位寄存器,如74LS164。之前在做这一部分实验时总是利用单片机I/O端口模拟实现,现在想想在串口未被占用的情况下,方式0是最好的实现方式。

利用串口方式0,向74LS164输出字符“0”的编码,程序如下:

该程序采用了中断方式实现,结果是通过74LS164使数码管显示“0”。实验结果如下:

这里我说明几点: 如果采用查询方式,并且只发送一遍,那么程序最后的while(1);不可以省略,否则会出现数码管闪烁的现象(在KEIL环境下,main()函数也是作为一个调用函数,最后也有返回RET,它不像C中的main()函数,当执行完毕后就停止,而是重新复位执行,如此反复,这一点要特别注意)

这是查询方式下不加while(1);的现实效果 如果采用中断方式发送,请记得中断中清除TI,仅仅是为了解除中断标志,而不是等待发送结束,因为此时数据早已离开了SBUF跑到外边去了。3 74LS164最高25MHZ,采用方式0,没有问题。

方式0作为输入模式

以74ls165(最高时钟25MHZ)为例,可以满足要求。

对应结果如下:

(注意:74ls165线传送高位,而串口通信低位在先,所以显示的数据和实际数据高低位正好相反

P1.7---P1.0对应D0---D7)。

本程序只接收一次,也许有人会问,中断程序中REN=0,表示什么意思?可不可以改成ES=0?

这个问题很好,首先REN=0表示接收禁止,即不允许串口接收数据;ES=0是禁止中断和单片机是否接收数据没有关系,不接收数据自然中断允许也是徒劳,这两者有很大的区别。我们在很多接收程序中经常可以看到在判断RI标志后紧跟着清除标志位,我想问一下,为什么?)

如果我们也按照这种模式改写会怎样呢?

实验结果如下

两次结果差异怎么这么大?为什么会这样子?

为了便于理解,也为了说明问题方便,对中断程序做了如下处理:

结果又变了

是不是感觉很奇怪,究竟咋回事呢?

首先中断程序中当判断RI置位标志后紧跟着清零是为了接收下一个字节的数据,也为了避免单片机重复中断。

当51单片机串口方式0作输入时,在REN=1且RI=0的条件下就启动了单片机串口接收过程。如果有一个条件不满足就不能启动接收过程,以上出现的错误正式由于忽略了这个重要的因素造成的。在RI清零后由于REN仍然为1,单片机已经开始接收第二字节的数据,由于串口速度很快,RI仍会置位,而紧接着将REN清零只能阻止单片机接收数据,但是却

不能阻挡第二次中断。由于只接收了部分外部引脚数据(此时外部引脚为高电平,即逻辑1,其实单片机只接收了一位,对于12M晶振而言,方式0大约8us接收一个字节数据)。相反在RI=0与REN=0之间加上适当的延迟,就可以保证一个字节的数据全部接收完毕,故此时我们读上来的一个字节为0xff。

我在中断程序中添加了一个中断计数器(不加延迟),发现中断服务程序的确执行了两次

结果如下

加上延迟结果

这就验证了刚才的结论。

至于说可不可以换做ES=0,回答是可以的,尽管同样可以实现数据的读取,但是实质不同,当禁止中断后,单片机仍在接收外部数据,只是不再请求中断,自然的不再读取第2、3。。。字节的数据,那么P1将保留第一次中断时从SBUF中读出的数据。如果某一时刻打开中断发现结果不正常,如果理解了上面的机制就不会觉得惊讶了。建议:单次接收时,中断服务程序中REN清零放在RI之前。

还有一个问题非常重要:

如果我在中断服务程序中不清除RI,会怎样?

很少有人会这样用,但是经常有人忘记了(包括我)。课本上写得很清楚,务必在中断中用软件清除RI,为什么要这样呢?难道仅仅是为了接收下一次数据并且避免单片机不断的响应中断?的确如此,如果对于一个小系统而言,不清除中断标志,那么单片机将不停的中断,影响接下来任务的执行,系统必然瘫痪,而且不能正常的接收数据。总结:方式0作为发送方,只要向SBUF中写入数据就启动了发送过程;

方式0在座位接收模式时,REN=

1、RI=0的情况下就已经启动了接收过程。在中断程序中要注意两者清零的顺序。

还有一种情况要特别注意:单片机复位时SCON自动清零,如果单片机不工作在方式0,那么如果采用位操作SCON时也要注意REN=1与SM0、SM1的书写顺序,总之切记方式0启动发送、接收数据的条件。

方式1 方式1为10位异步通信模式。作为输出和方式0没有本质的区别,不同的是数据帧的形式,但是对于接受模式则有点不同,当REN=1且RI=0时,单片机并不启动接收过程。而是以已选择波特率的16倍速率采样RXD引脚的电平,当检测到输入引脚发生1---0负跳变时,则说明起始位有效,才开始接受本帧数据。方式1模式下 单片机可以工作在全双工以及半双工方式。下面举两个例子

半双工

主机发送某一字符,从机接收到数据后返回数据加1的值 比如 主机发送“1“,从机收到后回复主机”2“。实验结果如下:

方式1工作方式主要注意: 1 波特率可变。数据接收以起始位为标志,停止位结束。当RI=0且SM2=0或接收到有效停止位时,单片机将接收到的数据移入SBUF中,两个条件缺一不可。

方式2和方式3 方式2和3不同的只是波特率,这里以方式3为例

作为输出模式同方式1没有区别,只是增加了第八位数据位,第八位数据可以用作校验位或在多机通信中用作数据/地址帧的判别位。

首先我们来做模拟主从奇偶校验模式

主机发送一帧数据,并发送奇偶校验位,从机接收数据后,判断数据是否正确,如果正

确,接收指示灯亮,并且回送主机数据加1,反之回送0;主机接收从机信息,如果校验正确点亮LED指示灯.(从机、主机接收数据无论校验正确与否,均显示接收到的字节数据)。奇校验模式 演示结果如下:

(注:从接接收不正确,返回0)

主从机接收正确效果

之前我们已经介绍了SM2的具体用法,主要用于多机通信,将SM2作为数据/地址帧 的判别位,在接收地址时令SM2=1,当接收到的第八位数据为1时激活RI产生中断,然后比较地址,如果地址符合则清除SM2准备接受数据信息,反之不理睬。

特别注意 当RI=0且SM2=0(或SM2=1时接收到第9位数据为1)时,单片机将接收到的数据移入SBUF中,两个条件缺一不可。

在这里我只举一个简单的例子 一个主机,两个从机 起始时,主机从机的SM2均置位,所有的从机等待主机发送地址帧,主机令TB8=1,发送地址帧。所用的从机将接受到的地址和自己的地址比较,如果符合,点亮LED指示灯,清除SM2(准备接受主机发送的数据帧),并将自己的地址发送到主机。主机接收从机发送的地址信息,如果地址符合则数码管显示从机地址并开始准备发送数据,反之发复位信号,TB8=1。从机接收数据先判断RB8,如果RB8=1,则复位,重新开始接收主机发送的地址帧,反之通过P1口外接数码管显示接收到的数据。实验结果如下:

注意:如果主机没有得到正确的地址,则将按照一定的速率发送地址帧,直到接收正确的地址为止,该试验主机向从机2发送信息。

另外在这里我补充两点: 我们可以很方便的利用串口通信的工作方式2或3实现奇偶校验,注意技巧,当为偶校验时TB8=P,奇校验时TB8=~P;

2当单片机利用中断发送大量数据时,尽量采用中断发送,因为单片机在写入SBUF数据后由硬件将数据发送完,在发送过程中,单片机还可以做很多事情,利用中断发送数据可以提高CPU利用率。尤其在低波特率时效果更明显。

第三篇:串口通信实验报告范文

华南农业大学

实验报告

----------目录----------

1、实验任务和目的..............................................................................................................2、实验准备..........................................................................................................................3、实验步骤................................................................................................................................4、实验分析与总结....................................................................................................................(1)、分析.............................................................................................................................(2)、总结.............................................................................................................................1、实验任务和目的

了解串行通信的背景知识后,通过三线制制作一条串口通信线(PC-PC),并编程实现两台PC间通过RS-232C通信。要求两台PC机能进行实时的字符通信,并了解工业自动化控制中的基本通信方式。

2、实验准备

1、检查PC是否具有串行通信接口,并按其针脚类准备一条串口通信线缆。

2、串口包的安装,下载javacomm20-win32.zip并解压,将win32com.dll复制到bin目录下;将comm.jar复制到lib;把javax.comm.properties也同样拷贝到lib目录下,再将上面提到的文件放到JRE相应的目录下就可以了。

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--

第四篇:串口通讯实验报告

网络编程与实践实验报告

实验内容:串口通信编程 学号:S201502189 姓名:职荣豪 日期:2015-9-28

一、实验要求

使用VS2010编写基于对话框的MFC应用程序,两个窗口分别使用两个串口,使得这两个窗口可以进行通信,包括数据的发送与接收。

二、实验原理

本实验使用Microsoft Communications Control控件,利用这个ActiveX控件,只需要编写少量代码即可轻松进行通信。

该控件相关的函数如下: put__CommPort:设置串口号

put_Settings:以字符串的形式设置波特率、奇偶校验位(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数

put_InputMode:设置接收数据的类型(0-文本类型,1-二进制类型)put_InputLen:设置从接收缓冲区读取的字节数,0表示全部读取 put_InBufferSize:设置接收缓冲区大小 put_OutBufferSize:设置发送缓冲区大小

put_RThreshold:设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件

put_SThreshold:设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件

put_PortOpen:打开或关闭串口,传入参数为true时打开串口,传入参数为false时关闭串口 get_CommEvent:获得串口上刚发生的事件,事件值为2表示接收到数据

get_InBufferCount:获得缓冲区中的数据位数

get_Input:获取缓冲区数据,返回类型为VARIANT put_Output:发送数据

三、设计思路

需要添加一个Microsoft Communications Control控件,用于进行串口通信。由于要求同一程序可运行两个窗口进行相互通信,需要两个窗口开启两个不同串口,故需要添加一个Edit Control控件用于输入串口号,并添加打开串口按钮,在点击该按钮时对串口控件的参数进行设置并开启串口。同时添加关闭串口按钮,点击后关闭串口并可以对串口号进行修改。

需要添加两个Edit Control 分别用于显示接收到的数据以及输入要发送的数据。需要添加一个发送按钮,点击后发送输入的数据。

四、实验步骤

1.建立基于对话框的MFC应用程序 2.添加界面控件并设置ID与Caption 添加Microsoft Communications Control控件,用于进行串口通信 添加一个Edit Control控件,用于输入串口号,ID设置为IDC_PORT 添加一个Static Text控件,用于标注端口号,将Caption设置为“串口号:”

添加两个按钮,分别用于打开串口、关闭串口。IDC分别设置为IDC_BTN_OPEN、IDC_BTN_CLOSE,Caption分别设置为“打开”、“关闭” 添加两个Edit Control,分别用于显示接收到的数据以及输入要发送的数据,ID分别设置为IDC_RECEIVE、IDC_SEND 添加两个Static Text控件,用于标注接收区与发送区,Caption分别设置为“接收区”、“发送区”

添加一个按钮用于发送数据,ID设置为IDC_BTN_SEND,Caption设置为“发送” 调整控件的大小与位置。

完成后如图:

3.给控件绑定变量

右键单击Microsoft Communications Control控件,选择“添加变量”,变量名为m_com 打开类向导给控件添加变量:

给IDC_PORT绑定变量,用于存放输入的端口号,数据类型为int,变量名为m_port 给IDC_RECEIVE绑定变量,用于存放接收到的数据,数据类型为CString,变量名为m_strReceive 给IDC_SEND绑定变量,用于存放输入的待发送的数据,数据类型为CString,变量名为m_strSend

4.给控件添加事件响应函数

右键单击Microsoft Communications Control控件,选择“添加事件处理程序”,点击“添加编辑”,生成响应函数,此函数用于接收数据。

在函数中添加以下代码:

UpdateData(TRUE);if(nEvent == 2){

} UpdateData(FALSE);//将m_strReceive的值显示到控件中

//更新m_strReceive的值

//获取事件值

//获取缓冲区位数

//时间值为2,此时为收到数据 int nEvent = m_com.get_CommEvent();int k = m_com.get_InBufferCount();if(k <= 0)//位数小于等于0时则返回 return;char* str =(char*)m_com.get_Input().parray->pvData;//获取接收到数据的字*(str + k)= '';//字符数组最后一位的下一位设置为'',为字符串的结尾标志 m_strReceive +=(const char *)str;//在用于显示的字符串末尾添加刚接收到的符数组的首地址

字符串

双击IDC_BTN_OPEN控件,即“打开”按钮,生成响应函数,此函数用于设置串口参数并打开串口。

在函数中添加以下代码:

UpdateData(TRUE);

if(m_port <= 0){

} m_com.put__CommPort(m_port);//设定串口为m_port的值 m_com.put_Settings(“9600,n,8,1”);

//设定波特率9600,无奇偶校验位,8作为数据位,AfxMessageBox(“请输入正确的串口号!”);return;

//更新m_port的值 //端口号不小于等于0

1作为停止位

m_com.put_InputMode(1);//设定数据接收模式,1为二进制方式

m_com.put_InputLen(0);//设置从接收缓冲区读取的字节数,0表示全部读取

m_com.put_InBufferSize(1024);//设置输入缓冲区大小为1024byte

m_com.put_OutBufferSize(1024);//设置输出缓冲区大小为1024byte m_com.put_RThreshold(1);//每接收到一个字符时,触发OnComm事件 m_com.put_SThreshold(0);//每发送一个字符时,不触发OnComm事件 m_com.put_PortOpen(true);

//打开串口

GetDlgItem(IDC_BTN_OPEN)->EnableWindow(FALSE);//打开按钮设为不可用 GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(TRUE);//关闭按钮设为可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(TRUE);

//发送按钮设为可用

双击IDC_BTN_CLOSE控件,即“关闭”按钮,生成响应函数,该函数用于关闭串口。在函数中添加以下代码:

m_com.put_PortOpen(false);//关闭串口

GetDlgItem(IDC_BTN_OPEN)->EnableWindow(TRUE);

//打开按钮设为可用

GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(FALSE);//关闭按钮设为不可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(FALSE);//发送按钮设为不可用

双击IDC_BTN_SEND控件,即“发送”按钮,生成响应函数,该函数用于发送数据。在函数中添加以下代码:

UpdateData(TRUE);//更新m_strSend的值,读取编辑框内容 m_com.put_Output(COleVariant(m_strSend));//发送数据

5.在对话框初始化函数中添加额外初始化代码

在对话框刚打开时,此时串口没有开启,故“关闭”按钮与“发送”按钮需设为不可用。在OnInitDialog函数中添加以下代码:

GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(FALSE);//关闭按钮设为不可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(FALSE);//发送按钮设为不可用

五、实验结果

对话框1 运行结果如下:

对话框2 运行结果如下:

六、实验心得

通过课上的学习,我学习到了数据通信的基础知识,对网络的分层结构以及相关协议有了进一步的认识。

通过本次实验,我对串口通信的原理有了更深的认识与理解,并对MFC界面制作更加熟练。总之,在本课程中我收获很多,不仅在通信方面的知识有所提升,同时也锻炼了编程能力,VC++软件的使用更加熟练。

第五篇:LED闪烁试验5个例程专题

1-----------------------------/************************************************************************************* * LED闪烁的简单试验

*

*

*

* *

延时实现p2口LED流水灯效果(用循环移位指令)

* * 连接方法: JP11(P2)和JP1(LED灯)用8PIN排线连接起来

*************************************************************************************/ #include

//此文件中定义了51的一些特殊功能寄存器 #include

voiddelayms(unsigned char ms)// 延时子程序 {

}

main(){ unsigned char LED;

unsigned char i;while(ms--){ } for(i = 0;i < 120;i++);

LED = 0xfe;while(1){ P2 = LED;

//0xfe = 1111 1110 delayms(250);LED = LED << 1;

//循环右移1位,点亮下一个LED “<<”为左移位

if(LED == 0x00)

} }

{LED = 0xfe;} // 0xfe = 1111 1110

---2----------------------------

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

LED闪烁的简单试验

*

连接方法: JP11(P2)和JP1用8PIN排线连接起来

* *

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

#include

//此文件中定义了51的一些特殊功能寄存器

void delay(unsigned int i);//声明延时函数

main(){

P2 = 0x00;//置P0口为低电平

delay(600);// 调用延时程序

P2 = 0xff;//置P0口为高电平

delay(600);// 调用延时程序

*

* }

/*******延时函数*************/ void delay(unsigned int i){ unsigned char j;

for(i;i > 0;i--)

//循环 600*255 次

for(j = 255;j > 0;j--);}

-3------------------------------/*******************************************************************************;

二进制加法试验

*;p2口八个灯作二进制加法。理解二进值的计算

*;硬件连接:p2口8路指示灯

;

;* 描述:

;

p2口八个灯作二进制加法。理解二进值的计算

;* 连接方法: JP11(P2)和JP1(LED灯)用8PIN排线连接起来

************************************************************************************/ #include void delay(unsigned int i);//声明延时函数

main(){

unsigned char Num = 0xff;while(1)

{P2 =Num;

delay(1000);

//延时函数

Num--;

}

*

*

*

*

*

}

/*******延时函数*************/ void delay(unsigned int i){ unsigned char j;for(i;i > 0;i--)for(j = 255;j > 0;j--);}

-4-----------------------------

/******************************************************************************* * 描述:

跑马灯程序

* 连接方法: JP11(P2)和JP1(LED灯)用8PIN排线连接起来 *

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

#include #include

/***************************************************************************** * 延时子程序

*

******************************************************************************/ voiddelayms(unsigned char ms){ unsigned char i;while(ms--){ for(i = 0;i < 120;i++);

*

*

*

* *

} } /***************************************************************************** * 主程序

*

*

* ******************************************************************************/ main(){

}

unsigned char LED;LED = 0xfe;P2 = LED;while(1){ delayms(250);LED = _crol_(LED,1);P2 = LED;}

//循环右移1位,点亮下一个LED 此函数位库函数

--5----------------------------/********************************************************************************;

跑马灯实验

;

延时实现LED流水灯效果

p2口八个灯作跑马灯。采用了寄存器存中间数;

连接方法: JP11(P2)和JP1(LED灯)用8PIN排线连接起来

;********************************************************************************/

#include void delay(unsigned int i);//声明延时函数 char LED;main(){

unsigned char i;

while(1)

{ LED = 0xfe;

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

{

*

*

*

P2 = LED;delay(500);

LED = LED << 1;

// 左移

LED = LED | 0x01;// 移位后,后面的位为高电平

if(LED == 0x7f)break;//提前退出 FOR 循环

}

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

{

P2 = LED;delay(500);

LED = LED >> 1;// 右移

LED = LED | 0x80;// 移位后,后面的位为高电平

}

}

}

/*******延时函数*************/ void delay(unsigned int i){ unsigned char j;for(i;i > 0;i--)for(j = 255;j > 0;j--);

下载MC9S12XS128 串口操作例程word格式文档
下载MC9S12XS128 串口操作例程.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    串口通讯的工作方式

    串口通讯的工作方式 由于 CPU 与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有 " 接收移位寄存器 " (串→并)和 " 发送移位寄存器 " (并→串).......

    单片机串口通信方式总结

    IIC总线通信协议————数据传输高位在前p233 1,起始和停止条件 开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。 void start() // 开始位 { SDA = 1; //SDA初始化......

    arduino mega 2560 串口[推荐阅读]

    arduino mega 2560 串口 2560的串口一共有4个,分别对应数字接口0-1,18-19,16-17,14-15所有串口都可以跟pc通信,但只有0-1是跟板子上的usb2ttl连接,只有0-1是可以用来下载程序的......

    串口通信实验报告[共5篇]

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

    嵌入式串口和网络编程实验报告

    嵌入式实验报告 题目:linux串口和网络编程 一、实验目的: 1、强化本学期所学的相关的内容。 2、掌握串口相关设置。 3、强化基于TCP网络传输的三次握手。 4、自学Linux......

    linux串口触摸屏设计总结

    Linux serial touch 设计总结 概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了......

    RS232串口通信原理简介

    串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口......

    SimpleApp例程中两种绑定机制程序流程

    SimpleApp例程中两种绑定机制程序流程 我使用的协议栈版本及例子信息: ZigBee2006ZStack-1.4.3-1.2.1个人注释版_5.24ProjectszstackSamplesSimpleAppCC2430DB 建立......