历史上的今天
今天是:2025年01月08日(星期三)
2018年01月08日 | 多机通信的主机部分程序
2018-01-08 来源:eefocus
多机通信的主机部分程序
/* multi_m.c */
/* 多机通信的主机部分 */
#ifndef __MULTI_M_C__
#define __MULTI_M_C__
#include
#include
#define __MAX_LEN_ 64 // 数据最大长度
#define _MHz_ 11 // 设置 单片机 使用的晶振频率(11.0592MHz)
/* 以下为程序协议中使用的握手信号 */
#define __SUCC_ 0x0f // 数据传送成功
#define __ERR_ 0xf0 // 数据传送错误
void init_serial(); // 串口初始化
void send_data(unsigned char *buf); // 发送数据
void delay10ms(unsigned int count); // 延时子程序(10ms)
void main()
{
char buf[__MAX_LEN_];
unsigned char i = 0;
unsigned char tmp;
unsigned char addr; // 该字节用于保存要通信的从机地址
/* 为缓冲区赋初值 */
P0 = 0xff;
while(P1 != 0) // 每隔100ms从P0口读取,若读取到0则表明数据采集结束
{
*(buf+i) = P0;
delay10ms(10); // 延时100ms
P0 = 0xff;
i++;
}
*(buf+i) = 0; // 缓冲区最后一个字节为0表示数据结束
/* 读要访问的分机地址 */
P0 = 0xff;
addr = P0;
/* 串口初始化 */
init_serial(); // 初始化串口
EA = 0; // 关闭所有中断
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
tmp = addr-1;
while(tmp != addr)
{
/* 发送从机地址 */
TI = 0;
TB8 = 1; // 发送地址帧
SBUF = addr;
while(!TI);
TI = 0;
/* 接收从机应答 */
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
}
/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据 */
tmp = __ERR_;
while(tmp != __SUCC_)
{
send_data(buf); // 发送数据
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
}
while(1); // 程序结束,进入死循环
}
/* 初始化串口 */
void init_serial()
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 250; // 设置初值
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收
}
/* 发送数据 */
void send_data(unsigned char *buf)
{
unsigned char len; // 保存数据长度
unsigned char ecc; // 保存校验字节
len = strlen(buf); // 计算要发送数据的长度
ecc = len; // 开始进行校验字节计算
/* 发送数据长度 */
TI = 0;
TB8 = 0; // 发送数据帧
SBUF = len; // 发送长度
while(!TI);
TI = 0;
/* 发送数据 */
for(i=0; i
ecc = ecc^(*buf); // 计算校验字节
TB8 = 0; // 发送数据帧
SBUF = *buf; // 发送数据
buf++;
while(!TI);
TI = 0;
}
/* 发送校验字节 */
TB8 = 0; // 发送数据帧
SBUF = ecc; // 发送校验字节
while(!TI);
TI = 0;
}
/* 延时10ms,精度较低,参数count为延时时间 */
void delay10ms(unsigned int count)
{
unsigned int i, k;
unsigned char j;
unsigned int tmp;
tmp = (int)((100*_MHZ_)/12);
for(i=0; i
for(k=0; k
#endif
上一篇:多机通信的从机程序
下一篇:单片机双机点对点通信的主机程序
史海拾趣
|
最近在用Cyclone III FPGA Development Kit 这个板子在调Simple Socket Sever这个例程,但是好多天了一直不能调通,网线没有问题,IP设置也没有问题,程序运行显示初始化也成功了,但是一直ping 不通 。希望有经验的朋友能给予一些指点,先谢谢了! ...… 查看全部问答> |
|
VS2005+CE60下调试程序怎么不能直接下载到NANDFLASH里面去(EVC+CE50可以)?必须加CSIDL_XXX这样的前缀?NANDFLASH这样加 VS2005+CE60下调试程序怎么不能直接下载到NANDFLASH里面去(EVC+CE50可以)?必须加CSIDL_XXX这样的前缀?NANDFLASH这样加前缀还是不行啊。… 查看全部问答> |
|
不知道有人用过PLC没有,这是我们开发的一个梯形图逻辑到C语言的转换器,对于一些纯粹的位逻辑控制算法,可能有些帮助。同时,网站上也有一些PLC的使用教程和开发资料,希望对大家有用。 项目介绍[http://www ...… 查看全部问答> |
|
目前用dm9000网卡做视频传输,遇到如下情况: 视频带宽30kb/s,发现传输一会后网卡就断网了,以后就连接不上了,除非硬件重启后才能恢复。 换用usb无线网卡没有出现这个问题,而且效果很好。 因此断定是dm9000网卡驱动的问题,请问是什么原因,是 ...… 查看全部问答> |
|
已知连续内存中分别存放的是几个不同的变量值,这些变量值时刻变化,如何将这些变量值读取出来呢?写到*.txt文件中。 如x存放在内存地址为0x08000002中,y在0x08000004中,z在0x08000006中,如何将x,y,z保存到test.txt文件中。… 查看全部问答> |
|
大家好,我在使用tornado 2.2帮助时遇到了一个问题,想请教一下。 我在tornado界面下选择菜单“Help”—— >“Manuals index”,出现“Tornado online manuals”界面,在其tag上选择“Index”,输入要查找的内容“tffsDrv”,然后按下“Display” ...… 查看全部问答> |
|
转载自网络,作者不详。 我常年担任多个有关FPGA学习研讨的QQ群管理员,长期以来很多新入群的菜鸟们总是在重复的 问一些非常简单但是又让新手困惑不解的问题。作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的 ...… 查看全部问答> |
|
请教各位大侠,我的精密整流电路输出正负不对称, 当输入1V时,输约1.5V, 输入2V, 输出约为2.5V.输入负电压时, 输出与输入相等. 运放用的是 ADTL082A, 正负15V 二极管 SK101AW 不好意思, 图怎么贴不上去呀.… 查看全部问答> |
|
本文转引自 飞凌嵌入式 OK6410资料专区 目前,ARM11开发板的开发学习教程逐渐丰富起来,但专门针对某块ARM11开发板的视频几乎没有。为了更好的让用户学会使用OK6410,我们准备了这套教学视频,力图使用户更快的入门,加快嵌入式学习 ...… 查看全部问答> |




