用的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();
}
用查询的方式来发送,没有用什么队列。