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

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

  
楼 主:clair 2002年9月28日14:34
 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 标志位来处理,效果都是差不多的。
    我不知道问题出在哪里,请高手赐教!

  
2楼:hyhmh 2002年9月28日17:50
 首先串口通讯与主板的级别没有多大的关系

主要是你设计的电路板上的硬件和软件问题。
硬件方面:采用485总线一般芯片都建议终端接1个终端负载(电阻,通常120或其它,芯片说明
书上有说)。
软件方面:由于89C52接收与发送共用中断响量,接收程序必须尽量短,由于采用C语言无法看出
原代码长度。建议将晶振提高一点,试试。
  
3楼:clair 2002年9月29日11:16
 还有其他原因吗?
硬件方面好象没有问题,那个120的电阻肯定是要加的.
接收程序应当说比较短了,而且在中断里只是缓存及置位的操作.
目前用的是11.0592的晶振,和那块原板一样.
晶振最大可加到多少?
  
4楼:xujunchen 2002年9月28日21:14
 是单片机方问题
从以上现象看,是单片机的数据接收处理软件有问题。建议
1。接收用中断获得数据并缓存,确保不丢失。
2。命令分析程序要严密。
  
5楼:clair 2002年9月29日11:21
 我也觉得是接收处理的问题
我的缓存和命令分析程序应算严密,而且已试过各种方法,甚至用到了流水账方式逐字分
析,可还是不行。你处可有好的接收例程让我参考一下?非常感谢!
  
6楼:crackpot 2002年9月29日09:44
 可以先测试
首先提高波特率。
其次,你可以先做一些测试程序运行,还有就是你的程序结构是不是合理。

>>>>>>对该主题发表你的看法

本主题贴数6,分页: [第1页]


[上一篇主题]:AVR单片机:求教关于并口高速下载电缆问题

[下一篇主题]:硬件:咨询芯片