我用的是stc89c52的单片机
自己用vb做一个发送数据的程序,单片机接收。
我想要的结果是:vb发200过来,单片机用全局变量comflag记录下来
然后等待1秒,vb再发0-3的某个数字,单片机先判断comflag的值,如果是200则
将第二次收到的数字赋给全局变量n
现在很奇怪的是,用串口调试助手,这个没问题,可是,用我自己写的vb程序就不行,但奇怪的是,vb发的数,单片机全能收到,,,,就是不进入下面的判断,,,,
vb代码:
Private Sub Command1_Click()
'...发送数据
If MSComm1.PortOpen = False Then
MsgBox ("串口没有打开!")
Else
Dim Num As Integer
Dim outbte(0) As Byte
Num = Val(200)
outbte(0) = CByte(Num)
'----------发送识别码------------------
MSComm1.OutBufferCount = 0 '...清空输出寄存器
Dim ByteArray() As Byte
'定义动态数组
ReDim ByteArray(1)
'重定义数组大小
ByteArray(0) = 0
ByteArray(1) = CByte(Num)
MSComm1.Output = ByteArray
Sleep 1000 '............延时50ms
'-----------发送器件编码---------------
MSComm1.OutBufferCount = 0 '...清空输出寄存器
'定义动态数组
ReDim ByteArray(1)
'重定义数组大小
ByteArray(0) = 0
Num = Val(Text5.Text)
ByteArray(1) = CByte(Num)
MSComm1.Output = ByteArray
'MSComm1.Output = &H0 '...发送数据
End If
End Sub
单片机代码:
#include<reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
int n=0,TH,TL;
void send_char(uchar txd) //串口传出一// 传送一个字符
{
ES=0;
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0;
ES=1; // 清除数据传送标志
}
void main()
{
TMOD = 0x20;// 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON = 0x00;
EA=1;
ES=1;
TR1 = 1; // 启动定时器1
while(1)
{
P2=n;
}
}
/////////////////串行口中断///////////////////////////////////
void fun_Uart() interrupt 4 using 1
{
int receive;
static int comflag;
ES=0;
while(RI==0); //读串口数据
RI=0;
receive=SBUF;
P1=SBUF;
if(receive>=200)
comflag=receive;
else
{
// P0=receive;
if(comflag==200)
{
n=receive;
comflag=0;
}
/* if(comflag==201)
{
TH=SBUF;
P1=TH;
comflag=0;
}
if(comflag==202)
{
TL=SBUF;
P1=TL;
comflag=0;
}*/
}
ES=1;
} |