首页 | 供应信息 | 采购信息 | PDF资料 | 技术资料 | 行业资讯 | 产品展示 | 人才市场 进入会员区
   技术文章分类:单片机/DSP 嵌入式系统 测试仪表 电源技术 接口电路 存储器 传感与控制 通信网络 无线通信 模拟技术 显示与光电 EDA/PLD 汽车电子 消费电子 电子综合
   电子综合工具:PDF资料大全 电子缩略语 IC型号替换 IC厂家 电子电路图 技术参数 设计应用 解决方案
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
  您所在的位置: IC37首页 > 技术问答 > 单片机 > 看一段关于通讯的程序

  看一段关于通讯的程序 

voidPcSerialSendPrg(UINT16 Cmd,UINT8 Len,UINT8 *Buf)

{

UINT8 i;

//在上次发送未完成前等待发送结束

ComTransFrame.SOF=SLAVE_ANSWER_HEAD;

ComTransFrame.AddrH=MachineType;

ComTransFrame.AddrL=MachineSelfNum;

ComTransFrame.CmdH=Cmd>>8;

ComTransFrame.CmdL=Cmd;

//ComTransFrame.LenthH=Len>>8;

//ComTransFrame.LenthL=(UINT8)Len;

ComTransFrame.LenthH=0;

ComTransFrame.LenthL=Len;

for (i=0;i<Len;i++)

{

ComTransFrame.DBuf[i]=Buf[i];

}

ComTransFrame.CRC=0;

#ifQuerySerialSend

ES=0;RI=0;TI=0;

for (i=0;i<Len+7;i++)

{

SBUF=*((UINT8 *)&ComTransFrame+i);

ComTransFrame.CRC += *((UINT8 *)&ComTransFrame+i);

while(!TI);TI=0;

}

SBUF=ComTransFrame.CRC;

while(!TI);TI=0;

#endif

UartSendDataNum=0;

ES=1;

EA=1;

}


作者:nanfang8  2008-1-23 16:31:00

  回复1  仍然167496

这一段是如何发送的我没有看懂,请教各位帮忙解释一下

*((UINT8 *)&ComTransFrame+i);

*((UINT8 *)这是什么用法

for (i=0;i<Len+7;i++)这个为什么LEN后面加7

有看懂这一段程序的 吗


作者:nanfang8  2008-1-23 16:36:00

  回复2  gg167497

这里用的是结构语法

那结构又是如何发送数据的 呢


作者:nanfang8  2008-1-23 16:41:00

  回复3  随便说说167498

*((UINT8 *)是强制数据转换,这里 ComTransFrame 没有给出定义

应该是一个结构体变量吧.

一般来说,这个结构是用来强制访问结构体或者数组里面的一个

8位的元素(因为用 UINT8 强制指定了)

结构体可以通过指针传递,你的例子里面貌似是全局变量吧

随便想用就用.....


作者:etual  2008-1-23 16:49:00

  回复4  不知道`167499

看了下```感觉就是大一时候学的那C语言的程序```但是你那程序感觉又不是象那么回事


作者:windymeng  2008-1-23 18:44:00

  回复5  程序结构太差167500

这是一个用双字节命令发送指定长字符串的一协议帧的例子

只是程序结构太差,在发送数据期间,无法做其他事,如果USB来数据来怎么办,每隔10毫秒要做的事来了怎么办,其他中断来了怎么办

这种程序应该是目前广大工程师的弊病。

如果大家要一个好的例子,我可以发一个过来:

voidInit_UART0(void)

{

SCON0=0x010;//RECIEVE ENABLE

PCON=0x080;//SMOD=1

//;定时器0=方式1,定时器1=方式2(自动重装入8位计数器,波特率发生器)

TMOD=0x21;//TIMER0 MODE=1,TIMER1 MODE=2, 8 BIT COUNTER

TCON=0x00;

UART0_SetBaud(UART0_BAUD);

TI0=0;//CLEARFLAG

RI0=0;//CLEARFLAG

ET0=0;//CLOSETIMER0 INT

ET1=0;//CLOSETIMER1 INT

TR0=0;//CLOSETIMER0

TR1=1;//OPENTIMER1

ES0=1;//OPENCOMMINT

}

//设置波特率,用于动态波特率自适应的

//-------------------------------------------------------------------------------

void UART0_SetBaud(unsigned char BaudIndex)

{

// at sysclk=12Mhz

switch (BaudIndex)

{

case 0:

TH1=0x98;//1200BIT/S,atSYSCLK/48

CKCON=(CKCON & 0xFC)|0x02;

break;

case 1:

TH1=0x30;//2400BIT/S,atSYSCLK/12

CKCON=CKCON & 0xFC;

break;

case 2:

TH1=0x98;//4800BIT/S,atSYSCLK/12

CKCON=CKCON & 0xFC;

break;

case 3:

TH1=0xCC;//9600BIT/S,atSYSCLK/12

CKCON=CKCON & 0xFC;

break;

case 4:

TH1=0xE6;//19200BIT/S,atSYSCLK/12

CKCON=CKCON & 0xFC;

break;

case 5:

TH1=0x98;//28800BIT/S,atSYSCLK/4

CKCON=(CKCON & 0xFC) | 0x01;

break;

case 6:

TH1=0xCC;//57600BIT/S,atSYSCLK/4

CKCON=(CKCON & 0xFC) | 0x01;

break;

case 7:

TH1=0xE6;//115200BIT/S,at SYSCLK/4

CKCON=(CKCON & 0xFC) | 0x01;

break;

default:

TH1=0xCC;//9600BIT/s

break;

}

}

//中断函数

void UART0_ISR(void) interrupt VECTOR_UART0

{

if (RI0) UART0_Read();

if (TI0) UART0_Write();

}

//中断读取,先入缓冲,再作具体处理,处理时间不要太长,

//以便接收下一个字节,如果太长,置标志在主程序处理。

void UART0_Read(void)

{

RI0=0;

UART0_RBUF_Index=(UART0_RBUF_Index+1) % UART0_RBUF_Size;

UART0_RBUF[UART0_RBUF_Index]=SBUF0;

if(UART0_RBUF_Count<UART0_RBUF_Size) UART0_RBUF_Count++;

//to control

UART0_Received=1;

IntEvent_On=1;

}

//中断发送

void UART0_Write(void)

{

TI0=0;

UART0_Write_Char_On=0;

if(!UART0_Send_On)return;

if (UART0_TBUF_Count>0)

{

UART0_TBUF_Count-=1;

SBUF0=UART0_TBUF[ ((UART0_TBUF_Index-UART0_TBUF_Count+UART0_TBUF_Size)%UART0_TBUF_Size)];

UART0_Write_Char_On=1;//after update sbuf0

}

else

{

UART0_Send_On=0;

}

}

void UART0_WaitSend(void)

{

while (UART0_Send_On);

}

//发射一个字节,不用等待,后台发送

void UART0_Send_Char(unsigned char c)

{

#ifdef MD5_Encode_On

if (MD5_OK_On)

{

c ^= MD5_Encode_Char;

}

#endif

while(UART0_TBUF_Count>=UART0_TBUF_Size);

UART0_Send_On=0;

UART0_TBUF_Index=(UART0_TBUF_Index+1) % UART0_TBUF_Size;

UART0_TBUF[UART0_TBUF_Index]=c;

UART0_TBUF_Count++;

UART0_Send_On=1;

if(!UART0_Write_Char_On) TI0=1;

}

//发送数据包

void UART0_Send_String(unsigned char *s,unsigned char len)

{

unsigned char i;

for (i=0;i<len;i++)

UART0_Send_Char (s[i]);

}

通过以上函数加上适当定义即可以很方便地完成串行通信。且不影响主程序哟!

QQ:184324486

手机:13527614127


作者:ldy216  2008-1-24 10:59:00


我要投稿 注册会员
客服咨询热线:0755-26000950 0755-26007355
 相关技术问答
·请大侠推荐一款c8051  2008-1-22
·串口接受的疑问??  2008-1-22
·步进电机四个线圈  2008-1-22
·那位能提供一个类似8550..  2008-1-22
·请教51的/PSEN信号的..  2008-1-22
·带关断功能的LDO会不会贵..  2008-1-22
·关于双电源上电和掉电次序的..  2008-1-23
·关于keil 编译的问题  2008-1-23
·LDO应用问题  2008-1-23
·程序代码  2008-1-23
·上电迅间误操作问题  2008-1-23
·请教问题  2008-1-23
·下面这个函数的功能是给结构..  2008-1-23
·请教一个串口波特率的问题  2008-1-23
·XD们谁用过4V左右的电压..  2008-1-23
·请教I2C多个从设备读写。..  2008-1-23
·帮忙看看这个烂定时器  2008-1-24
·欢迎大家进行程序结构的讨论  2008-1-24
·大家了解NEC单片机吗?请..  2008-1-24
·一个700行代码完成的Jp..  2008-1-24
·请教一个电压比较器的问题!  2008-1-24
·想选个MCU做电表,朋友说..  2008-1-24
 
 热门IC
ERJ14  BZM55C3V3-TR  P2103UC  P1553UB  NJM2336BF1-TE1  PI5V330WEX  QK016LH4  QK016LH6  R1160N181B-TR  RLZ12C  S-75V32ANC-5V4-T2  AD548JRZ  LD2980ABM36TR  IXFH22N50  IRLMS1902  MIC5207-3.6BM5  UPD311C  4370H5-DB  HI5741B1B  HM1-6514C-9  MC33372T  LC4256V  AMT9501-B  MC100EP16DT  MC100EPT25DT  MC10EP58DTG  M52054  M66240  M5M23160-112FP  KIA7283AP  TC4081B  SPX1117R-L-1.8  PCM2707PJT  MT8105GE  OLIVETTI  QK025K6  PLVA2662A  P2703UC  TPD1036F  SK008L  SI6968BEDQ-T1  HT9032  STF202-22  TS272  ZC444314CFN3  HEL22L  HEF4008BD  TMP47C410AF6087  P87C51SPN  SSM2165-IP