导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:高手请进:关于PC与单片机通讯的一些问题

* 11636: C51编程:高手请进:关于PC与单片机通讯的一些问题

   clair 
clair发表的帖子 

 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

  
回复该帖

本主题共有 6 帖,分页:>>>>>该主题的所有内容[6]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  11659.[详细]首先串口通讯与主板的级别没有多大的关系
摘要: 主要是你设计的电路板上的硬件和软件问题。 硬件方面:采用485总线一般芯片都建议终端接1个终端负载(电阻,通常120或其它,芯片说明 书上有说)。 软件方面:由于89C52接收与发送共用中断响量,接......(141字)
- [hyhmh][1062次] 2002年9月28日

  11686.[详细]还有其他原因吗?
摘要:硬件方面好象没有问题,那个120的电阻肯定是要加的. 接收程序应当说比较短了,而且在中断里只是缓存及置位的操作. 目前用的是11.0592的晶振,和那块原板一样. 晶振最大可加到多少?......(92字)
- [clair][1003次] 2002年9月29日

  11664.[详细]是单片机方问题
摘要:从以上现象看,是单片机的数据接收处理软件有问题。建议 1。接收用中断获得数据并缓存,确保不丢失。 2。命令分析程序要严密。......(61字)
- [xujunchen][994次] 2002年9月28日

[上一篇帖子]:AVR单片机:求教关于并口高速下载电缆问题近期购进ISP并口高速下载电缆一套,写入程序报错,连线如下
[下一篇帖子]:硬件:咨询芯片请各位指教:      &n