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();
}
用查询的方式来发送,没有用什么队列。
- Delphi7与51单片机多机通信
- 单片机与PC机通信
- 51 单片机的多机通信
- PC机与多个单片机间的通信
- 51单片机与6264通信探讨
- 51单片机与PC进行串口通信
- 51单片机与PC串口通信
- 51 单片机的串口通信与控制
- C#与51单片机串口通信
- PC 机与单片机通信(RS232 协议)
- 单片机与上位机通信元件
- 单片机与PC机通信USB2COM
- 单片机与PC机之间的通信
- VB/JAVA与单片机通信
- linux 与 单片机 串口通信
- 单片机-串口与PC通信
- 51单片机串口通信
- 51单片机串口通信
- LCD驱动中参数的设置
- 转---关于CGContext与2D绘图的说明
- C# 如何得到指定打印机的端口号
- cy7c68013 usb 开发经验
- UML里的状态图和活动图有什么区别啊?
- Delphi7与51单片机多机通信
- java中静态代码块的用法 static用法详解
- 这是一个失败率达到99%的行业
- json-default
- JS 创建多维数组
- C# 图片处理之:旋转图片任意角度
- 联想在服务器及存储领域与emc展开合作
- C#调用C++ DLL数据类型转换
- select case