Delphi7与51单片机多机通信

来源:互联网 发布:淘宝网页版登录电脑版 编辑:程序博客网 时间:2024/06/05 20:51

用的APRO的串口控件

51串口在模式3下,

PC:

发送地址的时候aprocom.Parity:=pMark;

发送数据的时候aprocom.Parity:=pSpace;

51:

发送给PC的时候不管TB8是什么值都可以接收到的


51的程序都是用small rtos写的:

用的89s52有T2

     //系统节拍中断使用定时器2,中断频率为250Hz
    RCAP2H = (65536 - (11059200 / 12) / 250) / 256;
    RCAP2L = (65536 - (11059200 / 12) / 250) % 256;
    TH2 = (65536 - (11059200 / 12) / 250) / 256;
    TL2 = (65536 - (11059200 / 12) / 250) % 256;

在init过程中有上面一段  RCAP2H 用来对TH2进行自动填充,在中断的时候不需要自己来添写

中断是多少HZ下面的数字就是多少,感觉这个和

OS_TICKS_PER_SEC    250  

TICK_TIMER_SHARING 为1,则一次中断就产生一个时钟节拍;

OS_TICKS_PER_SEC为250正好是1s


os_cpu.c的时间中断中看到

#if TICK_TIMER_SHARING >1
    TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
    if (TickSum != 0)
    {
        return;
    }
#endif

    OS_INT_ENTER();                                     /* 中断开始处理                                    */

#if EN_TIMER_SHARING > 0
    OSTimeTick();                                       /* 调用系统时钟处理函数                            */

也就是说TICK_TIMER_SHARING>1的情况下  OSTimeTick的调用周期随其改变



在comm接收的时候,根据上一篇多机通信的的内容

从机接收部分修改成下面的样子 

if (RI == 1)
    {
        RI = 0;
if (RB8 == 1)       //接收到地址
{
RB8=0;
if (address==SBUF) //如果是本机地址或者是广播地址 就开接收中断
{
SM2=0;
}
else
{
SM2=1;
}
}
else
{
#if EN_OS_Q_POST > 0
       OSQPost(SerialInData,SBUF);
#endif
#if EN_OS_Q_POST_FRONT > 0
       OSQPostFront(SerialInData,SBUF);
#endif
}

发送的时候:

在SCON=0x50的时候直接用他例子程序中的PutChar就可以发送,很正常。

但是如果设置了TB8,也许是我程序没写好发送的数据有问题。


所以自己写了个PutAdd,和PutData

void PutAdd(uint8 adata)
{
OS_ENTER_CRITICAL();


TB8=1;
SBUF=adata;
while(!TI);
TI=0;


OS_EXIT_CRITICAL();
}
void PutData(uint8 adata)
{
OS_ENTER_CRITICAL();


TB8=0;
SBUF=adata;
while(!TI);
TI=0;


OS_EXIT_CRITICAL();
}

用查询的方式来发送,没有用什么队列。