微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PC与单片机RS-232串口的通讯和控制

PC与单片机RS-232串口的通讯和控制

时间:12-03 来源:互联网 点击:

要显示AT89S52发过来的数值,例如我发送65的值,文本框里就显示65,我发送255,文本框就显示255,这样我就能测试出用字符接收的方法能否将一个字节的值(0-255)都能正确接收和显示。我们把那句Text1.Text = Text1.Text + MSComm1.Input 。改成Text1.Text = Text1.Text + str(asc(MSComm1.Input )),就是把原先字符串变量MSComm1.Input先转换成ASCII值,再把这个值显示出来。改完了。我们运行下试试。


上图显示的确可以正确显示出数值,但这仅仅只是有相对应字符几个代码数值,我再来试试,非字符的ASCII值,看是否都能正确收到并显示。先修改AT89S52里我们原先发送的那些数组buf[ ]里的值,让它们部分不在字符范围里,看能不能正确接收到显示。我们将数组unsigned char buf[]={65,66,C,D,E,F};改写为既有字符也有非字符范围的数组unsigned char buf[]={0,1,2,D,254,255};


从上图来看,后两个数据显示不对,254没有显示出来,255显示为63,经过修改AT89S52程序,把0-255的数值都发送一遍,发现大于128的数值几乎都不能正确接收。所以,得出结论:以字符方式接收数值数据是不可行的!

如下图:

接下来我改变串口控件的InputMode属性,将它的值改为1,即用二进制读取来试试。但二进制方式怎么读取呢,看了很多资料,也试了很多次,终于弄明白了,原来先要定义一个字节型的可变数组,这样当接收到数据时把接收到的一个或多个数值的首地址变量Mscomm1.input赋给这个字节数组名。于是你就可以运用这个字节数组里的变量了。

我先在VB里修改串口控件的InputMode属性,如下图:

然后我要在VB程序里先定义一个单字节Byte类型的数组,将收到的数据变量(Mscomm1.Input)赋给inbuff这个数组名,程序修改如下图:

AT89S52里程序,基本不动,只是等待PC机发来请求字符“s”。收到请求后,发送0-255的全部数值。
修改的程序如下:

#include

void delay(void) //定义一个延时子程序
{
unsigned int i;
for (i=15535;i>0;i--);
}

void main(void)
{
unsigned char buf[]={3,4,5,D,255,253};//定义一个单字节数组
unsigned char i;
SCON=0x50; //串口方式1
TMOD=0x20; //定时器1,定时方式为2
PCON=0x80; //设定串口工作方式为1
TCON=0x40; //设定时器1开始计数
TH1=0xfd; //设定波特率为19200
TL1=0xfd; //
//TI=1;
TR1=1; //启动定时器
while(1)
{ if(RI==1) //如果接收到数据则进入以下操作
{if(SBUF==s) //如果收到的数据为“s”字符则进入发送操作
{for(i=0;i<255;i++)//循环发送出数,这里做为调试,我们先发0-255的数值。

{
SBUF=i; //向串口送出数据,这里不发buf [ ]数组的数据,而是直接发送循环体里的i 值(0-254)。
while(TI==0);
TI=0;
delay(); //调用延时
}

SBUF=255; //上面循环里没有包括255这个值,这里补发送一次

while(TI==0);
TI=0;
RI=0;//发送完毕将收到请求标志清0等待PC下次请求
}
}
}

}

显示结果如下:

这样,所有的数值都是可以正确接收并显示了。

结论:要接收数值数据,串口控件必须修改为二进制的接收属性。即:InputMode=1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top