C51编程:高手请进:关于PC与单片机通讯的一些问题
近日在作一解码板的开发,主要是模仿国外的板子重做自己的,芯片采用89C51,通讯协议
已经入手。调试时由PC端程序(用VB自编)发送指令,C51接收指令判断后处理。
指令格式:每条指令为七个字节,起始字节为0xff;
指令流程:PC COM1口 --> RS232/RS485转换器 --> MAX1483+AT89C51
目前问题:VB发送指令,那块原装的板子可以正常接收并处理;而用我的板子和程序接收时
必须在VB发送端作附加处理:每两个字节中加入延时。延时的时间和波特率成反比。在波特
率2400时,须加入延时空循环250000次;波特率9600时,空循环100000次。我的机器配置是
赛扬1.7GHz,如果换台主频慢的如赛扬300的话,可能只要空循环50000次就够了。
以下是VB程序中用来测试的单击事件:在测试原装板时 i 和 j 等于 0 即可
If Button = vbLeftButton Then
Dim i, j As Double
i = 250000 'i和j用来控制空循环的次数
j = 250000 '也是延时程序Delay的入口参数
'由于要发送大于&H80的字节,所以定义了这么多单字节数组
Dim da001(1 To 1) As Byte
Dim da002(1 To 1) As Byte
Dim da003(1 To 1) As Byte
Dim da004(1 To 1) As Byte
Dim da005(1 To 1) As Byte
Dim da006(1 To 1) As Byte
Dim da007(1 To 1) As Byte
da001(1) = &HFF
da002(1) = &H10
da003(1) = &H0
da004(1) = &H80
da005(1) = &HA3
da006(1) = &H0
da007(1) = &H0
MSComm1.OutBufferCount = 0
Delay i
MSComm1.Output = da001
Delay i
MSComm1.Output = da002
Delay i
MSComm1.Output = da003
Delay i
MSComm1.Output = da004
Delay i
MSComm1.Output = da005
Delay i
MSComm1.Output = da006
Delay i
MSComm1.Output = da007
Delay j
End If
估计问题出在接收端,来看看我的程序:
SCON = 0xd0;波特率:2400
......
#define CODE_NUM 7 /* 指令字节数: 7 */
bit beFullRBuffer; /* 接收缓冲区标志:1(缓冲区满)、0(缓冲区未
满) */
bit bePassing; /* 指令判断标志:1(起始指令是 FF,正确)、0(指令不正
确) */
unsigned char ucRBuffer[CODE_NUM]; /* 接收缓冲区 */
unsigned char ucRBufferPt; /* 接收缓冲区指针 */
......
/* 中断处理:串行口 */
void serial() interrupt 4 using 2
{
Watchdog();
if (RI && !beFullRBuffer)
{
RI = 0;
if (SBUF == 0xff || bePassing)
{
bePassing = 1;
ucRBuffer[ucRBufferPt++] = SBUF;
if (ucRBufferPt == CODE_NUM)
{
ucRBufferPt = 0;
beFullRBuffer = 1;
bePassing = 0;
}
}
else
{
ucRBufferPt = 0;
beFullRBuffer = 0;
}
}
}
......
这个接收的例程应当是很经典的了。缓冲区满后的处理原本也放在中断中,后来又拿出
去放到了外部大循环中依靠判断 beFullRBuffer 标志位来处理,效果都是差不多的。
我不知道问题出在哪里,请高手赐教!
发表时间:2002年9月28日14:34:00